スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
入門スレじゃいかんのか?
早速質問なのですが
#define size 1000000
typedef struct SELL{
int xp;
int yp;
}SELL;
void main(void){
SELL el[size];
}
見たいな事すると例えどんなにメインメモリが足りていたとしても動かないっぽいんですよ。
そこでmallocを使って必要な個数分だけメモリを確保したいと考えたのです。
構造体を
typedef struct SELL{
int xp;
int yp;
int *next_p;
}
見たいに変更してnext_pに次のSELLを確保するようにしたらいいのではないかと思いました。
と思ったのはいいのですが実際にどのように記述したらいいのか分かりません。
mallocに関してはまったくの初心者ですがどうかボクに教えてくださいご主人様!!
4 :
3:2006/12/30(土) 22:31:42
早く教えてくださいです。
5 :
3:2006/12/30(土) 22:32:48
早く教えてくださいです。
・・・。
早く・・・早くぅ・・・。
,ィ^i^iヽ
'´レ´ ̄ `ヽ
f iyl ノノノリ)))〉 / ̄ ̄ ̄ ̄ ̄
! iYl (i_[ [l |( |
i.lメjゝ" lフ/ ヽ < ご主人様。早く教えてくださいです。
,イノ/ヽゝ/}、ヾ i .|
fド〈 }jlー》 〉ノリ \_____
i水i/ / 〉、_|ヽ \ __
__ く_ゝ7i`ート、 くノ_ァ}
{i_ュノ゙// \
, '´,/ i __ヽ
/ /! ` ー-‐' , -‐〉
,' ,.-‐ ァ‐ -‐' \´
! ! / / | ヽ ヽ
i l ,' /! ! )ノ
ヽ^ , / .l l
/`f《 !‐il
ヽ ヽL `__、
C/C++の質問スレ多すぎ
C++の本を見ると、defineの代わりにconstを使えと書かれているのに、
コンパイラのヘッダファイルなどに大量のdefineが使われているのは何故ですか?
11 :
デフォルトの名無しさん:2006/12/31(日) 22:22:48
>>10 見〜た〜な〜
あれほど見ないでくださいと言いましたのに〜。
今あなたの後ろに立っています・・・。
フフフフフ・・・・・・。
12 :
デフォルトの名無しさん:2007/01/02(火) 09:44:52
C言語って何のヘッダもインクルードしなくても
printf()とか使えるじゃないですか。
それってコンパイラが暗黙の了解で何かしてるからなんですか?
>>12 ??
printfは定義しなきゃ使えないでしょ?
ヘッダファイルってのはその定義を収めているに過ぎない。
>>13 ところが"C言語"では宣言しなくても printf が使えるんだな。
未宣言の関数コールは暗黙で int を返す引数チェックなしの関数とされるのな。
"C++言語"だと文法エラーではじかれるが...
まぁあまりいい習慣でないことは確かだ。
16 :
13:2007/01/02(火) 15:13:33
>>15 ほんとだ。うちのgcc(cygwin)でも警告も出さずに通った。
これって処理系依存ではなく、Cの仕様?
だとしたら、今まで全然知らんかった。
>>10 教科書的にはどれもこれも手放しで const マンセーしてるけど
実用的には define のほうが都合がいい場面があるのは確か。
例えば
#ifndef hoge
#define hoge ...
#endif
みたいなことをしておけばソースコードを変更せずに
コンパイル時にマクロを指定して動作を変更できる。
>>17 それは正当な #define ディレクティブの使い方じゃない?
・defineの定数は、コンパイル時にリソースが無駄になる可能性がある (たぶんないけど)
・constの方が厳密な定義ができる。
ってことだと思うけど。
19 :
デフォルトの名無しさん:2007/01/03(水) 00:31:11
printfの書式に対するデータって数値でもアドレスでもどっちでもOK?
20 :
デフォルトの名無しさん:2007/01/03(水) 00:51:16
分かった
%dは数値だな
%Sはアドレス
か?
21 :
のいまんさん:2007/01/03(水) 01:30:05
MFCで画像をウインドウの右側に移動させたいんですけど、どういうコード書けば良いですかね?
char vp[sizeof(short)*10];
int i;
for(i=2;i<12;++i){
((short*)vp)[i-2]=i*i+i;
}
for(i=0;i<10;++i){
printf("((short*)vp)[%d] : %d\n",i,((short*)vp)[i]);
ポインタの粘土細工 by 冬房
#define BUFFER_SIZE 256
static void Write(const char* comment, ...)const{
char buf[BUFFER_SIZE];
va_list ap;
FILE* pFile;
va_start(ap, comment);
if(vsnprintf(buf, BUFFER_SIZE, comment, ap) < 0){
return;
}
va_end(ap);
pFile = fopen(LOG_FILE_NAME, "at");
fprintf(pFile, "%s\n", buf);
fclose(pFile);
}
こんなかんじのフォーマットを指定して書き込む関数があるのですが、
これをC++的に変更するとどうなるでしょう?
ofstreamを使うのかと思うのですが、引数リストの扱いがわからず困っています
>>23 C++使うならファイルの書き込みと、コメント生成部分は別クラスにするべき
すいません、上のはあくまで適当な例という事で。。。
質問の意図は「fopenと引数リストを使ったファイルへの書き込みを
C++チックに書くとどうなるのか?」ということなんです
曖昧な書き方をして申し訳ありません。
可変長引数の部分はC++でも同じ。
ファイル出力部分をofstreamにすればよいと思います。
>>25 つ「壊れていないものを直すな(弄るな)」
別になんか困ってることでもなきゃ無理に修正せんでもそのままでいんじゃね?
そうですか…特に困ってはいないのでファイル出力部分だけ書き換えることにします
>>26-27ありがとうございました
#include <fstream>
class Hoge {
public:
static std::ofstream Write;
};
static std::ofstream Hoge::Write(LOGFILE, std::ios::ate);
ateは追加出力を意味し、"a"相当、binaryを指定しなければテキストモードになる。textなどといった指定は無い。
前: Hoge::Write("Hoge: %d\n", 1);
後: Hoge::Write << "Hoge: " << 1 << std::endl;
30 :
15:2007/01/04(木) 18:59:12
>>16 C言語の仕様。
ただ宣言はみんな明示的にしようということでC++では禁止になった。
31 :
デフォルトの名無しさん:2007/01/05(金) 17:32:37
>>30 C++はCのスーパーセットだから、やっぱりOKなのですか?
単に拡張しただけであってスーパーセットではない。
31には30の3行目が見えないのだろうか。
34 :
デフォルトの名無しさん:2007/01/05(金) 18:20:51
このまえC++のスレで15が嵐をしていたので、あぼーんせっていしてあります
35 :
デフォルトの名無しさん:2007/01/05(金) 19:15:16
先生に聞けばいいんじゃないかな
37 :
デフォルトの名無しさん:2007/01/05(金) 20:02:45
>>36 冬休みは、あと三日です。
ちなみに、nwg.hというのは標準では入ってないんですよね?
標準では無いと思うよ。
nwg.hって先生自作のファイルでしょ?
持ってないなら無理でしょ。
サンプルなんか放っておいて課題やれば?
39 :
デフォルトの名無しさん:2007/01/05(金) 20:35:47
Cで√の入った計算式立てるときってどうしたらいいの?
>>40 √2
とかはどうやって扱ったらいいですか?
>>41 double sqr2 = sqrt( 2.0f );
43 :
デフォルトの名無しさん:2007/01/05(金) 21:10:39
>>42 ありがとうございます。
それヒントにがんばってみます
44 :
ただ:2007/01/05(金) 21:20:36
Visual C++6.0 でアクセスに接続する方法が載っているサイトを教えてください。お願いします。
47 :
デフォルトの名無しさん:2007/01/06(土) 11:37:47
exp(ix)を取り扱いたいんだけど、虚数単位を定義して〜てのはできないの?
いちいちsin,cosで書かなきゃ行けないの?
48 :
デフォルトの名無しさん:2007/01/06(土) 11:41:18
49 :
デフォルトの名無しさん:2007/01/06(土) 11:44:22
連レスすまない。
最初の疑問はComplex環境下でexp(0,3)とすればexp3iになるのかな?
50 :
デフォルトの名無しさん:2007/01/06(土) 13:40:43
>49
complex<double> A(0,3)
exp(A)
でおk。
51 :
デフォルトの名無しさん:2007/01/06(土) 14:27:28
こんにちは。
フラグ処理のコードを書いています。
wire_ack_acquirememt_bus[object_numb][wire_wsr_num]
はwire_wsr_num行の中で一つだけアサートすることになっています。
ack_sender = flag_pick(wire_ack_acquirememt_bus[object_numb][wire_wsr_num], 1, SEND_ON_BUS);
で送信者がアサートさせているフラグを拾い、列番号object_numbをピックアップします。
後半コードでその列から若い列、古い列へフラグを埋めていきます(flag_fill(fill_data, fill_target, fill_width, fill_start_bit))。
VC++8でトレースして追ってみているのですが、挙動がおかしく、その問題点を探しているのですが、私には見つけることが出来ませんでした。
flag_pick()、flag_fill()も公開する必要があると思いますが、まずは下記のコードで分かることを教えていただけないでしょうか。
ff_event_check()はソースのアサートとネゲートイベントで1を返し続けます。
52 :
デフォルトの名無しさん:2007/01/06(土) 14:28:37
>>51 /* ACKNOWLEDGE for ACQUIREMENT*/
i = 0;
sender_no_ack_acq_bus[wire_wsr_num] = 0;
for (wire_wsr_num=0; wire_wsr_num<WSRF_SIZE; wire_wsr_num++)
{
prev_sender_no_ack_acq_bus[wire_wsr_num] = sender_no_ack_acq_bus[wire_wsr_num];
for (object_numb=0; object_numb<SPACE_SIZE; object_numb++)
{
ack_sender = flag_pick(wire_ack_acquirememt_bus[object_numb][wire_wsr_num], 1, SEND_ON_BUS);
if (ack_sender == ASSERT)
{
sender_no_ack_acq_bus[wire_wsr_num] = object_numb;
i = i | ASSERT;
}
}
if (object_numb == SPACE_SIZE && i == NEGATE)
{
wire_reset = NEGATE;
sender_no_ack_acq_bus[wire_wsr_num] = prev_sender_no_ack_acq_bus[wire_wsr_num];
}
else
wire_reset = ASSERT;
53 :
デフォルトの名無しさん:2007/01/06(土) 14:29:29
>>51続き
wire_temp_ack_acq_bus = flag_pick(wire_ack_acquirememt_bus[sender_no_ack_acq_bus[wire_wsr_num]][wire_wsr_num], 1, SEND_ON_BUS);
wire_event_temp_ack_acq_bus = ff_event_check(&ff_event_temp_ack_acq_bus, 0, &ff_event_holder_temp_ack_acq_bus, 0, wire_temp_ack_acq_bus, 0);
wire_event_temp_ack_bus_assert = wire_event_temp_ack_acq_bus & wire_temp_ack_acq_bus & 1;
wire_event_temp_ack_bus_negate = wire_event_temp_ack_acq_bus & ~wire_temp_ack_acq_bus & 1;
for (object_numb=sender_no_ack_acq_bus[wire_wsr_num]; object_numb>0; object_numb--)
{
wire_ack_acquirememt_bus[object_numb -1][wire_wsr_num] = flag_fill(wire_temp_ack_acq_bus & ~wire_event_temp_ack_bus_negate & wire_reset & 1, wire_ack_acquirememt_bus[object_numb][wire_wsr_num -1], 1, 0);
}
for (object_numb=sender_no_ack_acq_bus[wire_wsr_num]; object_numb<SPACE_SIZE-1; object_numb++)
{
wire_ack_acquirememt_bus[object_numb +1][wire_wsr_num] = flag_fill(wire_temp_ack_acq_bus & ~wire_event_temp_ack_bus_negate & wire_reset & 1, wire_ack_acquirememt_bus[object_numb][wire_wsr_num +1], 1, 0);
}
}
>>49 exp(complex<double>(0, 3))
55 :
49:2007/01/06(土) 18:38:24
>50
あほかwそんな長ったらしい書き方するかよw
>54
できた。ありがと。
56 :
デフォルトの名無しさん:2007/01/08(月) 06:03:06
【ネガティブ派遣根性チェック】
3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。
□偽装派遣先の社員の意見にはたとえ間違っていても反対しない
□偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□偽装派遣先社員より自分の生涯収入が低いのは当然だ
□偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ偽装派遣先に常駐したい
はい、俺負け組決定!!
きっと本当の人生は来世!!
いや、人間じゃなくて鯨あたりになって、海を悠々自適にすごすのも良いな〜
ってことは、グリーンピース応援しなきゃ。
ビフィズス菌で、胃腸で大活躍ってのも悪くないな。
あー早くポックリいかねぇかな。
親が死んだ後、雷あたりにぶち当たっておっちぬのがベストなんだけどな〜・・・
なんで「偽装」なの?
>>58 派遣元は「うちはプロです」と言っておきながら現実には昨日今日入社したばかりの
偽装派遣先に常駐させ、派遣先社員の指示の下で働かせる実質アルバイト派遣業だから
ワロタ
すれ立てるまでもない質問はここでスレが無いのでここで聞きますが
オープンソースのSNSって何がありますかね?
開発言語別で教えて頂けませんでしょうか?
でも、失礼なのでC++でのオープンソースSNSだけでも教えて頂ければと思います
webprog逝ったほうがいいよ
64 :
デフォルトの名無しさん:2007/01/08(月) 21:15:49
黄色い「独習C」って本やったことある人いますか?
あの本をマスターするとどれくらいのソフトが作れるようになるんですか?
66 :
デフォルトの名無しさん:2007/01/09(火) 11:38:54
MAME32をジョイスティックで動かすことをしたいのですが
keybd_eventをつかっても動きません
メモ帳で試してみたら、動きました
何か他の方法があるのでしょうか
constとstatic constの違いを教えてください
>>67 それが何を修飾しているかによって異なります。
C++です。修飾しているのはintやdoubleです。
前者は定数で後者は静的な定数です。
整数リテラル0が何故、8進リテラルになるのかが分かりません。教えて下さい。
スレタイがエロ過ぎると思います。どうにかしてください。
>>73 0で始まる数値は8進リテラルと決められているからです。
従って、10進リテラルで0を表現することは(事実上)できません。
じゃ1-1で
>>73 0でも
00でも
0x0でも
意味は一緒だから気にすんな
78 :
デフォルトの名無しさん:2007/01/10(水) 05:34:56
0AUと0nmは同じ長さ
>>77 意味は違います。同じように使えるだけです。
>>78 工学屋から言わせれば、精度が違う。
int _tmain()
{
for(int n=0;n<=10;n++){
for(int i=0;i<=10;i++){
cout<<n<<" "<<i<<endl;}
cout<<n<<" "<<i<<endl;}
}
とするとiが0から11まで出力されます。10じゃないのかな?なんでだろ。
81 :
デフォルトの名無しさん:2007/01/10(水) 18:00:31
あげわすれました。よろしくお願いいたします。
83 :
デフォルトの名無しさん:2007/01/10(水) 18:09:20
それは大丈夫です。>80式を動かすとnについては0-10までなのですがiが0-11となってしまいます。
for構文だからi=10のときはi<=10を満たすので「cout<<n<<" "<<i<<endl;」を実行しこのときiは10となります。
その次にiを++するのでi=11となりi<=10を満たさなくなるので、i=11が出力されるはずがないと思ったのです。
なんでなんでしょうか。
84 :
デフォルトの名無しさん:2007/01/10(水) 18:11:51
n i
0 1
0 2
・・・
0 9
0 10
0 11
・・・
10 1
・・・
10 10
10 11
となります。変だと思うのです。
>>84 2行目の
>cout<<n<<" "<<i<<endl;}
が余計だろう。ここのi は既に内側のforのスコープから外れてるぞ。
>>80式を動かすとnについては0-10までなのですがiが0-11となってしまいます。
>>84の実行例はiは1-11になってるように見えるが?
>>80で書いたコードと
>>84で実行してるコードは違うだろ?
[完成]
int _tmain()
{
for(n=0;n<=10;n++){
for(i=0;i<=10;i++){
cout<<n<<" "<<i<<endl;}
//cout<<n<<" "<<endl;
}
}
[原因]
指摘をもとに2行目を削除したところ正しく出力されました。ありがとうございました。
[謝辞]
>85
ご指摘の通りでした。2行目が必要だと思っていましたが、実際には不要なものだったのですね。
>86
申し訳ないです。慌てていて>84でiが0の場合が抜けています。
みなさま迅速なご指導ありがとうございました。これで数時間悩んでいてほとほと困っていましたが
解決することが出来ました。
[結果]
n i
0 0
・・・
0 9
0 10
・・・
10 1
・・・
10 10
88 :
デフォルトの名無しさん:2007/01/11(木) 19:05:47
Cのprintfにて文字色を変えて表示させたいのですが
\033[31m のような指定では無く
RGB指定で細かくして表示させたいのですが
そのようなことは可能でしょうか?
世の中そういうことができる環境があるかもしれない。
或いは自分で作ればそういうことだってできるだろう。
90 :
よろおね:2007/01/11(木) 22:27:20
知人からソースを貰いました。
コンパイルしようとしたら
$ gcc main.c
main.c:6:19: stdio.h: No such file or directory
main.c:7:20: string.h: No such file or directory
main.c:8:20: stdlib.h: No such file or directory
となりました。
「stdio.h, string.h stdlib.h も寄越せ ゴルラ!」と言って一週間。
未だに貰えません。
どうしたらいいでしょう?
明らかにあなたのビルド環境が異常です
>>90 stdio.h, string.h stdlib.hは知人から貰うようなものじゃない。
コンパイラをダウンロード・インストールすれば付いてくるもの。
環境さえまともに整えられないのか?
知人も在る場所知らない希瓦斯
どうせ
#include "stdio.h"
とか書いちゃってるオチだろ。
>>95 その場合も、見付からなければ<stdio.h>と書いたのと同じ方法でヘッダを探すことになっており、
gccもそれに則っているから問題ない。
↓このあと、>95 の「釣れた」宣言
98 :
偽95:2007/01/12(金) 15:21:42
Fish On!!
かかったかかったーー!!
ん?あっれぇ〜
根掛かりだ〜
わらたw
101 :
デフォルトの名無しさん:2007/01/13(土) 14:28:22
Microsoft Visual C++ 2005
で.cppのファイル開いてもビルトがでない。
どーやってコンパイルすればいいの!!
‖
___ ‖
/ `ヽ‖
,:' 、ゑ
,' ; i 八、
|,! 、 ,! | ,' ,〃ヽ!;、
|!| l川 l リへ'==二二ト、
リ川 !| i′ ゙、 ', ',
lルl ||,レ′ ヽ ,ノ ,〉
|川'、 ,,.,.r'" ,,ン゙
`T" ! ,/ '.ノ,/|
/ ,!´ !゙ヾ{ |
/ ,' i ゙ ! ,l゙
,r‐'ヽ-、! ', l|
{ `ヽ ! 「゙フ
,>┬―/ ; i,`{
/ /リ川' ', ゙、
/ ,/ ゙、 ゙、
ノ / ', `、
\_/ ; ゙、ヽ、
l__ ! ___〕 ,、l
 ̄`‐┬―r┬‐r'´ `'‐'′
| .! | |
| | .| |
103 :
偽95:2007/01/13(土) 16:09:17
新規作成→新しいプロジェクト→特にソリューションディレクトリが必要なければチェック消す
→プロジェクト名(好きな名前で結構)[OKを押せば勝手に指定した場所の所にプロジェクトフォルダが出来る]
→OKを押して次を押す→windowsアプリケーションじゃないならプリコンパイル済みヘッダーのチェックを消す
→コンソールアプリケーションチェック、空のプロジェクトチェック、そんで完了押す
→左のソースファイルフォルダ右クリック新しい項目追加
→C++ファイルを選んで名前を付けて追加(C言語なら拡張子を.cにする)
→ソース書いてコンパイルしてビルドしてデバッグなしで開始(デバッグするならデバッグで)
C++で文字列の先頭から、途中までの文字列が一致するか否かを判定する関数は
ありますか?
EX:
比較文字列 2ch
比較対象文字列(一致)
2ch close
比較対象文字列(不一致)
3ch open
こんな感じで判定できるような関数なのですが・・・・・?
Windows2000
VS2005 SDK
string
不可解なエラーに悩まされています。
原因はどの辺りにあるかわかりますか?
たとえば、グローバルで定義したint a、int bがあるとして、
プログラム中でa++したときに、なぜかbも一緒に++されてしまう。
aをaaaに変更してみたりその他の関係のない変数の変数名を変更してみたり、
int a=0;と定義するとエラーが出なくなることもある。
しばらくコーディングを進めると今度は違う変数同士が干渉し始める。
どの辺りに起因して同じ領域に違う変数が割り当てられてしまうのか、見当もつきません。
WinXP
gcc(cygwin)
>>106 gccなんてクソコンパイラ使ってるからだよ。m9(^Д^) プギャー
110 :
106:2007/01/13(土) 23:48:16
>>109 わかりました。基本から出直してきます。
ご返答ありがとうございました。
&b(a);
とか?
doubleの要素型で、要素数が5の配列の全要素に0.0を代入して表示するプログラムが分かりません。教えて下さい。C++です。
#include <iostream>
int main()
{
double d[5] = {0.0};
for(int i = 0; i < 5; i++)
std::cout << i << " : " << d[i] << std::endl;
return 0;
}
>>113 ありがとうございます!けど実行すると、0が表示されてしまいます....
確認のために0を表示するように書かれているからだ。
0というより、0になった配列の各要素と言うべきだな。
0 じゃなくて 0.0 を表示したいのではないかと esp
ほれ
#include <stdio.h>
int main()
{
double d[5] = {0.0};
for(int i = 0; i < 5; i++){
printf("%.1lf\n", d);
}
return 0;
}
#include <cstdio>
int main()
{
double d[5] = {0.0};
for(int i = 0; i < 5; i++){
printf("%.1lf\n", d);
}
return 0;
}
d[i]
Cプラプラで0.0から1.0まで0.001おきに、その値と、その値の2乗を表示するプログラムって、どう作ればいいんですか?
>>123 まずはC++のコンパイラを入手し、お前が使ってるPCにインストールする。
C++なら_asmが使えるからアセンブリで書いてやろうと思ったけどやめた
int data[10]={0};//dataの中身を全部0で初期化
これをクラスで記述する方法ってあるんでしょうか
struct a{
int data[10];
a():??{}
};
a() : data() {}でできない?
できないならおとなしく、コンストラクタのブロックの中でstd::fillでもするしかないな。
>>127 出来ました!こんな書き方があったとは
ありがとう
129 :
デフォルトの名無しさん:2007/01/15(月) 04:20:32
画像のピクセルサイズを取得したいのですが
どうすれば取得できますか?
画像ファイルの構造を知る
男ならwaveだろうがbmpだろうが黙ってバイナリfstream
133 :
Cはできた(過去形)人:2007/01/15(月) 18:29:34
BorandC++を使ってるんですが・・・ <iostream>ファイルをオープンできません とでてコンパイルできません・・・ いったいどうすれば・・・
>>133 普通にググったら見落としに気づくかもよ。
136 :
デフォルトの名無しさん:2007/01/15(月) 18:54:30
分割コンパイルしたオブジェクトファイルをmain.oも含めて静的ライブラリに
まとめた場合、一般にそのライブラリのみで実行ファイルをビルドすることは
できるのでしょうか?
GCCだとできたのですがVCやBCCだとどうなんでしょう?
libfoo.aがmain.o, hoge.oで構成されている場合、GCCの例だと
gcc -o exefile libfoo.a
でexefileという実行形式を作成できました。
137 :
デフォルトの名無しさん:2007/01/15(月) 18:57:51
256*256の二次元配列を作りたいのですが、実行するとStack overflowとでてしまいます。
どうにか回避する方法はないでしょうか?
mainを含んだ静的ライブラリってのは、
Win32のスクリーンセーバライブラリがそんな感じだな。
140 :
137:2007/01/15(月) 19:36:29
>>138 すみません。
ヒープに割り当てる方法を教えてください。
141 :
136:2007/01/15(月) 19:39:26
今vc8で試してみたのですができませんでした。
具体的には
cl /EHsc /c main.cpp lib.cpp
lib /out:library.lib main.obj lib.obj
cl /Feout library.lib
out.objが開けないとエラーがでてしまいます。
142 :
デフォルトの名無しさん:2007/01/15(月) 19:46:55
>>140 ヒープに割り当てるというのはmalloc(Cの場合)やnew(C++)などで
動的にメモリを確保することです。
あとは調べればわかるかと思います。
>>141 できたぞ。
cl /EHsc /Zl /c test.cpp
lib /out:hoge.lib test.obj
link /machine:x86 /entry:mainCRTStartup /out:HOGE.EXE msvcrt.lib hoge.lib
/entryの代わりに/subsystem:consoleでもうまくいった。
またcl経由でリンカを呼び出してもできる。
cl /MD hoge.lib /link msvcrt.lib /machine:x86 /subsystem:console
いずれにしてもLNK4001(オブジェクトファイルがない)という警告が出る。
144 :
デフォルトの名無しさん:2007/01/16(火) 15:11:25
>>144 それだけ素人丸出しなら充分だと思うが。
146 :
デフォルトの名無しさん:2007/01/16(火) 22:33:51
Windows上で動くプログラムには仮想メモリが割り当てられてて
プログラムからは仮想メモリしか見えないんだよね?
じゃあメモリエディタってどうやってんの?
適切な権限さえあればよそのプロセスのメモリだって読み書きできる(真っ先に思い浮かぶのはデバッグ用途)。
大抵は権限の設定なんてやっていないから、同じユーザのプロセスならだいたい読み書きできると思っていい。
Windowsカーネルは全部の仮想メモリを知ってるから、
API叩いて教えてもらうんだよ。
実際に物理的なメモリを書き換えているとは限らない
ひょっとするとあなたの書き換えた場所はディスク上の一部かも知れない
質問なんですが、C++の問題集でお勧めなのはないでしょうか?
参考にしたいのでお願いします。
Cの経験が少しあってC++をはじめた者です。
憂鬱なプログラマのためのオブジェクト指向開発講座(第2部第5章p116)で、
「コンストラクタを使って、定数メンバの初期化を行うことができます」
と書いてありました。定数の初期化って、定数はあらかじめ
定義されているものだと思うんですけど、
どういうことでしょう?
定数メンバと定数は違うだろ
static const double a=1;
じゃだめなのですか?
153は非静的メンバの話だと思う。
>>154 >定数メンバと定数は違うだろ
定数って
const int a;
とかですか?
憂鬱本↓
メンバ初期化の方法はLIST6のように考えるのが普通でしょう.
確かにこのように書くことは可能です.・・・しかし,これは進められる書き方ではありません.なぜならば,これでは定数のデータメンバを初期化することができないからです.
クラスのメンバデータには定数も使用することができます.その初期化を行うのも当然コンストラクタということになるでしょう.しかし,コンストラクタとはいえ,やはり関数です.その中で定数を書き換えることはやはりできません.
さてそれでは,別の方法で定数メンバを初期化することは出来るのでしょうか.そのような特別な方法が用意されているのでしょうか.
これはそのような方法が存在します.C++では,コンストラクタがメンバを初期化するために新しい構文が設けられています.メンバの初期化はLIST7のように行います.
LIST6:データメンバの初期化
Person :: Person () // コンストラクタの実装部
{
age = 0 ; // 年齢の初期化
name = NULL ; // ポインタの初期化
} // しかしこの方法は薦められない!
LIST7:コンストラクタでのメンバ初期化
Person :: Person ()
: age ( 0 ) , name ( NULL ) // 正しい方法
{
// 何もしない
}
_, ._
(;゚ Д゚) …?
新版も出たことだし、Effective C++ くらい買いなさい。
>>158 >これはそのような方法が存在します
日本語でおk
(これ、Visual C++のスレで質問するべきなのかもしれませんが)
標準C++というのでしょうか、windowsコンソールアプリケーションの
文法で、Visual C++のよなwindowsプログラミング(ファイル[メニュー]や
ボタンを付けたいだけですが)をすることってできるでしょうか?
やはりそれはVisual C++でしかできないのでしょうか?
環境はVisual C++ 2005 Express Edition使っています。
>>163 Visualという単語で勘違いしたのかな?VC++でコンソールアプリも書けます。
VC++でコンソールアプリを書いてもWindowsアプリを書いても、VC++の文法は同じです。
Windowsアプリの開発環境はVC++だけではありません。VB、Delphi等々色々あります。
>>164 返信感謝します。
(私があまり理解していないので、言葉がうまく見つかりません)
普通(?)のC++(コンソールアプリ)は、やったことがあるんですが、
windowsアプリケーションのソースを見たところ、
“ハンドル”という言葉が出てきたりして、
私が今まで勉強したC++と少し違うと思いました。
文字列に関しても、宣言が下のように違うようです。
string word @
↓
string^ word; A
winwosアプリをする場合は、新たにAのような文法を勉強しなければ
ならないんですよね?
ないない
ルンゲ・クッタ法を用いてX-Y軸上に楕円運動の軌道を描く際の、各点においてのX軸Y軸方向への速度をV,Uとして時間T毎にファイルに書き込みたいのですが、どういった書き方ならば綺麗に描けますか?
>>165 「string^ word;」がエラーにならないとはちょっと思えない。
“ハンドル”はHANDLEのこと?ならそれはWindowsが定義してる型。typedef void *HANDLE;。
それともメッセージハンドラ?なら、イベント駆動という考え方を知る必要がある。
まぁ、まずはWinアプリの入門書か解説ページを読んで。
170 :
165:2007/01/24(水) 18:11:36
返信ありがとうございました。
>“ハンドル”はHANDLEのこと?ならそれはWindowsが定義してる型。typedef void *HANDLE;。
>それともメッセージハンドラ?なら、イベント駆動という考え方を知る必要がある。
前者だと思います。
↓のように使用されていて、
文字列型のハンドル、オブジェクト方のハンドルがあると書いてありました。
private: System::Void buttonAdd_Click(System::Object^ sender, System::EventArgs^ e) {
Debug::WriteLine("追加ボタンをクリックしました");
// 品名、分類、金額を取得する
String^ name = textName->Text;
String^ kind = comboKind->Text;
String^ money = textMoney->Text;
String^ out;
out = String::Format("品名:{0} 分類:{1} 金額:{2}", name, kind, money );
Debug::WriteLine( out );
}
>まぁ、まずはWinアプリの入門書か解説ページを読んで。
普通のC++を知っているだけでは、windowsプログラミングは無理のようですね。
じっくりやってみようと思います。
>>170 あぁぁ、C++/CLIですね。だと文法も拡張されてるそうです。
新しいことをあまり知らないくせにレスつけました。すいません。
でもWinアプリを書くのにC++/CLIじゃないとダメってことはないですよ。
>>170 そのハンドルは169の言っているものとは違う。
171も言っているが、それは.NET Frameworkを使って動くプログラムを書くために作られたC++/CLIという言語のプログラム。
普通のCもしくはC++を使ったWindowsプログラムはまた別物。
>>171,173
指摘していただき感謝します。
C++/CLIは別なんですね。知りませんでした。
私はC++/CLIでない普通のWindowsプログラミングをしたいのですが、
その場合は、普通のC++と同じ文法でやれるのでしょうか?
VC++2005Express使っているんですけど、
その場合、プロジェクトの作成の仕方は、
[ファイル]→[新規作成]→[プロジェクト]
から、[新しいプロジェクト]ダイアログで、
[プロジェクトの種類]で、[win32]で選ぶのかと思うんですが、
この時[テンプレート]で選択できるのが[win32コンソールアプリケーション]
だけになってしまいます。
やり方が違うと思うんですが、
教えていただけますか?
175 :
デフォルトの名無しさん:2007/01/24(水) 23:13:41
176 :
174:2007/01/24(水) 23:45:24
>>175 丁寧な説明ありがとうございます。
>VC++2005ExpressEditionでwin32アプリケーションを作るには
>
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/ >↑で環境をもうちょっと追加しなければならない。
早速入れました。
>win32のウインドウアプリも、コンソールアプリもC++でかけるんだけど、
>window.hをインクルードしたり、スタートが WinMain関数だったり、ちとちがう。
>
http://www.kumei.ne.jp/c_lang/ >↑のWindowsSDK編ってとこ読むといい。長いしめんどくさいけどね。
>VC++2005ExpressEditionではちょっとメニューのエディタないからよけい大変
>
やってみようと思います。
>WindowsSDKでの開発がめんどくさいから
>MFCだとか、VisualBasicとかもっと簡単にウインドウ出せるアプリ作れるものが出来てきたんだよ。
>.NETアプリならVC++2005でも視覚的にウインドウアプリ作れるんだけどね。
>
わかりました。
CLRも考えようかと思います。
質問です、以下の構造体があったとします↓
struct Test{
int nMem;
char strMem[20];
};
上記の構造体に、関数をひとつ追加します。
struct Test{
int nMem;
char strMem[20];
void Clear(){
nMem = 0;
strcpy(strMem, "");
}
};
そして両者のsizeofをとってみたのですが、両者とも24バイトとなりメンバ関数によるサイズの増大が見られません。
これは、コンパイラがTest::Clear()の呼び出しを該当するメモリアドレスに置換しているからなのでしょうか?
多分そうだと思うのですが、参考となるようなものが無く………詳しい方、宜しくお願い致します。
178 :
177:2007/01/25(木) 00:47:31
追記です、実行環境はVS2003、VS2005、BCCです。
>>177 メンバ関数も、機械語のレベルにすれば単なる関数であることに変わりはない。
Cで擬似的に書けばこんな感じになる。
struct Test {
int nMem;
char strMem[20];
};
void Test_Clear(Test* this) {
nMem = 0;
strcpy(strMem, "");
}
C++の例外の使い方を解説した参考書で、オススメのものを教えてください。
文法自体の解説ではなく、使いこなしのテクニックなどについてです。
>>180 例外の落とし穴的なことなら Exceptional C++ にあるよ。
# もし持ってないんだったら C++ 使いとして C++ in-Depth Series は
# 揃えておくことをオススメするですよ。
>>181 ありがとうございます。
洋書には、知っておくべきノウハウの本があるのに、
和書には、言語仕様の解説本しかないんですよね。
洋書で足りてるから書く必要がないのかもしれないけど。
183 :
177:2007/01/26(金) 15:34:18
遅れてしまいました、179さんありがとうございます。
184 :
デフォルトの名無しさん:2007/01/28(日) 03:25:47
メインで作ったポインタをオリジナル関数内で配列領域を宣言するときはどう関数を受け渡せばいいのでしょうか。
void o(int **mem)
{
int i;
mem=(int **)calloc(10, sizeof(int));
for(i=0; i<10; i++)
mem[i]=(int **)calloc(10, sizeof(int));
}
int main()
{
int **mem;
o( );//この部分
}
>>184 void o(int ***mem)
{
int i;
*mem=(int **)calloc(10, sizeof(int));
for(i=0; i<10; i++)
(*mem)[i]=(int **)calloc(10, sizeof(int));
}
int main()
{
int **mem;
o(&mem);//この部分
}
186 :
デフォルトの名無しさん:2007/01/28(日) 04:11:30
>>185 それはやったのですが、
o内で数値を代入して、
メイン側でその数値を使おうとすると反映されていないみたいでエラーが・・・。
187 :
デフォルトの名無しさん:2007/01/28(日) 04:15:23
>>185 後コンパイル時に引数が異なるというエラーが。
間接参照のレベルが 'int ***' と 'int ****__w64 ' で異なっています。
仮引数および実引数と異なります。
>>186 だったらここだろ
void o(int ***mem)
{
int i;
*mem=(int **)calloc(10, sizeof(int *));
for(i=0; i<10; i++)
(*mem)[i]=(int *)calloc(10, sizeof(int));
}
ちなみにどんなエラーが出たのか明記しないとわからん
>>187 メインで int ***mem; とやってるんじゃないか?
190 :
デフォルトの名無しさん:2007/01/28(日) 04:22:36
フリーウェアで、
クラス図を作れるものってありますか?
C/C++の質問しろよ
umlmemo
doxygen
JUDE Community
>>192-194 ありがとうございました。
>C/C++の質問しろよ
はい、すみません。
196 :
デフォルトの名無しさん:2007/01/28(日) 17:09:42
void qsort ( void* base , size_t nmemb , size_t size, int(*compar)(const void *, const void *) )
↑のを自作で作りたいのですが、誰かサンプルを作っていただけないでしょうか?
初心者でスマソorz
198 :
デフォルトの名無しさん:2007/01/28(日) 17:20:36
C++でゲーム制作プログラミング勉強しようと思ってるのですが
おススメの参考書を教えていただきたいです。
本屋に行ったのですが、何を買えばいいかわからずに退散してきましたorz
要望を挙げれば実際にゲーム制作しながら学べるような参考書。
RPGではなくアクションゲーに重きを置いた参考書を望んでいます。
プログラミング経験はJAVAを2年ほど、Perlを授業でかじった程度です。
よろしくお願いします
199 :
デフォルトの名無しさん:2007/01/28(日) 17:21:54
>>197 どれが自作のやつかよく分かんないですorz
ほんと無知でスマソ
ちみの云う「自作」の概念がよく分からないな。
チミが作ったわけじゃねーから、みんな他作だろう?
ワロタ
203 :
196:2007/01/28(日) 18:21:24
204 :
198:2007/01/28(日) 21:01:49
>>202 色々と詳しく教えていただきありがとうございます
とりあえず教えていただいたサイトを見て基本的な所を理解してから
参考書を購入して勉強しようと思います。
ありがとうございました
>>203 GNUのglibcとか、
マイクロソフトならVC++に付属のCランタイムのソースコードとか。
206 :
デフォルトの名無しさん:2007/01/28(日) 21:23:48
#include "DxLib.h"
struct CharaData{
int x;
int y;
int mae,hidari,migi,tama;
};
struct CharaData jikidata;
int jikinomuki=0;
int statusboard=LoadGraph("StatusBoard.png");
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);// ウインドウモードに変更
SetGraphMode(600,480,16);//ウィンドウの大きさ
if(DxLib_Init()==-1) return(-1);//DXライブラリ初期化
WaitKey();
DxLib_End();//DXライブラリ終了
return(0);//終了
}
エラーがでてないのにウィンドウが表示されません。
PCの動作が重くなっているので実行はされてると思うのですが・・・
誰かわかる人いましたら解決策を教えてください OTL
ChangeWindowMode(TRUE);
SetGraphMode(600,480,16);
はDXライブラリの関数だろ?だったら
if(DxLib_Init()==-1) return(-1);//DXライブラリ初期化
の後に書くんじゃないか?
順序立てて考えて問題箇所を洗い出せ
int statusboard=LoadGraph("StatusBoard.png");
これはヤバいんじゃないか?
WinMainよりも前に実行されるぞ。
209 :
デフォルトの名無しさん:2007/01/29(月) 08:50:37
Choge hoge = new Choge();
と
Choge hoge;
は何が違うんでしょうか?
ヒープ領域とスタック領域の違いでしょうか?
どう使い分けたらいいでしょうか?
>>209 前者はdeleteする必要がある。
そのクラスが巨大でないのなら、後者で充分。
巨大であるとかクラスの特性上必要があるとかで前者を使うのなら、auto_ptrの使用を検討したほうがよりよい。
Choge* hoge = new Choge();
ではなくて
Choge hoge = new Choge();
なのであれば、それはメモリリークしている可能性があるよ。
Choge hoge ;
Choge* p = new Choge() ;
hoge = p ;
ただし、Choge::operator=(const Choge* p) が存在する、気持ち悪いクラスの場合だが。
>>211 >Choge hoge = new Choge();
>
>なのであれば、それはメモリリークしている可能性があるよ。
そもそもコンパイル通らないんじゃないか?
Cについて質問です。
double型変数をfprintfで小数点以下の有効数字全てを表示したいのですが、
どのようにすればよいでしょうか。
今は%.20leとか適当な数字で表示させています。
できれば%lfの形式で表示したいのですが。
>>213 %.20gじゃダメ? 値が適当な範囲ならf形式で出るけど。
#define isupper(c) ( (c) >= 'A' && (c) <= 'Z' )
↑これ、パラメータが2箇所で評価しているんですけど、
問題ですか?普通に使えるような気がボクはするんですが...
>>215 ASCIIのようにアルファベットがリニアに並んでいる環境なら使えますね。
評価の副作用がある点に関しては、関数の引き数に副作用の起きるようなコードを書く香具師が阿呆なので
ドキュメントに明示してあれば問題ないでしょう。
>>216 >ASCIIのようにアルファベットがリニアに並んでいる環境なら使えますね。
>評価の副作用がある点に関しては、関数の引き数に副作用の起きるようなコードを書く香具師が阿呆なので
>ドキュメントに明示してあれば問題ないでしょう。
はい。ありがとうございます。
ついでで恐縮ですが、
副作用の起こる使い方ってどんな風な使い方ですか?
218 :
215:2007/01/29(月) 18:18:40
>>216-217 自己レスですみません。
isupper(c = getchar())
↑こういうことですね?
>>218 こういうのもです。
isupper(c++);
>>219 そういうことですか。
ありがとうございました。
まったくどうでもいことだが、範囲比較は想定される数直線的に並べるべきだと思う。
具体的には 'A' <= (c) && (c) <='Z'
>>221 全くどうでもいいことだが、比較対象を左辺に置くのが一般的だと思う。
#いや、どちらでもいいけどさ。
>>216 > 評価の副作用がある点に関しては、関数の引き数に副作用の起きるようなコードを書く香具師が阿呆なので
違う!
こういうのをマクロでやるのがアホ。
今時のコンパイラはインライン関数でも最適化されるので、副作用とか型チェックのないマクロを使う必要性はない。
>>223 ↓こういったのはどうですか?
arrは配列のポインタを設定。
#define ARR_SIZE(arr) ( sizeof(arr) / sizeof(arr[0]) )
225 :
213:2007/01/29(月) 21:30:24
>>214 上手く表示できました。
ありがとうございます。
>224
それはポインタ突っ込んでドツボにはまる香具師が必ず出てくるので有名なマクロだな。
しかし、コンパイル可能な副作用のある式を突っ込むのは難しくないか?
まー、おいらはstd::vector使うからいーけどさ。
>>223 違う!
#define isupper('A'<=((c)%220%156%91))
こうするのが正しいやり方だ!
>>224 template でゴニョゴニョすれば代わりになるものが作れるけど、
これに関しては移植性の高いマクロのほうが好きだな。
>>227 ('A'<=
頬に突き刺さってて痛そうだよな
これじゃ、アッパーじゃなくてフックだな。
>>224>>227 C++ならboost::sizeはだめか?<boost/range/size.hpp>
>>231 boost::size じゃ、
>>227 の速度性能には及ばんだろ、多分。
# メンテナンス性は最悪だけど。
boost::sizeもO2あたりの最適化を書けてやれば定数に収束するんでねーの、たぶん。
>>233 一回しか比較を実施しないロジックに対し速度で対抗しようとしたら
あとはもうテーブルでも用意するぐらいしかないぞ。
比較と剰余のどちらのコストが高いかは議論たり得る。
じゃ、おいらは
#define isupper(c) ((unsigned)((c)-'A')<26U))
で対抗しちゃる。
そうだな。一般的には剰余のほうが速いだろうけど、そうじゃない環境もあるかもね。
>>236 お、これなら環境を問わずに最速なんじゃね?
fgetcで読み込んだファイル(c)の文字を判定して印刷可能文字ならそのまま出力
それ以外なら空白を表示するプログラムを作っていたのですが
while((c = fgetc(fp)) != EOF){
if(isprint(c) != 0){
buf[n] = c;
n++;
}
else{
buf[n] = ' ';
n++;
}
if(n % 16 == 0){
puts(buf);
for(n = 16;i >= 0;n--){
buf[n] = ' ';
}
n = 0;
}
}
この状態で出力すると16文字目の後にバグのような文字がでてきてしまいます。
いろいろ考えてみたのですが原因がわかりませんでした。どうにかしてこのバグを消す方法はないでしょうか?
Win XPでBorlandを使用しています。
連投失礼します。
for(n = 16;i >= 0;n--)ではなく for(n = 16;n >= 0;n--)
でした。よろしくお願いしますm(--)m
文字列の終端はナル文字をうめましょう。●4点
ぬるぽ
243 :
がっ:2007/01/30(火) 07:39:54
ちんぽ
_,ィ、 ,r、__
,.ヘー'´ i `´/ `i_
/ヾ、 ヽ、 i / /ヽ
_ィ、〉 > ´ ̄  ̄ ` く ,ゝ、
}、 ,>'´ 、 ヽ./`ヽ
┌! / / i 「`i ヽヽ ヽ }
Y ! | | l i i l i ',__,.ゝ
,' | | | !l l | l l !
i ! | | | | j___j | |i i!
|i! l ,.|‐T丁i! ハlj, --!`トlノ、||
| ! ! レ'i´ミj "i´ミ iヽ, i || _
| l |i iバ__ソ L__ソ /.ノ |! _ヽ)
| | |l |、//// ' ///// |! |i ヽ)
!ハ |! |,ゝ' ´ ̄ ̄ ` く レy'|!
__,ノ レ'ヽiハ / \}'´ ̄ `ヽ、
ィ´ ̄/ ,べY Y`i__ \
〉/ / , 、ヽ /_`ヽ\ \
,ィ'ん、 / ! '´__ ヽ /´__,.` ', \ ァ'`
`ヽ、/ー' /! __`ヾ! レ'´ _,. ! \ i
/ー-ィ、 ィ__! ___`フ / ヽ二 /7 _i弋
/ 辷j ! ヽ / / / / } j´ 〉
ヽ、 冫 ヽ__ュ_y\ / / /ヽヘ/え´ /
>>239 ・putsの仕様を確認すべし。
・下手な小細工しないでputcharとかfputcを使ったほうがいいぞ。
・そのコードだと16文字に満たない分が出力されないぞ
>>239 > for(n = 16;n >= 0;n--)
17 回実行されるよね。
数直線を意識しない奴は、素養がない。
249 :
239:2007/01/30(火) 19:23:13
>>241,245,246
助言ありがとうございます。
いろいろと試してみたらどうにか動きました。
お手数かけました。
なんか不安w
適当に試行錯誤して動いたらOKという人は、C言語を使うべきではないね。
たまたま偶然、自分が見た範囲内で問題なく動いているように見えるだけ、というのは勘弁して欲しい。
>>248 自然言語で読みやすいように書かない香具師はカス。
Ex.
if (NULL = fp) ...
>>252 それはコンパイルエラーだろ…常識で考えて。
if(NULL == fp)って書きたかったんだろうけどさ。
俺はいっつも右辺にリテラルを入れる派。
>>253 252の挙げている例は、
==を間違って=にしてしまっても、コンパイラがエラーを出してくれるので安全だから、定数は左辺に書け
という、コンパイラが警告を出さなかった時代の人達のクソッタレなコーディングルールを、
今だに実践しているダメな人のことを言っているのだと思うよ。
255 :
デフォルトの名無しさん:2007/02/01(木) 22:04:13
C++勉強始めて一週間ほどの超初心者なんですが、
定数(const)ってしっかり覚えた方が良いでしょうか?
それとも あ〜そんなのあったね。くらいで良いでしょうか?
そりゃ覚えるにこした事は無いと思いますが、なんかイマイチ頭に入らなくて
constごときでそんなに苦労するの?
覚えられなければ参考書とかグーグルで
すぐ答を引っ張り出せるようにはしておけ
ややこしいのもあるから
const char * const s = "ssssss";
とか
class M {
int i;
public:
void setInt(int i) { this->i = i; }
int getInt() const { return i; }
};
こういうのは後回しでもいいかもしれんね。
>>255 まだ、勉強始めて一週間ってことだったら、いますぐじゃなくてもいいとは思うけど。
でも、後からでもいいから const は絶対に覚えておけ。
260 :
255:2007/02/01(木) 23:01:13
親切にお答えいただきありがとうございます。
定数は絶対に変えられない!程度に覚えておき、追々勉強していこうと思います
261 :
デフォルトの名無しさん:2007/02/02(金) 00:20:10
c++でグローバル領域において
const double TEISU = 0.05;
とかにして,VS2005でTEISUにマウスカーソルを合わせると
「static const double TEISU」
って表示されるんだけど,勝手にstaticを付けられてるってこと?
int型だとこうはならないんですけど
そんな感じ。
C++の名前空間内(含グローバル空間)でのconstはexternを付けない限りstaticと同じ内部リンケージを持つ。
(特に整数型において)ヘッダで初期化して定数として使えるようにするため。
263 :
デフォルトの名無しさん:2007/02/02(金) 11:26:29
あるn次元空間において、全ての点から遠くなるような点(最遠点)の効率のよい計算方法を探してます。
ただし、最遠点の範囲はそれぞれの軸で決まっていて、
例えば下図のような2次元空間上でこのように点があった場合、
赤点の位置を算出したいのです。
ttp://kjm.kir.jp/pc/?p=29115.gif ttp://kjm.kir.jp/pc/?p=29117.gif 上の場合は、点が偏っているために範囲ぎりぎりの点が選択されてる様子で、
下は周囲に点が偏っているので中央が選択されてる状態です。
このような点を探索する場合は、
全ての座標において点までの距離を計算し、最も遠くなるような座標を求める、
みたいな総当たりで調べていくしかないのでしょうか。
それともなにか効率のよいアルゴリズムはありますか?
>>263 点に接する円の径を最大化するように円の中心点を範囲内にとればいいのかな?
最急上昇法を使うのはどう?
ローカルマキシマムに気をつけないといけないけど
265 :
263:2007/02/02(金) 15:24:35
点が疎な領域で風船(円)を膨らましていくイメージじゃないの?
3次元以上でも使える。
>>255 constがらみの文法は、わかりにくいですね。
他の人も言っているように、アンチョコを作りましょう。
頭の中に記憶しておく必要はないのです。
あやふやな記憶に頼ってコーディングをするのは、とても愚かな行為です。
(セキュリティのために、裸一貫でしか入退場できない場所での仕事は別だが・・・)
constはちゃんと理解して使えるようにならないと、
他者の書いたコードやライブラリを使うことができません。
>>258 自分はtypedefを使って、なるべくわかりやすくするよ。
typedefを勝手にやるな! というルールのところもあるけどね。
268 :
264:2007/02/02(金) 16:56:55
とりあえず適切に荒くマス目に区切って総当たりし、
その中から有望そうな部分についてマス目を細かくして総当たりし、
さらにその中から・・・
という具合に、ニュートン法みたいに繰り返していくのが無難そうよ。
配列の宣言において、要素数にキーボードから入力した値を用いるにはどうすればよいでしょうか?
配列は静的に確保しなきゃいけないから無理
vector使え
>>270 int int_array[
#include "CON"
];
これでおk。
>>270 // for C(99)
int num = キーボードから入力する関数();
AnyType_t array[num];
// for C++
// use std::vector.
// for (regacy)C
// try malloc() / free().
274 :
270:2007/02/03(土) 00:09:48
>>271,272
ありがとうございます。
説明不足で申し訳なかったのですが、
C++ではなく、Cで実現させたいのですが、
>>271のおっしゃる通り不可能なのでしょうか?
>>273,275
ありがとうございます。
初心者なもので、具体的に教えていただきたいのですが、
float型で変数nを要素数とするxという配列を作りたいときは
scanf("%d",&n);
float x[n];
でよろしいのでしょうか?
やってみたところ、
ここでは宣言はできない(関数 main )
定数式が必要(関数 main )
とのエラーが float x[n]; の行に出てしまいました。
ご教授願います。
>>276 今時、8年も前の規格も満たせないような半端モノのCコンパイラではなく、真っ当なCコンパイラを使ってください。
それがいやなら、C++でも使ってください。
>277
すみません、フリーのBorland C++Compiler 5.5です。
月曜日に学校のVisual C++コンパイラでやってみます。
いや、一緒だから。
C99がまともにコンパイルできるコンパイラで身近なものはiccしかない。
部分的にサポートならgccでもよいが完全ではない。
こういう状態だから「C99は死んだ規格」と呼ばれる。
>>280 >こういう状態だから「C99は死んだ規格」と呼ばれる。
でも、決して無駄にはならないハズ。
なぜならその屍をC++0xが乗り越えてくれるから。
なーんだ結局C++に乗っかかるつもりかよ。やめてくれ。
ただでさえ複雑怪奇なC++の言語仕様をさらに複雑にする気か。
まあC++0xは文法を複雑にするというより、足りない部分を補う
だけで、今の文法でも出来る事を焼き直すわけではないからな。
285 :
263:2007/02/03(土) 14:32:19
>>266-269 回答ありがとうございます。
ローカルマキシマムも図で説明しただいてよく分かりました。
ひとまず269の方法で試してみたいと思います。
C++で他のアプリケーションの画面の色を取得したり、クリックしたりできますか?
できないなら言語は何がオススメですか?
それはC++かどうかよりもGUIのAPIもしくはライブラリの問題。
はいはい、HSPHSP
↓ですが、@がAとして認識されるということですが、
私はAがどういう場合に使われるのかがわかりません。
externで定義ってどういうことでしょうか?
大きな非互換項目の一つにconst型修飾子の取り扱いの違いがある。
C言語では記憶域クラス指定子を持たず、const型修飾されたファイル
有効範囲の識別子は、外部結合の識別子として取り扱われる。
一方、C++言語では内部結合の識別子として取り扱われる。
つまりC言語ではexternが補完されるのに対し、C++言語ではstaticが
補完されると考えればわかりやすい。多くのプログラマは、C言語での
プログラミングにおいて、extern型修飾子は、変数の外部参照宣言を行
なう時にのみ使用し、変数の定義においては使用していない。
この問題は、const型修飾子を使用している多くのプログラムで発生する
と予想される。
const int a=10; @
(C言語で認識される型)
extern const int a=10; A
(C++言語で認識される型)
static const int a=10; B
>>289 どういうこともそういうことも、Cには昔const修飾子がなかったので
const int a = 10はint a = 10と同じスコープを持つしかなかっただけなんだが。
>>289 CでもC++でもグローバル変数の定義にはexternを付けてもいいんだよ。
/* hoge.h */
extern int foo; /* グローバル変数fooの宣言 */
extern int bar; /* グローバル変数barの宣言 */
/* hoge.c */
int foo = 4; /* グローバル変数fooの定義 */
extern int bar = 2; /* グローバル変数barの定義 */
定義に「付けてもいい」ってところがミソだな
>>292 >定義に「付けてもいい」ってところがミソだな
どういうことでしょうか?
>>289 > 私はAがどういう場合に使われるのかがわかりません。
C言語では(1)と(2)は同じだから、どっち使うか自由なので
(2)を使わなければいけない場面なんてないんじゃないのかな。
C++だと(1)は(3)の意味になる。
(3)では複数のファイルに同じものがあって無駄に感じるが
そんなの気にしないで(2)を使わず(1)を使うようだね。
>>295 生半可な知識しかないなら回答しないでください。
>(3)では複数のファイルに同じものがあって無駄に感じるが
全くの思い違いです。
C++で
複数のファイルに
const int a=10;
などがあっても
変数aというより値10が直接使われる。
複数のファイルに
const int a=10;
const int *p=a;
とした場合はそれぞれのファイルで異なるポインタのaが存在るんじゃないの。
同じ定義を複数のファイルに書いたりしない。一個をインクルードするだろ。常識的に考えて。
>>300 そういうこといっているんじゃないと思うが。
その通り実際にはヘッダファイルに書くけど
ヘッダファイルにstatic const int a=10;を書いて複数のファイルからインクルードするのと
複数のファイルにstatic const int a=10;を書きのとで
staticやexternの動作は変わらないでしょ。
それとも別の話?
質問です、class Aを継承したclass Bが存在したとします。
class Aに仮想デストラクタが存在しない場合、class Bのデストラクタが呼ばれないと聞きました。
これは、常に真なのでしょうか? B Obj;などと動的に生成しなくても、デストラクタはやはり呼ばれないのでしょうか?
>>302 A *obj = new B;
みたいな使い方した場合。
Aに仮想関数が存在しなければobjはすべてAとして動作するから、
デストラクタもAのデストラクタが動けばいいけど
仮想関数が存在した場合、objはBとして動作することがある。
そのときBの動作してAのデストラクタしか動かなかった場合、危険でそ?
B *obj = new B;
のように宣言するならちゃんとobjが破棄されたときにBのデストラクタが動くはず。
でもそんなリスキーなこと考えず、仮想メンバ関数のあるクラスには
virtualなデストラクタを置くのが常識。
>>300に同意
ま、スレの題名通りの流れだから良いけど。
>>300 そもそも、
複数のファイルに書かれた
static const int a=10;
が、同じ定義かどうかは、わからないぞ。
ファイル内のローカルスコープなわけで、
ファイルによって aの値は違うかもしれないし、
今は同じでも今後変るかもしれない。
306 :
デフォルトの名無しさん:2007/02/06(火) 11:36:10
blowfishをやろうと思っているのですけど、暗号化できません
#include <stdio.h>
#include "blowfish.h"
#include "blowfish.h2"
#define FilePath "text.txt"
#define Key "keyword"
#define BUF_SIZE 256
FILE *fp;
char buffer[] = "asdfghjk";
char newbuffer[255];
CBlowFish *blow = new CBlowFish;
blow->Initialize( Key, strlen(Key));
blow->Encode( buffer, newbuffer, BUF_SIZE);
delete blow;
fp = fopen(FilePath,"w");
fprintf(fp,newbuffer);
fclose(fp);
どこが間違っているのでしょうか?
307 :
デフォルトの名無しさん:2007/02/06(火) 11:40:52
質問です
メインで使うクラスにデストラクタの中で
終了時にメンバ変数の領域をdeleteにより手動で開放する
意味はあるのですか?
308 :
306:2007/02/06(火) 11:55:53
すみませんけど、自己解決しました
>>307 確保したものは解放するのが当然。まして、「メインで使う」ことが何度もあるなら。
310 :
デフォルトの名無しさん:2007/02/06(火) 15:11:02
ではもう使わないんなら解放しなくてもいいですね
デバッガでメモリリークを検出するようにしてるような場合、
そういうことを適当にしてるとせっかく検出したリークを
見落とすようなことになる。
それに限らず、「もう使わないから」って理由で開放漏れを
容認しだしたら、本当に深刻なリークが発生したとき
あちこちに疑わしい箇所が散逸してて泣くことになると思うぞ。
一人で責任持てるなら良いかもしれんがチームのときは迷惑極まりない。
どうせOSが後始末をしてくれるし、終了処理してたら重くなるから
リリースバージョンではabortで終了する。という人もいるみたい。
free論争は秋田
まさか307はこういうことを言いたいのか?
class Hoge
{
public:
~Hoge() {delete &x;}
private:
int x;
};
>>315 なんかおかしな事になりそうだから試したくないけど
それしたらどうなるの?
おそらく未定義の動作。どうなろうと標準規格の関与するところではない。
鼻から悪魔が(ryとよく言われるやつ。
同じオブジェクトを二回破壊しようとしたら実行時エラーでないか?
>>307じゃないけどデストラクタでdeleteするのってダメなんですか?
デストラクタって破棄される直前に呼ばれるんですよね?
メンバ変数がnewで確保されたものなら、デストラクタでdeleteするのは当然だが。
ああ、
>>315をよく見て無かっただけですた
びっくりしたぜ、サーセン
>>316 おそらく何も起きない。
というのも、スタック上にあればdeleteは、
んなポインタ知らないよとスルーするし、
ヒープ上にあっても、
んなポインタ知らないよとスルーするから。
デバッグ版なら、変なポインタをdeleteするな、って叫ぶかもしれない。
だがしかし、実装依存であり、何が起きても泣かない覚悟が必要だ。
へ?最近のdeleteはそんな親切設計というか過保護設計というかになってるの?
というか、そういう過保護な実装が存在するのか?だな。
しないだろ。
326 :
デフォルトの名無しさん:2007/02/07(水) 10:30:05
クラスのメンバ変数についての質問です
グローバル変数としてビュークラスの外で宣言したクラスの
メンバ変数は0や空文字で初期化されてるんですが
そのクラスをビュークラスのメンバとして宣言するとそのクラスの
メンバ変数が初期化されないのはどうしてですか?
c++ 変数 初期化 の検索結果 約 145,000 件中 1 - 10 件目 (0.19 秒)
ぐぐったら見つかるだろ
328 :
デフォルトの名無しさん:2007/02/07(水) 10:46:50
>>326 向こうにちょっと書いたが・・・
グローバル変数はコンパイル時に場所を決定して0で初期化したブロックにできるが
ヒープの場合実行時に割り当てられるので、わざわざ0クリアするコードを入れるわけ
ではないので初期化はされない。
しかし期待した答えをもらえないからって文句言うな
ヒープの場合
を
ヒープやスタックの場合
に
332 :
デフォルトの名無しさん:2007/02/07(水) 11:14:54
すいませんありがとうございます
333 :
デフォルトの名無しさん:2007/02/07(水) 19:07:36
C++の勉強したいんですけど、
ゲーム作りしながら学べるような本はありませんか?
持ってるのはVisualC++の6.0なんですけど…。
335 :
デフォルトの名無しさん:2007/02/07(水) 19:28:10
mallcoを使って二次元配列の領域を確保したんですけど,
その配列の値を他の関数に渡すにはどうしたらいいんでしょうか?
値で渡す場合は値渡しだね
337 :
デフォルトの名無しさん:2007/02/07(水) 19:49:31
>>335 たとえばintなら
int (*array)[10]; // int[10]型のポインタ変数array
array = (int (*)[10])malloc(sizeof(int) * 10 * 5); // int [5][10]
func(array[0][0]); // call
良く使うならint[10]型をtypdedef汁
337はfuncの引数がint*となっている場合だね。
void func(int [][10]);などと宣言されていれば、func(array)と呼べる。
339 :
337:2007/02/07(水) 20:11:41
>>338 array[0][0]でちゃんと値を渡してるよ。
コンパイル通してみたから間違いないかと。
typedef版。要は配列の基底となる要素数を[10]です、と明示的に
宣言してやらないと領域だけあっても2元配列としては使えない。
typedef int ArrayType[10];
ArrayType *array;
array = (ArrayType *)malloc(sizeof(ArrayType) * 5); // int [10]を5個分
func(array[0][0]);
>>323 WindowsのVC++のdeleteは、不正なポインタを渡すとint 3してくれたと思う。
>>333 2つのことを同時にやろうとするのは無駄が多いよ。
C++とゲーム作りと、別々に勉強することをお勧めする。
C++の良い参考書はいくつもあるが、
↑と同レベルの、ゲームを作りながらC++を学ぶという本はないから。
343 :
338:2007/02/07(水) 21:31:32
>>339 ごめん。337ではfunc(&array[0][0])と書いてあるかと勘違いした。
344 :
デフォルトの名無しさん:2007/02/07(水) 23:52:01
構造体をヘッダファイルに定義して適当にインクルードしたら
二重定義ということで怒られてしまいました。
#pragma once を使用することで解決しましたが、今まで
C言語をやっていて気になったことはありません。
コンパイルエラーになったのはC++ですが、C++でエラーになる
ようになったのでしょうか?
それともエラーにならなかったコンパイラが寛容だったということでしょうか?
お前がまともな規模のコードを書いてこなかっただけ
346 :
344:2007/02/07(水) 23:56:13
>>344 C言語でもまともなコンパイラならエラーになる。
大きな規模のプロジェクトならば名前の衝突は経験することがあるはず。
>>344 Cでも「構造体をヘッダファイルに定義して適当にインクルードしたら二重定義ということで怒られ」ます。
349 :
デフォルトの名無しさん:2007/02/08(木) 00:20:11
>>348 今Borland C++ 5.5.1をダウンロードして試してみましたが全く
エラーになりません。
<struct.h>
typedef struct test_st
{ int a;
int b; }TEST_ST;
<main.c>
#include"struct.h"
void testFunc(void);
int main(void)
{testFunc();
return 0; }
<sub.c>
#include<stdio.h>
#include"struct.h"
void testFunc()
{ printf("Hello\n"); }
main.cとsub.cで2回構造体の定義(struct.h)をインクルード
していますがエラーにならずに実行できます。
ちなみにエラーになったのはVC++でC++を使ったときでした。
これはエラーにならないコンパイラが甘いということでしょうか?
350 :
344:2007/02/08(木) 00:21:08
どうもVC++のバージョンを上げてから弾かれるようになったように
記憶しているのですが・・・
>>344 "piyo.h"というヘッダを作ったとします
そしたらヘッダ内に
#ifndef INC_PIYO_H
#define INC_PIYO_H
・
・
#endif /* INC_PIYO_H */
のような形の文を必ず書きなさい
そうすればと二重インクルードガードとなる
352 :
344:2007/02/08(木) 00:32:02
>>351 いや、それは知っています。
それの代わりに#pragma onceでもいいってことも。
気になっているのはなぜ今までエラーにならなかったのかと
いうことです。
実際、さきほどbccで試したらエラーにならなかったし。
struct.h
をインクルードする
struct2.hを作って
main.cから
#include "struct.h"
#include "struct2.h"
ってしてみれ
規模が大きくなるとそういう事が多くなる
354 :
344:2007/02/08(木) 00:54:32
>>353 ありがとうございます。
なんとなく分かった気がします。
同一ファイル内で1回なら問題ないということですね。
Cで自分で意識してインクルードした場合は、1ファイルにつき
1回しかインクルードしないので問題がなかったのですが、VC++で
MFCを使うと勝手にインクルードとかされてエラーになるように
なったんじゃないかと思います。
どんな名前になるのかわからないファイルを勝手にインクルードなどできるはずがない。
だからそれはCとかC++とかの問題ではなくて
お前の書くプログラムの規模が小さかったから現れてこなかっただけだ。
ところで分割コンパイルと二重インクルード防止は基礎中の基礎だと思うんだが
最近の入門書じゃ教えてないっぽいな。
嘆かわしいなあ…
>>356 まともな入門書には書かれてるよ。
まともじゃない入門書でも、説明しているものがあるけどね。
358 :
デフォルトの名無しさん:2007/02/08(木) 02:35:10
質問です。以下のように、変数を自作クラスを使うベクタを使って作成する場合
どのようにして作成していけばよいのでしょうか。push_backメンバが使えると思うのですが
いまいち自作クラスを使ったベクタでの使い方がわかりません。よろしくお願いします。
class A {
int a;
int b;
public:
void set_a(int seta) { a = seta; }
void set_b(int setb) { b = setb; }
int get_a() { return a; }
int get_b() { return b; }
};
int main() {
vector<A> vec_a;
/* vec_aに要素を追加する */
return 0;
}
359 :
358:2007/02/08(木) 02:38:02
訂正します。
どのようにして要素を作成していけばよいのでしょうか。
>>358 class Aに引き数をとるコンストラクタを用意した方が何かと便利かもね。
仮に、A(int seta, int setb);というコンストラクタがあるなら、
vec_a.push_back(A(0, 0));って感じで設定も同時に行なえる。
>>361 セッターの戻り値を *this にして
vec_a.push_back(A().set_a(0).set_b(0));
なんてやるのもいいと思うけどね。
コンストラクタでやるのに比べるとちょっと冗長だけど、
このスタイルのほうがいろいろと都合がいいことってあるし。
それマジ?
364 :
358:2007/02/08(木) 10:19:30
setterでthisポインタ返すのは常識だろ
質問です
cout << false;
cout << true;
の出力結果は 0 1 ですが、これは環境によって違うのでしょうか?
プリコンパイル済みヘッダに関する質問です、
VC++2003やVC++2005では各cppに#include "stdafx.h"でプリコンパイル済みヘッダが使えます。
ところがそのソースをBCCに移植すると、(ディレクトリの関係で)一部#include "../stdafx.h"にしなければなりません。
VCはディレクトリ関係を気にせず一様に指定出来ますが、BCCで同じことは行えないのでしょうか?
>>369 BCCはstdafx.hは必要ありません。
>>366 はて、>362は実体を返しているようだが。
とりあえずゲッターはconstつけようや
C++のソースからクラス図を自動生成してくれるようなツールはないでしょうか・・・?
>>369 インクルードパスに..を追加できないの?
""で括ったヘッダ名が見付からなければ、
<>で括ったのと同じようにヘッダを探すことになっている。
だからインクルードパスの指定は""で括ったものにも有効。
>>374 Doxygenを含めて色々在ると思う。
377 :
デフォルトの名無しさん:2007/02/14(水) 13:38:46
class A{
static const double a;
static const double b;
static const double c;
};
const double A::a=5;
const double A::b=10;
const double A::c=a/b;
と書いた場合、cは必ずa=5とb=10が実行された後に実行されるのでしょうか?
CTypedPtrListのSeqValueListを
CTypedPtrArrayにする時ってどうすればいいんでしょうか?
下のがソースなんですが、やり方が良くわからない。。。orz
CItemInfo::~CItemInfo(){
int iCount;
POSITION pos;
VALUE *pValue;
m_pValueList = &m_SeqValueList;
iCount = (int)m_pValueList->GetCount( );
pos = m_pValueList->GetHeadPosition( );
for( int i=0; i<iCount; i++ ){
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
m_pValueList = &m_ParValueList;
iCount = (int)m_pValueList->GetCount( );
pos = m_pValueList->GetHeadPosition( );
for( int i=0; i<iCount; i++ ){
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
}
なんだマルチか
MFC実行したら
Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or
PostNcDestroy in derived class will not be called.
って言われたんだけど、どういう意味なの?
そのままの意味です。英語の意味が判らないと言うのであれば、鼬害です。
>>381 ウィンドウを正しく終了せず
プログラムの変数(インスタンス)が消されたことにより
正しい手順ではなくCWndのデストラクタが呼ばれたんじゃないの(推測)。
384 :
377:2007/02/16(金) 07:39:55
そうするとcの値は何になるのでしょうか?
0.5でしょ。コンパイルタイムに確定するから。
>>385 この手の順序依存は規格的には未定義じゃなかったっけ?
BCCでインデントするとemacsでやってたのと違ってかなり
スペース空くのですが、こんなもんなんですか?
BCCでインデント の意味がわからない。
class A{
static const double a;
static const double b;
static const double c;
};
const double A::a=5;
const double A::b=c/a;
const double A::c=a/b;
じつはこれもコンパイルできてしまったりする。
>>389 順序は規定されていないけどコンパイルされる以上、値は決まるわけだね。
その例だとa, b, cの順序に評価される可能性が高そうだから、bは(cが暗黙の初期化で0だから)0、cは∞か。
const double A::c=a+b;
const double A::b=c+a;
const double A::a=5;
こうなってたとすると、a, b, cがそれぞれ(acbの順序で評価して)5, 0, 0なのか(cbaの順序で評価して)5, 10, 5なのか悩ましいところだ。
まして複数のコンパイル単位に分かれていたらリンク順序にも依存してしまうのかな。
結論:
評価順序に依存した初期化は鼻から悪魔。constにしないでシングルトンにすべきか。
一部訂正:
×こうなってたとすると、a, b, cがそれぞれ(acbの順序で評価して)5, 0, 0なのか(cbaの順序で評価して)5, 10, 5なのか悩ましいところだ。
○こうなってたとすると、a, b, cがそれぞれ(cbaの順序で評価して)5, 0, 0なのか(acbの順序で評価して)5, 10, 5なのか悩ましいところだ。
gccは確か制御できた様な
393 :
デフォルトの名無しさん:2007/02/19(月) 12:03:31
C言語なんですがwaveを再生させるにはどうすればよいでしょうか?
プログラムが完了したら鳴らしたいのですが・・・。
Beep()
…言ってみただけ
てst
ビープ音鳴らすだけならputchar('\a');
処理系依存だけど
演算子の多重定義って使う機会ありますか?
自分で使うかどうかはともかく、人が作ったものはよく使う。
一番よく使うのがイテレータに対する操作。
後はstd::basic_stringの比較・連結もよく使う。
ビープ音ではなくwavのようなPC内部で鳴る種類が良いです・・・
waveを再生するってのは結構面倒なのでしょうか?
君の面倒なレベルがわからないから回答不能
WindowsならMCIかwaveoutかDirectX
質問のレベルからしてMCIがお勧め
404 :
397:2007/02/19(月) 22:35:33
>>398 ありがとうございました。m(_ _)m
質問です。
typedef std::map<mykey_t,myval_t> mymap_t;
void hoge(mykey_t k, const mymap_t &m){
mymap_t::iterator p = m.find(k); // コンパイラエラー
}
constが付いたmapのイテレータを造りたいんですけど、
どうすればいいのですか?
>>405 mymap_t::const_iterator p = m.find(k);
>>381 今さらながらマジレス
Warning: calling DestroyWindow in CWnd::~CWnd;
OnDestroy or PostNcDestroy in derived class will not be called.
[翻訳]
CWndから派生クラスのウィンドウを使っているときに、
規定クラスのCWnd::~CWndデストラクタが呼ばれているので
派生クラス側のOnDestroyやPostNcDestroyハンドラが呼ばれませんですのよ。うふ
ウィンドウ破棄するときに派生クラス->DestroyWindowを呼んでない悪寒です。
文字と数字が入力された時に、数字だけを消して
文字だけ表示したいんですけど、どうやればいいのでしょうか?
void del_digit(char *str){
while(*str)
/*ここでどうすれば?*/
putchar(*str++);
}
int main(void){
char str[100];
printf("mojinyu-ryoku:"); scanf("%s",str);
printf("DelDigit:");
del_digit(str);
putchar('\n');
return(0);
}
if (isdigit(*str))
410 :
408:2007/02/23(金) 13:05:39
>409
ありがとうございました。解決できました。
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
413 :
デフォルトの名無しさん:2007/02/25(日) 19:10:07
ユーザー一人一人に別々のシリアルナンバーを割り当てたいのですが、
どのように生成し、ソフト側ではどのようにそれをチェックすればよいのでしょうか?
ユーザー特有情報(メールアドレスとか)を秘密鍵で暗号化して、
ソフトに内蔵の公開鍵で復号できたらOK、とか?
うんにゃ、クラックから守るにはクラッカーの手口を知る必要がある。
リバースエンジニアリングの本でも買って読んだ方が良いぞ。相手は『強力なデバッガ』使いだからな。
ロジックの流れなんか直ぐに分かってしまう。まずは低水準なレベルで防御しなければならん。
認証用の関数はプログラム処理の流れから完全に分離、関数のアドレスを入れているポインタのconst変数には定数NULLを入れておき、
ifで関数ポインタ変数がNULLじゃなかったらアドレス先の認証関数を実行、とすると良いかもしれん。
これなら認証用関数の手がかりはほとんど無いからな。ダミーの関数でラップしておけば更に頑丈になる。
NULL定数を正常な認証用関数アドレスに書き換えるパッチをユーザーに配る必要があるが、
ユーザー名をキーに若干絡ませて暗号化とかしておけ。
なにいってるの?
>>415はアレだ。
物事を最初だけ聞いて「みなまで言わずとも分かった」と暴走するタイプだ。
単にWizardBibleとか読んでわかった気になってるだけだろ
江戸っ子は気が短いんでい!
421 :
デフォルトの名無しさん:2007/02/26(月) 20:35:33
VC++自体よくわからんが
ゲーム制作で俗に言うC++ってVC++のこと?
ゲーム制作の参考書買いに行ったがVC++ばっかりで混乱・・・
ちなみにC++の基礎はマスターした。
まあ、Windows対象のC++本ならほとんどはVC++を想定して書かれてると思ってもいいんじゃないかな。
趣味と実益(基本情報技術者の試験)を兼ねてc言語を勉強しようと思います。
フリーコンパイラ使おうと思うんですがどれがいいでしょうか?
VisualStudio Expressで問題ないですか?
趣味ならIDEも付いてるし、VC++でいいんじゃね?
夢を壊すようで悪いけど
基本情報は何の実益にもなりません
おいらのところは資格手当がでるよ
実益というか「そんなのも取ってねぇのかよ」
といわれる会社もあるにはある
>>442 サンクス
やっぱりVC++も頭に入れながらやってみる。
WindowsならVC++かgccの二択だわな
>>429 それを言うならVCかICCの二択だろ。
この期に及んでgcc使うヤツなんていないって。
icc高すぎ
433 :
デフォルトの名無しさん:2007/02/27(火) 16:50:30
>> 430
BCC + BCC Developer は?
もしかして却下?
Turbo Debbuger まで全部タダでそろうが…。
BCC Develoer のクラスでSTL使えたか忘れたが…。
435 :
デフォルトの名無しさん:2007/02/27(火) 17:00:16
>> 434
そうですか!情報提供ありがとうございます。
VCのMFCでは文字列クラスがSTLと共存できない使用だったはず…
最新バージョンでは使えるようになったのかな??
使えないなら BCC の方がよさそうに思いますが…。
Borland C++よりVC++ (7.1以上)の方がテンプレートがまともに使える。
STLを使えるかどうか気にするなら、それだけでVC++を選ぶには十分。
MFCとの相性が悪いなら、むしろMFCなんて捨ててしまえ。
Cコンパイラとして使うならbccよかgccのほうがマシだろ
438 :
デフォルトの名無しさん:2007/02/27(火) 17:31:37
>> 436
たしかに自分使ってない。
>> 437
gcc は使ったこと無くて…
BCCはいまだにC++コンパイラではない
Boostの些細なライブラリが通らないので
C++を知っている人間なら薦めない
(某サイトは特集していたが)
MFCがBoostやSTLやだれそれと共存できないなんてことはない
440 :
デフォルトの名無しさん:2007/02/27(火) 17:47:44
>> 439
いえ自分が言っていたのは MFC内で使われている 文字列クラスと
STL の string クラスの互換性の話…。
MFCをポイすれば悩むこと無いでしたが…
>>440 MFCの文字列クラスとSTLのそれを混在させなきゃいいだけの話じゃないの
>>440 文字列に限らずコンテナ類も互換性がないが、それより
「互換性がない」と「共存できない」じゃまるで意味が違うだろが。
たしかにMFCのCStringTとstd::basic_stringは別物だが、
相互に変換できないわけではないし、
Boost.Range(或いはイテレータ)では統一的に扱えるんだから、
そこまで気にすることは無いと思う。
444 :
デフォルトの名無しさん:2007/02/27(火) 19:00:22
>> 443
参考になりました。ありがとうございます。
template<class T>class A{
private: T na;
public: A(T a):na(a){};
friend A<T> operator + <T>(A<T>&,const A<T>&);
};
template<class T>class B{
private: T nb;
public: B(T b):nb(b){};
friend B<T> operator + <T>(B<T>&,const B<T>&);
};
template<class T>A<T> operator +(A<T> a1,const A<T>& a2){a1.na=a1.na+a2.na;return a1;}
template<class T>B<T> operator +(B<T> b1,const B<T>& b2){b1.nb=b1.nb+b2.nb;return b1;}
でBのメンバ変数にアクセスできないのはなぜ--??
446 :
デフォルトの名無しさん:2007/02/27(火) 20:23:37
>> 445
template<class T>A<T> operator +(A<T> a1,const A<T>& a2){a1.na=a1.na+a2.na;return a1;}
template<class T>B<T> operator +(B<T> b1,const B<T>& b2){b1.nb=b1.nb+b2.nb;return b1;}
↓
template<class T>A<T> A<T>::operator +(A<T> a1,const A<T>& a2){a1.na=a1.na+a2.na;return a1;}
template<class T>B<T> B<T>::operator +(B<T> b1,const B<T>& b2){b1.nb=b1.nb+b2.nb;return b1;}
とすればいいのでは?
friend関数なのでそれでも無理っぽいです。
448 :
デフォルトの名無しさん:2007/02/27(火) 23:08:00
int x;
int &rx = x;
これおかしくね?
&rx = x; 何でアドレスにint型の変数を代入するの
「参照」を知らない香具師は基礎からC++やり直せ
(int &)rx=x;
rはreferenceのr
宣言時に型の直後に&をつけたものは参照型になる
嘘です
ネットで落としてきたcppファイルとdefファイルを使ってdllを作成したいんだけど、
やり方がよくわかりません。
ぐぐって見たところ、
ファイル→新規作成→プロジェクトタブ→win32 Dynamic-Link Library or MFC Appwizard(dll) を選んで
もにょもにょするって書いてあったんですが、↑の時点で2種類のやり方があってどっちが正解かわからないですし、
そもそも貰ったファイルをdll化することが目的なので新規作成からやるのは何か間違っている気がします。
とりあえずcppファイルを開いてコンパイルして、、、defファイルをプロジェクトに追加。
そして再度コンパイルをしてみても・・・無理でしたorz
どなたか助言をお願いします…
環境はvisual V++ 6.0 Standard Editionです。
よろしくお願いします。
>>451 dllを新規作成するからあってるのでは?
そのdllプロジェクトにソースを追加してモニョモニョするんだと思うんだけど。
453 :
451:2007/02/28(水) 13:35:42
うは…なるほど、そういう解釈ですか…
とりあえず
ファイル→新規作成→プロジェクトタブ→win32 Dynamic-Link Library
を選んで空のDllオブジェクトを選択して(この時点で意味不明ですが…他選ぶとどうなるの…?)
プロジェクトの追加でcppを選んでビルドしてみたら何故かdllファイルが出来上がっていました
個人的にはキタ━━━━(゚∀゚)━━━━!!!!
でもどうなってんのか全然だ(ノ∀`)
dllにもフォーマットがあって、cppファイルに則したやり方じゃないとうまく生成されないのだろうか。
ちなみにMFC Appwizard(dll)の方で作ろうとしたら、エラーがでて生成されませんでした。なんでやねん(;´Д`)
それ以前に先ほどDllを作成したときには、プロジェクトの追加でcppファイルを追加したわけですが、
defファイルは追加しなくてもいいんでしょうか?
勝手に追加されるから特に選択する必要はないということでしょうかね・・・(ソースによりけりなのかもしれないけれど)
def ファイルは関数のエクスポートに必要
__declspec(__dllexport) を関数につけてないのなら
def無しで作った場合、出来上がったDLLはどこからも呼べないものになってると思うが
depends.exe 持ってないか?
455 :
451:2007/02/28(水) 15:00:26
depends.exeとはDependency Walkerのことなのかな…?
とりあえず、defファイルを追加せずにdll化するとまずそうなので、先ほどの手順で
プロジェクトの追加からcppファイルとdefファイルの両方を追加して見ました。
すると…エラーなしでdll化キタ━━━━(゚∀゚)━━━━!!!!
これで関数もエクスポートできるようなまともなdllになったのかな…
とりあえずDependency Walkerを起動してみて調べたところ、左のツリー状のところに
TEST.dll
l
−KERNE32.dll
l
−NTDLL.dll
ってなってました。自分にはさっぱりですが、正常にdll化できたと思ってよいのでしょうか(;´Д`)?
DLLの関数のエクスポートのやり方は2種類あるのよ
・関数に__dllexportを付ける
・.defファイルに纏めてエクスポートする関数を書く。
どっちでもおk。俺は見やすいからdefの方でやる。
457 :
451:2007/02/28(水) 15:41:47
なるほど…
まだまだ不勉強なようですね。
でも、ねんがんのdllをてにいれることができたので、レスを下さった方々にはお礼を言いたいと思います。
どうもありがとうでした・゜・(ノA`)・゜・
>>455 そのTest.dll にカーソルあわせたら
右の下のFunction に一覧出るべ
それがエクスポートされたやつね。
459 :
デフォルトの名無しさん:2007/02/28(水) 17:29:16
今日からマイクロソフトのVisualC++2003をし始めたんですが、どこかのサイトで
見つけた同じC++の例文とか書いてみても実行したとたん画面が消えるのはなぜですか?
printf とか cout っていうのとかって一緒に使えますか?
終了したらウィンドウが消えるのは当たり前だろ…
461 :
デフォルトの名無しさん:2007/02/28(水) 22:54:40
Cのポインタについてなのですが
int c;
int *p; /* ポインタの宣言 */
c = 1;
p = &a;
とすると、pにaのアドレスを代入
*p = 1;
ならpの中のアドレスのさす変数aに1を代入
ですよね?
*がない場合はアドレスを入れるものだと思ってたのですが
文字列を扱うときには
char *p = "ABC";
宣言時だろ*があったのですが
後から代入するときには
char *p;
p = "ABC";
という風に*がありませんでした
アドレスの代わりにABCが入ってるのですか?
どのような解釈をすればよろしいのでしょうか
教えてください
char *p = "ABC";は「char *」という型の変数pを宣言していると考えろ。
*をcharではなくpのほうへにくっつけて書くのは慣習的な理由。
こう書いても同じ意味になる。
typedef char * pchar_t;
pchar_t p = "ABC";
463 :
デフォルトの名無しさん:2007/02/28(水) 23:35:19
宣言時代入と、後から代入が同じということはわかりました、ありがとうございます
では
*p = 1でaに代入されるのはどういうことでしょうか?
*とpを書いているのは、アドレスの指す変数に代入と考えていいのでしょうか?
それと
p = "ABC";
の場合はアドレスの代わりにABCが入っていると考えていいのでしょうか?
464 :
デフォルトの名無しさん:2007/02/28(水) 23:39:11
UINT16は最近のPlatform SDKに入っている
<windows.h>(の中でインクルードされているファイル)の中で宣言されている。
今回のものと.NET Frameworkのは関係ない。
手っ取り早く対処するなら、
そのヘッダをインクルードするより先に自分で宣言してしまえばよい。
typedef unsigned __int16 UINT16;
typedef __int32 INT32;
>>463 > int * pa; // (A)
変数paはintへのポインタであることを示す。
> *pa = 1; // (B)
> b = *pa; // (B)
*paの*は、ポインタpaが指す場所に対して代入したり値を取り出したりする。
俺の推測だが
(A)と(B)の*を無理やり同じ意味にしようとしているのか。
>>463 char *p; と宣言している以上は、
ポインタpに入れられるのは(char *)だよ。
"ABC"だってどこかのメモリに存在するわけで
アドレスがあるよ。
>>461 > p = &a;
> とすると、pにaのアドレスを代入
> *p = 1;
> ならpの中のアドレスのさす変数aに1を代入
> ですよね?
そうだね
469 :
464:2007/02/28(水) 23:55:46
>>465 おおお動きました^^;
最終的に
typedef unsigned __int16 UINT16;
typedef unsigned __int32 UINT32;
typedef __int32 INT32;
の3行追加で何とか認識できました。
ありがとうございました!!
470 :
463 461:2007/03/01(木) 00:04:47
>>466 同じ意味かと思ってました
理解できました
ありがとうございました
>>467 納得できました、ありがとうございました
>>468 ありがとうございます
皆さん本当にありがとうございました
471 :
471:2007/03/01(木) 00:12:14
/************************************************************************/
/* 機能 : port5のLEDを交互に点滅させる。 */
/* */
/* 作成日 : 2007/2/27 */
/* 作成者 : 佐々木 */
/************************************************************************/
作ったプログラムソースをメモリーステックに保存して、別のパソコンでソースを
開いたら、
こんなにレイアウトが崩れてしまいます。
使っているコンパイラはBCCとGCCなのですが、
どうしたらいいですか?
>>471 ソースは同一でパソコンを変えただけなんだね。
使用しているエディタが違うとかフォントが違うとかじゃないの。
474 :
471:2007/03/01(木) 00:30:18
フォントをいじればいいのですね。
スペースとかTabで崩れてると思うし。
>>474 タブがスペース何文字分なのかは迷惑な話だよね。
476 :
471:2007/03/01(木) 00:51:51
文字サイズをいじっても良くはなりませんでした。
そのTabがスペース何文字分かを設定するのはどこからですか?
477 :
471:2007/03/01(木) 00:59:41
漏れ的には、
関数の紹介文は
/*************/
/*___________*/
こんな感じでアスタリスク埋めして正確な文字数が出てるし、
TABは避けるべきだったかなと思いますた。
文頭はいいとは思うけど。
char *NEET;
みたいに。
478 :
デフォルトの名無しさん:2007/03/01(木) 02:32:22
deleting Debugって出てメイクできないんですが、イミフです
ググったら全角スペースが原因とかプロジェクト設定をwinにすれば良いとか
出てたのですが、何やってもダメです。
ちなみにReleaseだと実行できます。
何が原因なのでしょう・・・?
コンパイラはbccです。
>>478 bccを捨てるのはどうでしょう。
>>477 囲う手間の割りに見栄えがよくないので、左側だけにすることをお勧めします。
ついでにDoxygenコメントを埋めてこんな感じ。
////////////////////////////////////////////////////////////////
/// \brief あーたら処理
///
/// なにやら処理するらしい。
/// \param[in] para パラメータ構造体
/// \return 処理結果
/// \author だれそれ
/// \date いついつ
//
説明を書き換えるだけで右側の桁を揃え直す手間を掛けるなんてナンセンスですよ。
480 :
デフォルトの名無しさん:2007/03/01(木) 09:19:13
class classname
{
classname(): root(0) {....}
}
とあったんですが、この書式って正しいんですか?正しければ意味とか説明があるサイトを紹介してくださいませ。
僕の持ってる本にはこのような書き方が載ってないです。。
(標準講座C++)
コンストラクタ 初期化リスト でググれ
>>480 メンバにrootという変数があるなら正しい。コンストラクタ初期化子でぐぐれ。
ちなみに俺が買った教本にも載ってなかった(C++クラスと継承完全制覇)
クラス周りではかなり重要な項目だから、
載せてないなんて信じがたいけどなあ…
>>481,482
さんきゅ!分かりました。
本買い直すかな。。
485 :
デフォルトの名無しさん:2007/03/01(木) 15:06:57
C++でディレクトリ操作することは可能ですか
>>484 標準講座C++(独習も)はいい本だから買いなおさなくてもいいよ。
コンストラクタでの初期化子についての記述が無いのは有名なバグ。他の内容はわりといい。
>>485 ディレクトリ操作は OS 依存になるから、
OS がワカランとはっきりしたことは言えない。
大抵は mkdir と chdir があると思うが、
もっと複雑なディレクトリ操作のできる API が
OS ごとに用意されてると思う。
488 :
463 461:2007/03/01(木) 21:33:57
489 :
デフォルトの名無しさん:2007/03/01(木) 22:28:08
vxworksでUDP受信のみ(ブロードキャスト)でタイムアウトを検出するにはどうすればいいでしょう?
winsockとかにはそれらしいのがあるのですが、socklibには無いようで・・
とりあえず、ブロッキングされてると、タイムアウトは検出できない気がしました。
環境がまだないので試してませんが、↓のようにすれば受信はできますでしょうか?
アドバイスよろしくお願いします。vxwoksとか検索しても出てこない(ノ-`)
*********************************************
struct sockaddr_in my_recaddr;
my_recaddr.sin_family = AF_INET;
my_recaddr.sin_port = portNum;
my_recaddr.sin_addr.s_addr = INADDR_ANY;//ブロードキャストを受信するために必要っぽい?
fd=sock(AF_INET,SOCK_DGRAM,0);
bind(fd,(struct sockaddr*)&my_recaddr,sizeof(my_recaddr));//ブロードキャストを受信するために必要っぽい?
while(1){
☆ ret = recv(fd, (char*)buf,sizeof(datasize));
if( ret ){
//他のタスクに受信データを送信
//タイムアウト解除通知+カウントしたものを初期化
}else{
//何かカウントして、タイムアウト通知
}
}
*********************************************
ブロッキングだと、受信するまで☆で止まってるという認識でいいんでしょうか?
Visual C++を使ってトランプの神経衰弱のようなゲームを作っています。
COMプレイヤーが4人、「You」プレイヤーが1人で遊ぶようにして
いるのですが、「You」プレイヤーの番が終わり、COMプレイヤーが
カードをめくったりしている間、マウスの入力を受け付けることが
できません。例えばウィンドウの右上にある「X」ボタンを押して
も反応がありません。おそらく WM_PAINT内でCOMプレイヤーの
カードをめくる処理をやっているためだと思われますが...。
COMプレイヤーがカードをめくった後、少しだけ delay を入れて
めくったカードがしばらくの間表示されるようにしてあります。
COMプレイヤーの処理はどこでやると、この問題が避けれるので
しょうか?
>>490 たとえばWM_TIMERで1人ずつ処理する。
1つのメッセージでreturnせず続けて全部やるから何も受け付けなくなる。
それかスレッドを使う
>>491 &
>>492 ありがとうございます。こういう時はWM_TIMERでやるか、スレッドを
使えばいいんですね。いまだに昔のBASIC(PC-8001)や、DOS のプログラ
ミングから抜け切れてないんでそんな当たり前のようなことも思いつか
なかった....
VC++になりますが質問させていただきます
これを使って簡単なゲームプログラミングを参考書に沿って学習していってるのですが、
ビルドしたら以下のようなエラーが出ました
-----------------------------------------------------------------
\○○\my documents\○○\dicegame\dicegame\Form1.h(117) : error C2039: 'button1_Click' : 'Dicegame::Form1' のメンバではありません。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(22) : 'Dicegame::Form1' の宣言を確認してください。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(117) : error C2065: 'button1_Click' : 定義されていない識別子です。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(117) : error C3350: 'System::EventHandler' : delegate コンストラクタには 2 つの引数が必要です
------------------------------------------------------------------
書籍に沿って行っていっているのでエラーなんか出るはずないのですが・・・
なにとぞ対処の仕方をお願いします。
※○○はフォルダの名前
ネイティブと.NETの区別をつけましょう
詳細をお願いします。
プロジェクトはどれを選んで新規作成したよ。
そっから間違ってるんだよ、たぶん。
498 :
496:2007/03/10(土) 17:09:38
すいません、返事が遅れました
>>497 どれをというのは何でしょうか?
多分プロジェクトの種類は「CLR」だと思います。
すいませんがageさせていただきます
499 :
496:2007/03/10(土) 18:02:54
最初からやり直したところ、ちゃんと出来ました
お騒がせしました
今後も質問することがあるかもしれないので何卒おながいします。
500 :
496:2007/03/10(土) 18:47:18
すいません、早速質問させてもらいます
今度は
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
if (radioButtonKisu->Checked == true){
MessageBox::Show("奇数が選択されました");
}
};
}
---------------------------------------
if (radioButtonKisu->Checked == true){
↑
これを打ち込むとまたエラーが出てしまいました。
勿論、書に沿ってるだけです。
さっき解決したのでは、「 MessageBox::Show("ボタンが選択されました"); 」
のみのクラスを入れた構文であって、それにif構文を追加しただけで、エラーが出たという事です
対処法お願いします。
>教えてクン養成マニュアル
>2. 情報を開示しないこと
>トラブルの場合は、状況を正確に記述してはならない。
>「なんだかうまく動きません。」とか「エラーが出ます。」等と具体的なことは何も書かないことが重要である。
しかも解決した時も礼は言わないわ
どこをどう変えたら解決したかを言わないわで散々だな。
503 :
496:2007/03/10(土) 19:10:30
すいません、ほんとお願いします。
書籍どおりやってるのにエラー出られたらたまりません
対処法なんて分かりませんし・・・
大体エラーが出る自体分かりません
出版社にお問い合わせください
とりあえず平謝りしておいて
自分が本当に困っていることを主張するとか、
マジで教えてクンのテンプレみたいな奴だな
釣り?
>>503 いい加減にしやがれ!
こっちょは、その本を見ているわけじゃないし
お前が出したエラーを透視してみることが出来るわけじゃない。
情報を出せとか
どうやったのかいえってんのを無視すんなよ。
↓こうすればここではエラーでなくなるよ。
/* if (radioButtonKisu->Checked == true) */ {
エラーにも色々あるけど、こっちからはどんなエラーが出ているのか
お前のPCを覗き込めない。せめてエラーメッセージの丸写しくらいしろよ。
アドバイスをもらう気があるのなら。
508 :
496:2007/03/10(土) 19:31:17
>>506 それを打ち込んでもエラーでました
>>507 .\DiceGame.cpp(6) : error C2143: 構文エラー : ';' が 'using' の前にありません。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(25) : error C2059: 構文エラー : 'インライン関数のヘッダー'
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(25) : error C2143: 構文エラー : ';' が '{' の前にありません。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(25) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(183) : error C2039: 'pictureDice4_Click' : 'DiceGame::Form1' のメンバではありません。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(22) : 'DiceGame::Form1' の宣言を確認してください。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(183) : error C2065: 'pictureDice4_Click' : 定義されていない識別子です。
c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(183) : error C3350: 'System::EventHandler' : delegate コンストラクタには 2 つの引数が必要です
.\DiceGame.cpp(6) : error C2059: 構文エラー : ';'
.\DiceGame.cpp(19) : fatal error C1075: 左側 中かっこ '{' に対応するものが 'c:\documents and settings\○○\my documents\○○\dicegame\dicegame\Form1.h(4)' で見つかる前に EOF が検出されました。
以上のエラー出力が出ました
○○はフォルダ名
すいませんがよろしくおながいします
{と}の数があってない。
文法知らないならやめておくべき。
>>508 どっかで間違えて
そのせいで次のところがエラーになって
以降ぼろぼろってヤツだな。
511 :
496:2007/03/10(土) 19:37:24
どういうことですか?
512 :
496:2007/03/10(土) 19:38:04
>>510 本に沿ってるだけで間違うなんてことはありえません
それにまだ序盤です
>>511 CやC++の使い方を知らないうちに
ウィザード頼りにプログラムを書き始めるのは無謀だ、ということ。
>>512 間違えていないんじゃ直すこと出来ないな。
何の本か知らないけど
その本が古いとか。
516 :
496:2007/03/10(土) 19:41:42
すいません、説教はいいので解決法をお願いします。
はいはい釣り師釣り師
>>516は偽者です。いい加減にしてください。
本当に困っているのでなんとかしてください。おながいします。
519 :
496:2007/03/10(土) 19:45:05
>>518 正直言って判らない。
これってC++を拡張したC++/CLIってやつだよね。
そっちのスレニ池!
こういうのって最初のエラーを直すと以降のエラーが変わるかもしれない。
.\DiceGame.cpp(6) : error C2143: 構文エラー : ';' が 'using' の前にありません。
ここかここより前にへんなことが起きているのかしら。
>>519 いい加減にしてくださいと言っているでしょう
怒らせないでください
どう考えても釣りなんだからスルーしとけよ
524 :
デフォルトの名無しさん:2007/03/12(月) 11:56:59
>>489 もう見てないor解決してると思うけど…
>vxworksでUDP受信のみ(ブロードキャスト)でタイムアウトを検出するにはどうすればいいでしょう?
selectを使って受信の検知とタイムアウトを行えばいい。その為の関数だから。
>ブロッキングだと、受信するまで☆で止まってるという認識でいいんでしょうか?
いいと思うよ。エラーでも返ってくるけどね。
ビルドエラーしたさいの対処法が分かる書籍とか売ってますかね?
そんなネガティブな本あるのか…
>>525 ビルドエラーは固有のモノも多いから専門書籍はないと思う
クリティカルなエラーならヘルプを見るのが一番いいんじゃないかな
たとえばVisual Studio使ってるならエラー番号で検索掛けると原因と微妙ながらも対処も出てくる。
コンパイラの名前とエラー番号を条件にググるのもアリかと。
>>527 VC++を使っております。
これでも同じように対処できますか?
>>528 これでもってVC++のことか
Visual Studioのことじゃないか
>>528 VCでも問題無い筈。
デフォルト設定ならF1押すとヘルプでない?
コンパイラやバージョン変われば役に立たなくなる本なんて作らないだろうな。
作ってもたまに注文があればいいほうですぐに返品でしょ。
それにどうせお前らは奇怪なコード書いて
それに対して奇怪なエラーメッセージが出るから
対処法なんて予測不可能で難しい。
>>529 EEです(Express Edition
>>530 ヘルプは出してます。
問題の、出力エリアに表示されるコンパイルエラー内容を解決したいのですが、
トークンがどうのこうのインラインがどうのこうの色々出ておりまして・・・
これをほんと、どうにかしたいのですが
try~catchで0除算エラーが起きた場合に投げられるエラーの種類を教えてください。
基本的にC++の例外処理で捕まえられるものではない。
でもVisual C++なんかだと/EHa付けておけばcatch (...)で捕まえられる。
_set_se_translaterを使えば自作の例外クラスのオブジェクトに変換できる。
>>532 ヘルプは出すだけじゃダメだ
後、使ってるのがC++だからここで質問したんだと思うが
でもな聞いてるのはVS固有の問題だろ?
つまりスレ違いだ。
例外に関して、よく「巻き戻す」という表現をすることがあるようですが
巻き戻してもう一度tryブロックの最初からやり直すようなことはできないのでしょうか?
HANDLE h = NULL;
try
{
function(h);
}
catch(null_exception& e)
{
write_log();
h = valid_value;
}
こんな感じになる処理できるかと思ったのですが・・・
コンストラクタの動作について質問です。
画像の描画を行うクラスがあり、そのコンストラクタ内部で
データの読み込みを行っているのですが、その読み込みに失敗した場合は
クラスのインスタンスを作成しないようにしたいのです。
class drawImage {
drawImage() {
//グラフィックデータのロード
if( loadFile(filename)==FALSE ) {
// ロードに失敗したら
}
//成功したらパラメーターの初期化等を行う
}
drawImage *img = new drawImage(); // ←初期化に失敗してたらNULLが入ってて欲しい
このようなクラスがあったとして、
インスタンスを作成する際に画像データの読み込みに失敗したらimgにはNULLが入るようにしたいのです。
こういう場合はどのように記述すればよいのでしょうか?
それとも、こういう事は出来ないのでしょうか?
できれば例外を使わないで実装したいのですが・・・
drawImageクラスをsingletonにしちまう
。。。factory
>>537 作り方が変過ぎる。
オマエのコンストラクタがロードに失敗した事を呼出し元に返せるならnewを自分で書けばできる。
newは演算子だからな。
>>536 これでどう?
HANDLE h = NULL;
for (; ; ) {
try {
function(h);
break;
}
catch(null_exception& e) {
write_log();
h = valid_value;
}
}
>>536 でも、C++の例外でやり直し型の例外がないのは要らないと言う結論に達したから。
もうgoto使っちゃえよ
544 :
デフォルトの名無しさん:2007/03/14(水) 15:32:58
537です。
>>540 >オマエのコンストラクタがロードに失敗した事を呼出し元に返せるならnewを自分で書けばできる。
コンストラクタが値を返せるようにできるんですか?
newをオーバーロードすれば、
>>537のような事ができるんでしょうか。
やり方があれば教えて欲しいです…
で、new をオーバーロードしたとして。
ローカルに作ったやつはどーすんの?
コンストラクタをprivateにするか、使用可能/不可能フラグ使うか、
好きに選べばいいんじゃない?
いや、元の質問者はどういう想定をしてるのかなと
後者を考えていたに1票
コンストラクタは引数持てないだろ・・・
だから「オマエのコンストラクタ」ってワザワザ書いてる
方法は
>>547が書いてくれてる通りフラグを持たせて外部で判断
>作り方が変過ぎる。
↑を無視するな
オマエがしたいと言うから答えたが、インスタンスを拒否するクラスなんて聞いた事が無い。
newでしか作れないクラスって普通オカシイと思わないか?
>>551 コンストラクタの機構だけでしたいって事だからスルーされたんじゃないのか?
553 :
デフォルトの名無しさん:2007/03/14(水) 17:32:20
537です。レスありがとうございます。
class drawImage {
drawImage(char* filename) {
//グラフィックデータのロード
if( loadFile(filename)==FALSE ) {
// ロードに失敗
}
//成功したらパラメーターの初期化等を行う
}
drawImage *img = new drawImage("image.data"); // ←初期化に失敗してたらNULLが入ってて欲しい
if(img==NULL ) return; // インスタンスがなければ処理を抜ける
こういう使い方を想定しています。
>>547さんの言うように使用可能フラグを使うとすると、
毎回状態をチェックして自前でdeleteしてあげなくてはならないので面倒かなと。。。
コンストラクタ内の初期化で失敗していたら勝手にdeleteされる
(そもそもインスタンスが作られない)という風にしたかったんです。
>>550 >オマエがしたいと言うから答えたが、インスタンスを拒否するクラスなんて聞いた事が無い。
確かにそうですが、エラー処理で初期化失敗してたらdeleteするようなケースだと
最初っからインスタンスが作られなければ便利だと思ったので…
こういう考えってあんまり一般的ではないんでしょうか?
>newでしか作れないクラスって普通オカシイと思わないか?
ああ!スイマセンわかりました!!
もし俺が言うような仕組みが実装できた場合、newじゃないインスタンス化が出来なくなりますね。
drawImage img;
↑のような場合にコンストラクタ内部で失敗したらどうなるか考えてませんでした…orz
フラグなりfactoryパターンなりで実装します。
お騒がせしました。
超超低レベルな質問だが、C言語のコンパイラの仕方が分からない……。
BorlandからソフトもDLして、インストールもしたんだが……。
どうすればいいのですか?
×コンパイラの仕方
○コンパイルの仕方
bcc ****.cと入力してエンタ押しても、
エラー E2209 ****.c 1: インクルードファイル 'stdio.h'をオープンできない
警告 W8065 ****.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main)
と出るだけ……
>>555 ソフトによって違う。
説明書で調べてわからなかったところを専用スレで聞け
>>558 環境変数 INCLUDE を設定していない。
フリーソフトだから説明書はありません。
562 :
デフォルトの名無しさん:2007/03/14(水) 17:45:29
>>558 そりゃお前インクルードパスが通ってないんだよ
インクルードパスって何ですか?
×インクルード パス
○インド クルー パス
565 :
デフォルトの名無しさん:2007/03/14(水) 17:47:32
>>563 bin/bcc32.cfg
は設定したぁ?
binフォルダにbcc32.cfgというファイルを作って
-I"c:\borland\bcc55\include"
-L"c:\borland\bcc55\lib\PSDK"
-L"c:\borland\bcc55\lib"
て書けばいいと思うよ。
ReadMeくらい読めよな低脳
低脳なのは認めますが、できませんでした
悪い
>>565 の各パスは自分の環境に合わせてくさい。
全てデフォルトのままだから合ってるはずなんですが……
おーけーわかった
コンパイルの時に、
bcc32 -I"パス" [ファイル名]
でやってみて下さい。
パスはbinフォルダのIncludeフォルダを右クリック→プロパティの、[場所]という 所に書いてあります。
例えば
bcc32 -I"c:\borland\bcc55\include" [ファイル名]
こういう感じです。きっと出来るとおもいます
できません……。
上と同じエラーがでます
>>570 では、
binフォルダのパスを教えてください。
パスはわかりますか??
C:\Borland\Bcc55\bin
です
573 :
デフォルトの名無しさん:2007/03/14(水) 18:19:06
そのbinフォルダにIncludeというフォルダはありますか?
おいおいどこのサポートだよ
ありませんでした。
でも、作っても無理でした
作ったって、中にstdio.hが無けりゃ意味ねーだろ、インストールしなおせ
577 :
デフォルトの名無しさん:2007/03/14(水) 18:26:02
Includeファイルがそもそもねーのかよ!!!!!!
大爆笑だよ!
>>573 の内容が気になる
binと同じ位置にあるか聞いたつもりだったのだろうが、
中にあるかを答えてる気がする。
>>578 そ、それは笑えねぇギャグだぜ・・・(ゴクリ
うぁ……、そのギャグの通りです……。
もう一度インストールしてみました。
でも、Binと同じ位置にIncludeはありますが、その中にstdio.hはありません。
自分で作るんですか…?
・・・・
ちょっと待て、いったいどれをインストールしたんだ?
どれ、というのはどういうことですか…?
freecommandlinetools_update.exe をクリックして、次へを押し続けただけです
今ダウンロードしてインストールしてみたが、ちゃんとできたぞ
ファイル名は freecommandlinetools2.exe だった
updateはインストール済みのbccがいるんじゃないのか?
マジですか……!!
そこのURL教えてください
もう外出ちゃって携帯だ
bcc フリー
でぐぐって最初のページだったかな
外出中も携帯からこのスレをみてる
>>583に軽く感動した
できましたぁぁ!!!
ありがとうございました!!!
588 :
デフォルトの名無しさん:2007/03/14(水) 20:00:16
失礼します。あまりに初歩的なことで恥ずかしいのですが・・・
Visual Studio 2005 Standard Editionに入ってるMFCを使ってるんですが、
↓のコードを実行しようとすると必ずエラーになります。
// CMy652View メッセージ ハンドラ
void CMy652View::OnTestTest()
{
AfxMessageBox("Hello");
}
エラー一覧には↓が表示されます。
エラー 1 error C2665: 'AfxMessageBox' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
これはどうしたら改善できるでしょうか。
590 :
デフォルトの名無しさん:2007/03/14(水) 20:06:33
>
>>589 ありがとうございます!見事に表示できました
感動しました、あなたが神ですか。
簡単な計算式を表示させると、即ウィンドウが消えるんですが、それでいいんですか?
>>591 それコンソールアプリでしょ。
そして表示後プログラムが終了しているんでしょ。
Windowsならコマンドプロンプトを起動して
そこで実行すればいい。
>Windowsならコマンドプロンプトを起動して
どうやるんですか?
スタート→プログラム→アクセサリ
さんくすあろっと
どうやらこのスレには天才が住んでいるようだな
俺には及びもつかん
ファイル名を指定して実行 → cmd
char temp[10];
gets(temp);
でいいじゃん
ダメ。それをやるなら、getchar()の一つでも置く方がよっぽどマシ。
コンソールプログラムならconio.hインクルードしてgetch()がとてもオヌヌメ。
dosのpauseコマンドみたな感じで止まる。
エンターキーじゃなくても進むし。
インプットファイルに
ABCDE FGH IJKL
というような文字列があるとして、ブランクごとに抽出したい(ABCDEとFGHとIJKLの3つとして取り出す)
のですが、どうすればよいですか?
602 :
601:2007/03/15(木) 13:43:06
ちなみにC++の方です。
strtokでいんでね?
#include <string>
#include <fstream>
std::string a, b, c;
std::ifstream is("hoge");
is >> a >> b >> c;
605 :
601:2007/03/15(木) 14:06:25
>>603,604
すいません、stringでやったら普通にできました。
でも、ABCDEを抽出した後A B C D Eというように文字一つ一つ分けたいんです。
上手く説明できないのですが、
Aなら1、Bなら2、Cなら3、Dなら4、Eなら5、そしてその総和がいくつかという問題で、
文字の個数がバラバラでfinを使うわけにもいかなくて…
どなたか教えて頂けないでしょうか。
>>605 >604のa, b, cから一文字ずつ取り出せばいいだろ。
607 :
デフォルトの名無しさん:2007/03/15(木) 14:37:31
オーバーロードすることが可能な演算子 <<= の本来の役割って何なんでしょうか?
グローバルな演算子オーバーロードに = が使えないので
代わりに使おうかなと考えているのですが・・・
+= とかとかわんないよ。
foo = foo << 4;
なるほど
ストリームと関係のない所で使ったらややこしいか・・・
ストリームじゃなくてビットシフト
ストリームもビットシフトを使わないからまったく別の用途でオーバーライド
ビットシフトの可能性があるようなクラスでもない限り、<<=があったからってビットシフトだなんて思う香具師はいないだろ。
ビットシフト失念してました
void operator〜
{
CharStringToWideString(l,r);
}
みたいな定義なんでビットシフトと間違えることは多分ない気がします
そういや、ストリーム I/O にビットシフト演算子使ったのは何処の莫迦なの?
D&EによればDoug McIlroyが提案したと書いてある (8.3.1)。
便利は便利だが全く気持ちが悪いな
>>614 f(void) が気持ち悪いと言った人が
<< >> は気持ち悪くなかったんかいな。
…つーか、あんまり考えるのやめようかな。
言語仕様のすべてが汚物に見えてきそうだ。
普通の関数がずらっと並ぶより、演算子を並べるほうが気に入ったらしい。
POINT、RECTのdouble版short版ってあるんですか?
POINTSは見つかりましたが、他のが見つかりません
あります。
少なくとも私のディスクの中に。
良かったら教えてください
探すより自分で作っちゃった方が早くね?
というかRECTって組み込みで用意されてたのか
>>622 <windows.h>の中(でインクルードされているヘッダのどこか)で定義されている型。
型っていうか単にint型変数が4つ詰まっただけの構造体
それは知ってるけども。
ここって、特に環境を示さない場合は
デフォルトで言語か標準ライブラリの話になるんじゃないのか
windows.hは言語でも標準ライブラリでもない、迷惑な質問だ。
そんな迷惑な質問が、まともな回答されないのは自然な流れ。
迷惑だとか思うならスルーしとけばいいじゃんよ
みんな優しいからだろ。
C言語の知識を使って、在宅アルバイトをしたいんですが、
いいのありませんか?
月に2万円程度の稼ぎでもいいです。
ちなみに、C言語はそれほど詳しくありません・・・。
これからもっと勉強するつもりですが。
お前みたいな馬鹿でも勤まるそんなバイトがあったら
このスレから回答者がいなくなると思わないか?
職安でぐぐれ
632 :
629:2007/03/15(木) 22:18:20
思わないですよ。
在宅アルバイトには、キーボードで入力するだけのものもあるんだから、
プログラミングを生かすアルバイトでも、別に僕にできるものだってあってもおかしくないと思いますが・・
Cで難しければ、javascriptみたいな単純な言語をこれから勉強してでも始めたいです。
経験者ですって偽って応募するといいよ
あと街のほうなら職歴不問のところもある筈だからネットの求人でも求人誌でもじっくり探して見れ
正直、プログラム作成を
社会経験のない実績のないしかも在宅に任せられないでしょ。
テープ起こしみたいな仕事なんじゃない。
>>629 結局の所、信用だから会社作ればいけるかも知れんぞ
募集なんてこんなもん。
プログラミング→Spamメール書き
データ入力→出会い系もどきのサクラ
データ処理→アンケート調査にかこつけた無店舗販売
C++の入門書を一通り終了して生まれた疑問。
本のソースプログラムとかだと、実行すると基本的にコマンドプロントで結果だの何だのが出るよね。
ちゃんとしたソフトウェアってどうするのさ。
ちゃんと専用の画面が開いて、[ファイル]とか[表示]とかそういうのつけるのとか、サパーリ分からんわけよ。
そこら辺解説した本とかサイトとかないかね
WindowsプログラミングとかVisual C++とか書いてある本見ろ。
ああ、ウィンドウズプログラミングってそういう意味だったのか
ありがつー
641 :
デフォルトの名無しさん:2007/03/17(土) 02:06:11
プログラミングを始めるには何かソフトをかわないといけないんですか?
いいえ、必ずしも買う必要はありません。
643 :
デフォルトの名無しさん:2007/03/17(土) 15:29:52
構造体アナライザみたいの作りたいのだが
構造体のメンバの一覧を得る方法ってあるのだろうか?
ヘッダファイルをテキストで読み込んで解析する、でいいのかな?
VC++のオブジェクトブラウザでFA
>>644 linuxで既にある巨大な共有メモリの構造体を
ダンプできるようにしたいのよ
> 構造体を
> ダンプ
ソースコピペでおk
上手く伝わらないorz
デバッガ用のツールでメモリダンプするの作るんだけど
どうせならユーザーが構造体のメンバとか
見れるようにしたいのよ
階層深いところまであるからインタフェースは
まだちょっと悩んでるんだけど
>>647 デバッガ用のツールなら、デバッガにその程度の機能はあるんじゃないのか?
シンボルって出力できなかったっけ?
まぁ俺はそこまでデバッガ使いこなしてないけどな
×デバッガ
○デバッグ
とりあえず、無理っぽいのかな?
コンパイラ連携型のデバッガは大抵できるな
よくしらんけどinsightのソースでも読んでみたら?
作成済みのpthreadが実行中かどうかを知るにはどうしたらいいでしょうか?
>>653 pthreadには終了待ちのjoinしか無いんじゃない?
だからソケットかグローバル変数使うんじゃないかな。
やりたい事が判らないから、的外れだったらすまん
「出力は入力データセットと同数の行でなければならない」
っていうのは
入力A
出力A
入力B
出力B
みたいに1行ごとに出力していくのと
入力A
入力B
入力C
出力A
出力B
出力C
みたいに最初に入力してあとで一気に出力するのとどっちの
タイプでも良いんでしょうか?
その文章を書いた奴に聞け
テンプレートクラスにパラメータとして与えた型の種類を問わず、
そのテンプレートクラスのオブジェクトを指せるポインタって作れますか?
void*
テンプレートクラスに共通の親を持たせるとか。
#で、なぜそんなポインタを持ちたいんだ?そのポインタで
#何を処理するわけ?
AクラスにテンプレートクラスT<A>へのポインタを持たせたくて、
BクラスにテンプレートクラスT<B>へのポインタを持たせたくて、
Cクラスに・・みたいな状態になっているので、
A、B、Cの基底クラスにそういうポインタを持たせたかったんです。
ポインタに行う処理も共通のものですし。
A,B,Cには共通の親が居るんだろ?
親もテンプレートにすれば解決。
えーと
template <class T> class Parent {
X<T>* p;
};
として、
class A : public Parent<A> {/*〜*/};
とすればよいということでしょうか?
テンプレートへの理解が足りないようですな、俺orz
勉強しなおしてきます。回答ありがとうございます。
>>661 それだとParentがクラス変数を持っているときに困るかも
>>658の言うようにXに共通の親を
持たせればいいんだろうけど、Xが有り物だと無理だな
入力:AabB
↓
出力:aABb
みたいに、大文字を小文字、小文字を大文字に変換するには
どうすれば良いですか?
>>663 ctype.h
isupper()
tolower()
とか(引数略
Shift_JISとかはアーアー見えなーい(ry
665 :
663:2007/03/22(木) 03:20:45
>>663 char配列なら自作関数でも直ぐにかける気がする。
for(int i=0;i<len;++i){
if(str[i]>='a'&&str[i]<='z'){
//文字コード知らないから分からないけど定数を足すか引くで変換できるはず
}else if(str[i]>='A'&&str[i]<='Z'){
//同文
}
}
こんな感じで
>>666 isupper, islower, toupper, tolower
しかも文字コード知らなくてもできるし
669 :
デフォルトの名無しさん:2007/03/23(金) 11:18:46
今、話題の黒ウーロン
これって3トリーが必死で安売りを阻止してる。
課長クラスが店に乗り込んでいって値上げ交渉をしてるし。
これって法令違反?
厳密に言えばグレーだけど。
公取にチクれば注意は受けるかもな。
ちなみに店への納入価格は
350で@120
1Lで@320くらい。
仕様変更を見越した設計って可能なんすか?
仕様変更が分かってるなら書く必要なくね?
そのためのOOP
だと思うorそういうことになってる
日曜大工感覚で作るアプリって徐々に機能追加したくなるじゃん?
で、後から部分を最適化してパフォーマンスをあげる事もやりたくなるじゃん?
そういう機能の追加や削除、改変に柔軟に対応できる設計手法ってなんかありそうで無いような
そんな気がする
ある程度組みあがったらそれを捨てて、また一から設計しなおすってのもあるけど
そういう手はあまり使いたくないじゃん?
(そりゃあ何年もかけて作ってるようなアプリだと何回か遭遇するもんだとは思うけど)
>>670 その業界、会社、担当者の性格等に馴染んできたら
「こういうのがあると嬉しいんだろうなあ」くらいの予想はつくかも試練が
全く予想外の方向から覆される事も少なくない。
>>669 なにが厳密に言えばグレーだよ。 んなもん黒に決まってんだろが!
・・・黒ウーロンなんだから。
676 :
デフォルトの名無しさん:2007/03/24(土) 04:14:35
組み込み系のスレって無いのかな?
OSが Nucleus Plus で MULTI を使って開発してんですが、
printf系の関数で %f の編集がうまく行かないのです。
<Sample Code>
double a = 123.456;
char buf[256];
sprintf( buf, "%f", a);
このコードで編集された結果が
0.00000
みたいになります。
組み込みってあんま詳しくないんだけど、
仕様なんですかね?
整数と文字列は正しく編集されるんですが。
>>676 double じゃなくて float ならうまくいくとかそんな気がしないでもないが、
多分、それはその実装固有のバグじゃね?
printf系の関数は実装が結構面倒だし、バグを抱えてる実装は珍しくはないぞ。
%lf じゃないとダメとか……
そんなこと関係ないよね?
バグというより、実数演算ライブラリを自動ではリンクしないだけなんでね?
試しに、double a = sqrt(2);にしてみたら?
681 :
デフォルトの名無しさん:2007/03/24(土) 12:03:48
>>677-680 ありがとうございます。
floatも試したけど駄目だったんだよねぇ。
まあ、当面は使う予定ないから良いけど。
>>680 何をリンクしたらいいのかな。
あんま詳しくないもので、まあ、調べてみます。
int test[]={
0,111,222,333
};
という内容の fTest.datがあります。
インクルードすればそのままtest[0]などを取り出せますが、
これをfopenでファイルを開いてから値を取得するプログラムを組んでいます。
test[0]に当たる数値の位置が固定であればSEEK_SETで、
ダメならwhileで'{'の次の位置まで来、fscanfをして値を取得しています。
無理やりな感じがしますが他に方法はあるのでしょうか。
一番はfTest.datの中身を数値だけにして取得しやすいようにすればいいのですが
現状のファイル内容で他に数値の取得方法があれば助言お願いします。
数字とカンマ、改行以外を飛ばせばあとはcsvとかわらん
ありがとうございます
アクティブなウィンドウのexe名を取得するにはどうしたらいいですか?
CにもC++にもウィンドウを表示する機能などというものは備わってないので
アクティブなウィンドウのexe名を取得する方法というのも存在しません
>>685 お使いのウィンドウシステム関連のスレへどうぞ。
688 :
デフォルトの名無しさん:2007/03/26(月) 13:32:55
Cでスクリーンショット撮ってクリップボードや適当な画像ファイル形式に保存する
プログラムを作成したいんだけどどうしたらいい?
690 :
デフォルトの名無しさん:2007/03/26(月) 14:06:10
非常にくだらない質問かも知れないのですが、C++にはアクセサはありましたでしょうか?
C#でprivate宣言したメンバをset/get使ってアクセスするやつ。
ググっても出てこない・・・
>>690 ない。ただしjavaのようにgetXX/setXXのようなルールを決めてそういう目的で使うことは普通にある。
C++/CLIにはあったりするんで、そっち方面なら話は別。
まあ無茶すれば
template<typename T>
struct proxy
{
proxy<T>& operator=(const T&){〜}
T& operator T(){〜}
};
class hoge
{
private:
int i_;
public:
proxy<int> i;
};
という風にすればなんとか…
自分で使おうとは思わないけど。
C言語で引数を使わずに関数に変数渡しをしたいのですが
どのように記述すればよいのでしょうか?
#呼んでいる関数はアセンブラです。
int hoge(void)
{
int addr;
addr = 8000;
func_a();
}
func_a()
{
mov (addr),d1
mov 0xa,d2
add d1,d2
}
スタックかレジスタに積まれてるだろうから
そこから持ってくればいんじゃね
デバッグ情報を駆使して、呼び出しもと関数の
スタックフレームを調べるということでひとつ。
#最適化で変数が消えていても泣かない
string関数を使わずに
文字列の長さを取得するにはどうすれば良いでしょうか?
strlen()
>>698 string関数とは何ぞや。
std::stringクラスという意味ならstring.hのstrlen()で。
それもダメだというなら自分で数えれば宜しい。
文字列というのがヌルターミネートのchar配列のことだとしたら
\0 が来るまで数えればいいじゃないか
>>701 ヌルターミネートを含むchar配列なんだったらstrlenを使うべきじゃないの?
あと、よく「ないなら自分で作れ」的なこと言うヤツいるけど、
それってアホ化する第一歩にしか思えん。。。
誰でも思いつくような便利関数はもともとあるかすでに誰かが作ってるから
それを探し出して使うべき。
自分で作るのは、調べ尽くし、どうにもならなくなったときだけにしる。
>>702 元の質問者がstring(str?)関数を使わずに、と言ってるんだから
あえて逆らってみる。
size_t strlen(const char* s)
{
size_t len = 0;
while (*s++)
len++;
return len;
}
俺がエスパーするに…
>>698はVC++.NET2005あたりを使ってて、System.Objectをusing指定できない
OLEか何かを作っており、Stringクラスが使えないからConvert::ToString関数
など変換クラスあたりの代替になるものはないか、と言っているのだと思う。
それが当たってたらすごいw
C/C++の初心者質問スレは、たくさんあるからなあ
++iとi++の違いを教えてください。
前置 後置 インクリメント演算子でググれ
式の値がi+1かiかの違い。副作用は同じ。
>>707 違いなんて無いだろ。
俺はこのスレが1000まで行っても次スレは立てないでそこへ合流すればいいと思っている。
714 :
100:2007/03/28(水) 00:19:06
最後赤の方、お疲れ様でした。
久々の30台、 全然動けねぇ…
そして遅くても関係無く中段貰う俺テラヨワス…
Vで一矢報いることが出来たのが幸いでした…
誤爆スマソ
どこへの誤爆だよ…
717 :
デフォルトの名無しさん:2007/03/30(金) 11:55:25
WinXP SP2, VC++ Ver.6 SP6です。
LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です
ビルドの際に上記のエラーが出るので、プロジェクトを新規にConsole
アプリケーションで作り直しました。そのときは快調に動くものの、
セーブして後日開くとまたWin32アプリケーションに戻っています。
これは何が原因なのでしょうか? よろしくお願いします。
まさか、プロジェクトを保存してないって落ち?
2次元配列の先頭アドレスを変数に入れて扱う場合,その変数はどんな型に宣言したらよいのでしょうか?
int array[3][10];
int **A;
として
A=array;
としてみたのですが、不正な代入という警告がでます。
キャストしてやれば警告がでませんが、根本的に間違ってるような気がします。
int (array[3])[10];
と見れば、これは「int [10]が3つ」あるわけで、それを指すポインタは
int (*A)[10];
>>719に便乗して質問。
この場合、 array の式の中での型は int (*)[10] でいいんだっけ?
722 :
721:2007/03/30(金) 14:38:03
スマソ
時間差で重なった
723 :
720:2007/03/30(金) 14:45:57
補足。
int *A[10];
だと、
int *(A[10]);
とみなされて、「int * が[10]個」になってしまう。
この辺りは慣れるしかない。
>>721 そう。
因みに、「10」とかベタで書くと後で変更するとき困るのは
言うまでもない。
#define N 10
とするか、または
typedef int ARRAY[10];
ARRAY array[3];
ARRAY *A;
とでもした方がいい。
>>720-722 ありがとうございます。
たしかに警告消えました。
それにしてもはじめて見る書き方です。
使い方をしらべてみます。
725 :
721:2007/03/30(金) 14:53:22
>>723 なるほど。
こういうのをしっかり解説してる本って無いのかな…
726 :
717:2007/03/30(金) 14:58:00
>>718 んなわけナス。保存してファイルで日時も確認しているから不思議なんだす。
727 :
717:2007/03/30(金) 15:00:27
>>718 補足
そもそも新しく作り直しているんだから、セーブしなけりゃプロジェクトそのもの
存在しない。
確かに、新しく作っといて過去のを開きなおして「まただorz」って言うのも
一回あったけど。
728 :
デフォルトの名無しさん:2007/03/30(金) 15:03:51
VC++のMDIで、アクティブなビューが変わった事をMainFrmで知りたい場合、どうするんだっけ。。。
>>727 随分態度でかいけど、作り直さないで修正だけして保存してもダメなの?
#実は作り直した積もりで毎回同じ古いのを保存しているだけだったり。
質問失礼します。
pBuf= new char[14];
上記のコードを実行すると、
void *operator new[](size_t size)
ではなく、
void *operator new(size_t size)
が呼び出されます。
なぜでしょうか?
分かる方お願いします。
733 :
デフォルトの名無しさん:2007/03/30(金) 16:55:25
>>729 >作り直さないで修正だけして保存してもダメなの?
Win32アプリケーションでプロジェクト作っといて、コンソールアプリ
ケーションに変更するなんてことできたっけ?
リンカの設定でサブシステム切り替えればできるんじゃない
>>733 できるんじゃ?
Wizardからしか設定できない隠し項目とかないでしょ。まさか。
>>717 同じ名前のプロジェクトがいくつもあるんじゃないの?
>>733 「C/C++」タブの「プリプロセッサの定義」:
_WINDOWS ⇔ _CONSOLE
「リンク」タブの「プロジェクト オプション」:
/subsystem:windows ⇔ /subsystem:console
でリビルド。
737 :
717:2007/03/30(金) 18:53:38
>>736 神
エラーは吐かなくなったけど、実行したらdos窓が出た瞬間にとまるorz
main関数の実行まで行っていないような・・
まさか、瞬間的に処理が終了してdos窓が閉じただけって落ち?
>>732 コンパイラが仕様に完全に準拠してないから。
740 :
732:2007/03/30(金) 20:52:28
>>739 返答ありがとうございます。
それは強烈ですね。。。
ガベコレによる演算子チェックは諦めます。。。
今どきそんなコンパイラあるのか?
何使ってるの?
あるサイトから複数の.cppや.hファイルの入ったフォルダをダウンロードしました
このサイトやRADEMEなどありませんでした
これを実行したいんですがどうしたら良いでしょうか?
基本的な手順が書いてある参考になるサイトなどはご存知じゃないでしょうか?
自分でも検索してみたのですがなかなか見つかりません
ちなみにBCCとBCPadはインストールしてHelloWorldぐらいは実行できます
よろしくお願いします
そのサイトを書いた方が早いとは思うが
その .cpp や .h にコンパイル方法が書いてあることもある。
C言語の関数ポインタについて質問があります。
void (*p[2])(void) = {
a,
&a,
}
上記のようにaとしても&aとしても同じで関数aが*p[0], *p[1]に入るのですが、
どちらが正しい記述なのでしょうか。
ちなみにVCCで試しました。
コンパイラの話なのか、言語の話なのかもわからないのですがよろしくお願いします。
>>745 前者は後者を省略形の扱いになるんじゃなかったっけ?
確か、これは言語の仕様で、コンパイラは関係なかった気がする。
747 :
742:2007/03/30(金) 23:22:21
>>743 >>744 レスありがとうござます
BCPadでmakeしてみたのですがエラーが出ました。
それによるとg++がどうのこうのとのことで、makefileを見てみるとg++とかgccなどの記述がありました。
これってBCCじゃなくてGCCを使う必要があるってことでしょうか?
>>747 C++はしっかり互換性を意識してやってないと他のコンパイラじゃ
まともにコンパイルが通らないことがフツー。
てか、どこのサイトだよ? 教えてくれればもっと適切にアドバイスできるんだけど。
>>745 どっちでもおk。常識的にはaは「関数」であるんだから、
aとだけ書いて「関数へのポインタ」に置き換えられるのはヘンな話だけど
なぜかCには「関数は式の中では関数へのポインタに置き換えられる」っていう規則がある。
だから前者でも後者でも関数へのポインタが入るし、その後の関数呼び出しも
p[0]();でも(*p[0])();でもおk。間接参照演算子を使って「関数へのポインタ」から「関数」を手繰り寄せても
↑の規則のせいで速攻「関数へのポインタ」に置き換わる。つまり関数へのポインタに*つけても何もしない。
つまりぶっちゃけ(**********p[0])();っていう関数呼び出しも通る。
ただ後者の方が丁寧な書き方ではあるとは思う(少なくとも俺は読みやすい)。
>>747 makefileあるならmakeできるんじゃ。
Windows環境でgcc+makeしたいならCygwin入れると楽(自分がやってるだけだけど)。
>>745 式中にある呼び出されない関数は関数へのポインタに成り下がるから、
a が関数なら a, &a, *a は等しく関数aのポインタを意味する。
>>745 ようするにどっちも正しい記述。
お前が気に入った書き方をすればいい。
752 :
742:2007/03/30(金) 23:38:19
>>748 ありがとうございます
身元がばれるかもしれないのでサイトを晒すのはちょっと(^^;
>>749 はい、gccを使えばmakeできそうです
週末を使ってgccの使える環境を整えて再チャレンジしてみたいと思います
753 :
745:2007/03/31(土) 13:20:57
754 :
740:2007/04/02(月) 14:46:44
>>741 VC++ 2003 を使用しています。
答えになってます?
>>754 俺も2003だが、以下のコードで普通にnew[]の方を呼ぶよ。
自分でnew[]を書かなければnewaop.cppの
void *__cdecl operator new[](size_t count) _THROW1(std::bad_alloc)を呼ぶ。
void * operator new[](size_t nSize)
{
void * ptr = malloc(nSize);
return ptr;
}
void * operator new(size_t nSize)
{
void * ptr = malloc(nSize);
return ptr;
}
int _tmain(int argc, _TCHAR* argv[])
{
char * pBuf= new char[14];
sprintf(pBuf, "Hello, world!");
printf("%s\n", pBuf);
return 0;
}
番号コテは発言毎に付け替えるものではない。
一連の同じ話題の間は初めの発言番号をずっとつけておくものだ。
>>755 返答ありがとうございます。
コテの件おっしゃる通りですね。。。すいません。
operator new ですが、こちらと挙動が異なるようですね。
今一度確認してみます。
757 :
742:2007/04/06(金) 08:40:15
>>752 (自己レス)Eclipse+CDTで何とかgccコンパイル・実行ができました
でもEclipseって自分には多機能すぎるのかちょっと使いにくく感じます
gccが使えて、CPadのようにコマンドプロンプトにいちいち入力しなくて良い物は無いのでしょうか?
emacs
最近の32ビット以上のマシンだと、doubleでもfloatでも実行速度は変わらないのでしょうか?
doubleの方が速い事さえある
「最近」がここ20年程を指すなら>760。
ここ数年を指すなら一概には言えない。
#例えばIntelCPUなら、floatの方が速くなる可能性を秘めている。
>>759 それが問題になるほどクリティカルなプログラムを作りたいなら実測しろ。
つーか、
>>760は生半可な知識で答えずにきちんと実測してから回答すべきだな。
質問の答えになってない件について
最近とか32ビット以上のマシンって色々な条件が考えられるので一概には言えない。
というかコンパイラがどういうコードを生成するかとかCPUの特長とか
サブルーチン呼ぶときdouble型にされてしまうとかプログラムしだいで変わるだろうから
毎回実測したほうがいい。聞かれても困るし、過去の経験や聞いた話しに頼るべきではない。
doubleもfloatも80bitに拡張されるんじゃなかったっけ
>>765 x86のFPUはそうだな。
でもWin64では、64ビットプログラムだと事実上FPUが使えず、
SSEを使うことになるので、そうでもない。
>>759 761とは違う理由も挙げてみる。
Cではfloatをプロトタイプ宣言のない関数の引数として渡すと、
doubleに拡張されることになっていた。
標準ライブラリもみなdouble型の引数・戻り値ばかりだった。
故にfloatではいちいちdoubleとの変換の手間がかかる分速度が遅くなるとされた。
しかし近年はプロトタイプ宣言が普及し、
標準ライブラリもfloatを引数・戻り値に取るものも用意されるようになったので、
ここでも結論は761と同じ
>>765 それは一部のCPUの実数演算ユニットに限定された条件。
>>764 >サブルーチン呼ぶときdouble型にされてしまうとかプログラムしだいで変わるだろうから
古いCや可変個数引き数でもない限り、安全にfloat値を関数に引き渡すことができる。
SIMD命令使う際でfloatはdoubleの半分のビット幅だから
処理効率が二倍ぐらいになったりするの?
>>768 処理効率が速度のことなら、巧く填まれば倍の速度が出る。
#例えば配列同士の加算など。
実際には、ニモニック自体が4並列の方が遅かったり
メモリからの詰め替えが遅かったりであんまり変わらなかったりもする。
あとデータがキャッシュに載るかどうかという点で、
同じ大きさならfloatはdoubleの倍の要素を保持できるという点もおいしいらしい。
実際測ってみたことないからよくわからないけど。
floatとdoubleの大きさを決め付けているのは元質問からの仮定ということで許してくれ。
771 :
デフォルトの名無しさん:2007/04/19(木) 12:31:23
標準関数などで用意されている2次元の構造体 pos.x pos.y のようにアクセスできる
ものって用意されていたりしませんか?
ある本にプログラムは作るな!と書いてあったので
構造体も作らないほうがいいのかなとか思いました。
できればoperatorで演算できるものだとうれしいんですが
そういったものが用意されていたら教えてもらえるとうれしいっす。
772 :
771:2007/04/19(木) 12:52:43
文章がおかしかったので訂正します。
標準ライブラリなどで
struct pos
{
double x,y;
}
のような構造体は用意されていますか?
されているのであれば何をインクルードして何という型名なのか教えてほしいです。
お前は作らなくていいから俺が作ってやるよ
作るなって理由が判らんが。
複素数として扱っていいなら、CにもC++にも定義がある。
C++の複素数なら、メンバの型も自由だ。
775 :
771:2007/04/19(木) 14:46:33
なんか自分頭おかしかったです。はい。
どうもすみませんでした
どうせ「車輪の再発明はするな」って意味っしょ?
まあ、あるものは使った方がいいけど、
初心者ならとりあえず作ってみるのも勉強になっていいと思うぜ。
777 :
デフォルトの名無しさん:2007/04/19(木) 19:13:27
プログラムの勉強をしているのですが、分からない問題があります。どなたかこのプログラムを作ってくれませんか?
問題は
「5つの整数値を入力させて入力順に出力し、最大値と最小値も出力するプログラムをつくりなさい。」
<注>このプログラムは、並び替え処理は行わずに作成してください。
下のように出力できればいいんですが・・・・。できないです。よろしくお願いします。
Input number1 : 52
Input number2 : -34
Input number3 : 27
Input number4 : 612
Input number5 : 9
maximum value is 612
minimum value is -34
52 -34 27 612 9
>>777 丸投げするなら宿題スレの方がいいと思うが。
779 :
デフォルトの名無しさん:2007/04/19(木) 19:23:28
>>778 分かりました。宿題スレいってきます。有難うございます。
ああああああああああ
ああ ああああ あああ
あ ああ ああ あ
781 :
デフォルトの名無しさん:2007/04/20(金) 15:11:40
質問ですが、unsignedのマイナスの扱いがよく分かりません。
unsigned int uTest = -1;
fwrite( &uTest, sizeof(unsigned int), 1, fp );
で-1が記録されます。
unsigned int uTest = 4294967295;
でも-1が記録されます。
ファイル出力にunsignedは使えないのでしょうか?
またどうやったら使えるのでしょうか?
>>781 あのね、32ビット16進表記では、-1も4294967295も 0xFFFFFFFF なんだけど。
何を見て-1が記録されると言ってんの?
783 :
デフォルトの名無しさん:2007/04/20(金) 15:35:01
>>782 あぁなるほど、バイナリエディタで型をsignにしてました。
ありがとうございます。
書き込む前に少し頭使おうぜ
785 :
デフォルトの名無しさん:2007/04/21(土) 12:41:37
小数に対応させるためにdoubleにすると、整数の場合も4.00000000みたいに小数点以下に0が無駄に出てしまうんですが
それを出さない方法ってあるんですか?あるなら教えてぷりいいいぃぃずううううう(iдi)
double型に対して整数とは如何に。
中身が本当に、小数点の底まで整数と信じるなら、
intにでもキャストしろ。当然、±1の誤差に対する
苦情は却下だ。
>>785 printf("%g\n", 4.0);
>>785 double a=4;
cout<<int(a)<<endl;
789 :
785:2007/04/21(土) 13:35:07
みなさんありがとうございます。
キャストでうまくいきそうです。
それよりも出力精度に0を指定したほうがいいような気もするが。
>>790 小数対応といっている以上、%.0fではダメだろう。有効精度が判っているなら、(例えば3桁として)%.3gでよかろう。
792 :
785:2007/04/21(土) 15:14:29
>>786 入力した数の平均を求めるプログラムなので、整数にも小数にも対応できるようにdoubleにしました。
そうすると、平均が整数になろうと小数になろうと、後ろに0がいっぱいついてしまうのです。
>>789は死ね
794 :
785:2007/04/21(土) 15:27:54
整数、整数っていうけど、実際は、
4.000000000000003とか
3.999999999999998じゃねーの。
#include <stdio.h>
int main()
{
printf("%f %g\n", 4.0, 4.0);
}
これで4.000000 4という出力が得られた。
797 :
785:2007/04/21(土) 15:34:46
798 :
785:2007/04/21(土) 15:45:03
説明が悪かったかな
#include<stdio.h>
int main()
{
int i;
double x,sum=0,ave=0;
printf("実数を3つ入力してください\n");
for(i=1;i<=3;i++)
{
printf("%dつめ⇒",i);
scanf("%lf",&x);
sum = sum+x;
ave = sum/i;
printf("合計=%f\n",sum);
printf("平均=%f\n",ave);
}
return 0;
}
これで3つとも1と入力しても1,000000とかになっちゃうのです
800 :
785 ◆HOZlQYR1MY :2007/04/21(土) 16:25:11
>>799 申し訳ない、習い始めたばっかりなので用語もいまいちわかりません(ノд`;)
答えが整数なら整数で、小数なら小数で出力したいのです。
例えば、
>>798のような入力した実数の合計と平均を求めるプログラムで、
1と2を入力した場合、和は3.000000平均は1.500000と出てしまうのを、
和は3、平均は1.5とぴったり無駄に0がつかないように出力したいのです。
>>800 それは無理。
浮動小数点と2進数の関係をもう一度勉強しろ。
手計算で4になっても、数値計算ではぴったり4ではない。
802 :
785:2007/04/21(土) 16:38:06
分かりました。
もう一度勉強してから出直します。
ホント、このスレは馬鹿ばっかですね。
803 :
785 ◆HOZlQYR1MY :2007/04/21(土) 16:40:30
>>801 そうなんですか、わかりましたorz
長々お邪魔しました、勉強して出直してきますo(`ω´*)o
ありがとうございました〜
804 :
785 ◆HOZlQYR1MY :2007/04/21(土) 16:43:06
>>800 だから%gで出力してみたのか?
それを試してから寝言を言えって。
>>801 表示だけならできるのだから、「無理」と決め付けるな。
806 :
785 ◆HOZlQYR1MY :2007/04/21(土) 17:05:52
>>805 うおおおおできたああああああああ
まjでありがとうございまssっす!!!!!!!1!!1!11
寝言言ってすいまえsんでした
そんな調子だから偽者も出てくるんだよ……
808 :
デフォルトの名無しさん:2007/04/21(土) 20:41:18
質問っす。
今からプログラム始めるとして、BASIC、C、C++、Java、Fortranの中で入門用・汎用性ではどんな感じなんでしょうか?
一応専攻は機械・設計っす
あせえんぶらぁぁぁあ!!!
C
811 :
デフォルトの名無しさん:2007/04/21(土) 21:16:21
. iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.liiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!.liiiiii,,,_. _,,_____ iiiiiiiiiiiii iiiiiii.iiiiii
. lllllllllllllllllllllllllllllllllll.lllllllllllllllllllllllllllllllllll! llllllllllllllliiii、llllllllll! lllllllllllll .llllll゙llllll
. ゙!!!!!!!!!!!!!!!llllllllllllll.゙!!!!!!!!!!!!!!!llllllllllllll ゙!!!!lllllllllllll!lllllllllll! lllllllllllllii,,,,,_  ̄ ________________,
llllllllllllll .lllllliiiii,,_ ,llllllllllllll .゙゙゙!!!ll lllllllllll llllllllllllllllllllllllllllliiiii llllllllllllllllllllllllllllll!
llllllllllllll .lllllllllllllllllllllllllllllll゙ ,llllllllllll lllllllllllllll!!llllllllllllllll llllllllllllllllllllllllllllll!
. iiiiiiiiiiiiiiiiiiiiillllllllllllll .゙゙゙!!llllllllllllllllllll!゙ iiiiiiiiiiiiiiiiiilllllllllllll!"llllllllllllll .゙゙゙゙゙!!!
llllllllllllllllllllllllllllllllll .゙゙!lllllllllllllllii、.llllllllllllllllllllllllll!!゙゛ llllllllllllll
!!!!!!!!!!!!!!!!!!!!!!!!! .゙!!!!!!!!!!!!! .!!!!!!!!!!!!!゙゙゙゙´ l!!!!!!!!!!
>>808 CとC++とJavaは見た目が似てるから一緒に覚えられるかも
見た目が似ていても中身は全くの別物
一緒に覚えられるような代物ではない
814 :
デフォルトの名無しさん:2007/04/21(土) 22:57:22
____
/ \ /\ キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \ 見た目が似ていても中身は全くの別物
| |r┬-| | 一緒に覚えられるような代物ではない
\ `ー'´ /
ノ \
/´ ヽ
| l \
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwwwwwwwww
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / / バ
| | l||l 从人 l||l l||l 从人 l||l バ ン
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
無難にCかな。
一緒に学べないかというとそんなことはないとは思うが、
プログラミング初心者に複数の言語をやれというのは酷な話だな。
816 :
デフォルトの名無しさん:2007/04/22(日) 05:03:18
C++で二つテキストボックスを作ってボタンを押すことによって
ボックス1にコピペした文字列のノイズを取ってボックス2の方に表示させたいんだが。
文字列を検索したり抜き出すための関数が分からなくて挫折してる。
ハンドガン l;7 s;20 マシンガン l;2 s;32ってなってるのをボタンを押すと ハンドガン lv7 マシンガン lv2
って感じに翻訳っぽく。sから少し後ろはノイズだから消し去りたくて。
lの方でレベルは把握されてるけどそれをlvに直して数値を最後に付けて。
悪いsageチェック入ってなかった。
>>816 C++にはGUIの規定はないので、恐らく何らかのライブラリを使っていると思うのだが。
そのライブラリの該当スレで聞くといいよ。
C++におけるabsとfabsの違いを教えてください。
前者はint abs(int)と宣言されていて、後者はdouble fabs(double)と宣言されている。
>>819は
オバーロードがあるから意味ないんじゃね?
と言いたいのかと思った
どうせ最適化で消えるんだからどっちでもいいよ。
#include <stdio.h>
をC++で書いてる人っているのか?
ちょっと古い処理系への互換性が必要な場合とか、古い本を読んでそれで覚えてる奴とか。
825 :
デフォルトの名無しさん:2007/04/22(日) 15:22:00
交互に攻撃を行うプログラムを書いていて int kougeki は 攻撃側の識別に使ってます。
下のコードは攻撃を行うと攻撃の権利が相手に移るという部分のなんですが、仮に
*kougeki = 1;
*player = 1;
*computer = 0;
という状況でこのコードが実行されると
*kougeki = 0;
*player = 0;
*computer = 0;
という風に*kougeki、*player共に同時に値が書き換わってしまいます。
if(*kougeki == *player){//攻守の交替
printf("1---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
*kougeki = *computer;
printf("1---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
}else if(*kougeki == *computer){
printf("2---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
*kougeki = *player;
printf("2---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
}
これはなぜでしょうか?理由が分かる方がいたら指摘お願いします。
kougeki == player なんだろ。
なんでそんなわけのわからんポインタの使い方をしてるんだ
827 :
デフォルトの名無しさん:2007/04/22(日) 15:35:04
本当だ・・・
if(*kougeki == *player){//攻守の交替
printf("1---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
kougeki = computer;
printf("1---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
}else if(*kougeki == *computer){
printf("2---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
kougeki = player;
printf("2---P=%d,C=%d,K=%d\n",*player,*computer,*kougeki);
}
に修正したらちゃんと動きました。ポインタを理解できてないみたいですね・・・
ありがとうございます!
828 :
デフォルトの名無しさん:2007/04/22(日) 16:02:05
コメントアウトの仕方とか
インデントのかけ方とかド素人丸出しなソースだな
829 :
デフォルトの名無しさん:2007/04/22(日) 16:20:36
一年目でコメントアウトの一般的なやり方なんか知るかボケ
インデントは勝手に省略されたんだよカス
コメントアウトの仕方って問題あるのこれ?
掲示板で質問するときの疑似コードとか100行以内で書き捨てる
ような用途なら全然ありじゃね?縦に長くならないし。
それよりインデントするなら全角空白でして欲しいとかそっちのほうが
気になるな漏れは。(実体参照だとJaneだと上手くコピペできない)
>>829 答えてやったのに
答えてもらった後はどうでも良いって奴か
お前みたいな奴はPG向いてないからやめたほうがいい
C++スタイルのコメントだわな
実際にC99/C++なのかもしれないけど
834 :
デフォルトの名無しさん:2007/04/22(日) 17:03:03
#include <stdio.h>
#define TATE 7
#define YOKO 5
int main(void)
{
int arr[TATE][YOKO]={
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
};
int i,j;
int *p;
p=*arr;
*(p+10)=1;
for(i=0;i<YOKO;i++)
{
for(j=0;j<TATE;j++)
{
printf("[%d][%d] = %d ",i,j,arr[i][j]);
}
putchar('\n');
}
return 0;
}
835 :
834:2007/04/22(日) 17:05:07
>>834をコンパイルすると、
[0][0] = 0 [0][1] = 0 [0][2] = 0 [0][3] = 0 [0][4] = 0 [0][5] = 0 [0][6] = 0
[1][0] = 0 [1][1] = 0 [1][2] = 0 [1][3] = 0 [1][4] = 0 [1][5] = 1 [1][6] = 0
[2][0] = 1 [2][1] = 0 [2][2] = 0 [2][3] = 0 [2][4] = 0 [2][5] = 0 [2][6] = 0
[3][0] = 0 [3][1] = 0 [3][2] = 0 [3][3] = 0 [3][4] = 0 [3][5] = 0 [3][6] = 0
[4][0] = 0 [4][1] = 0 [4][2] = 0 [4][3] = 0 [4][4] = 0 [4][5] = 0 [4][6] =
こうなります。
int *p;
p=*arr;
*(p+10)=1;
↑この操作によって、
arr[1][5]にもarr[2][0]にも1が代入されるのはどうしてでしょうか。
836 :
デフォルトの名無しさん:2007/04/22(日) 17:07:51
すいません。
TATEとYOKOがテレコでした…
for(i=0;i<TATE;i++)
{
for(j=0;j<YOKO;j++)
で、納得です。
普通はダブルポインタじゃないの?
配列は連続して並ぶから大丈夫だべ
あれ?ダブルポイmmタってなんだっけ?
ダブルポインタって名前はどうも気になるんだよな…
ポインタへのポインタでなぜいかんのかと
クィントゥープルポインター!
C++の名前空間で、階層は持てないんでしょうか?
JAVAのパッケージやURIみたいに
持てる
844 :
デフォルトの名無しさん:2007/04/22(日) 19:39:27
質問ですが、
CreateWindowで作ったウィンドウのタイトルバーと枠の消し方が分かりません。
CreateWindow第三引数を、通常「WS_OVERLAPPEDWINDOW」としているところから
「WS_VISIBLE」のみに変えれば、「WS_CAPTION」が無くなって出来るかと思ったのですが、
やはりタイトルバーも表示されてしまいます。
どうすればタイトルバーを消すことが出来るのでしょうか?
845 :
デフォルトの名無しさん:2007/04/22(日) 21:48:09
C言語のstrtokについて質問なんですが、
普通の中置記法の計算式が入ってる配列を、strtokで演算子だけ取り出そうとしたのですが
()がはいるとうまく取れません。
10+40+(5+5)*10=と入力すると、"+" "+(" "+" ")*" "="
って感じに、(の直前の演算子と)の直後の演算子がくっ付き、ひとつの文字列になってしまうのですが
全部ばらばらにひとつずつわける方法ありませんか?
そんなことにstrtokを使うなよ。
普通に前から一文字ずつ見ればいい話
847 :
デフォルトの名無しさん:2007/04/22(日) 21:53:34
iniファイルを構文解析するライブラリで
これはお勧め! っていう決定版みたいなのある?
C言語で
848 :
デフォルトの名無しさん:2007/04/22(日) 22:42:01
ありがとう
C言語用のJava探してくるよ
wineにあるよねきっと。
852 :
844:2007/04/22(日) 23:14:00
すいません。自己解決しました。
853 :
デフォルトの名無しさん:2007/04/22(日) 23:44:01
>>846さん
指摘ありがとうございます。
言われたとおり式が入ってる文字列を先頭から数字以外は飛ばして
演算子がみつかったら中身を格納して〜って感じでやったのですが、
while(*enzan)でループさせて中でカウントしつつ、演算子なら格納して
最後に確認のために格納したデータを出力しようとしたのですが
エラーがでて出力されません。
もしかしてstrcpyすると\0なくなってるとかですか?
>>853 strcpyをどのように使ったのか気になるが・・・
ちょソース晒してみ
strcpyはヌルで終わるはずだが
>>809-815サンクスっす
自分でも少し調べたけど、今の時代はBASICでもなくCが入門用で汎用ってことでFAっですよね…。
ちなみにウチの学科は今期の授業ではFortranを学びます。敢えてFortranなんて始める聞くのを修得する必要ってあるんでしょうか?
ぶっちゃけこれはウチの先生が異常なんすよね…?
Fortranは昔からあるから知っている人が多い。
知らないものは教えられない。
授業で教えるのはFortranに決定。
そんなところだろ。
Fortranはいい言語だよ。ただちょっと時代遅れなだけで。
スパコンならFortranも使えたりするから、その都合じゃね
理系学科ならそういう科目あってもいいかと
少なくともhtmlの基礎よりは
>>856 言語の講義(特に一番最初のもの)ってのは、
扱っている言語の文法を覚えるためだけにあるんじゃないんだよ。
扱っている言語が古いか新しいかなんて関係ない。
他に習得したい言語があるのなら受身になっていないで自分で学べ。
その際にはFortranの講義で得た知識が役に立つだろうから。
せめて Fortran90 にしてほしい。
862 :
デフォルトの名無しさん:2007/04/23(月) 23:55:49
>>854さん
すみません、自己解決しました。
コピーする側をmallocしわすれてました・・・
863 :
デフォルトの名無しさん:2007/04/24(火) 00:02:35
Pythonって人気ないの?
>>856 機械とか材料関係ならFortranはバリバリ現役なので特におかしな選択ではないと思う。
コンピュータを文字通り「計算機」として使う分野だから新しめの言語よりもFORTRANの
枯れて信頼性のあるライブラリを使ったり研究室で書きためたコードを読めるようになった
方がよい、ということなのだろう。
電子物性ですがCです
でも情報の学科がJavaとアセンブリしかしないようなぬるぽな学科なんで
まともな所は違うかも…
もはや信者も飽き飽きしている、とかもあるんじゃね?
えーっと、ここはC/C++の質問スレだよな?
870 :
デフォルトの名無しさん:2007/04/24(火) 11:06:15
char *p = "xyz";
この場合、xyzというのは文字列定数なんでしょうか?
*pはxyzという文字列定数のアドレスを保存すると考えていいのでしょうか。
そうです。但し、*pではなく(char*)と言う型を持ったpが、です。
872 :
デフォルトの名無しさん:2007/04/24(火) 15:09:58
ファイルを読み込んで先頭文字で処理を振り分けたいのですが、
文字をきちんと読み込んでくれません。
どうしたら読み込んでくれるようになるでしょうか?
ファイルの中身は
0xF1 0x40 0x40 ・・・
となっていて、プログラム内では
chInBuff[0] -15 '・
chInBuff[1] 64 '@'
と読み込まれています。
ヘッダファイル
static FILE *fp0;
プログラムファイル
char chInBuff[265];
fp0 = fopen( ファイル , "rb" )
fread( chInBuff , 265 , 1 , fp0 );
if(chInBuff[0] == 0xF1){}
873 :
デフォルトの名無しさん:2007/04/24(火) 15:16:31
サイズのわからないバイナリファイルを読み込みたいのですが
ファイルの末端をどのようにして検出すればいいのでしょうか?
ある程度の長さの配列を用意して、終端になるまでmallocで確保しながらぶち込んでいこうかと考えたのですが・・・・
874 :
デフォルトの名無しさん:2007/04/24(火) 15:16:34
TryEnterCriticalSectionという関数をDLLで使おうとしたんですが、
error C3861: 'TryEnterCriticalSection': 識別子は、引数依存の照合を使用しても見つかりません。
と出てしまいます。
ググってみたら_WIN32_WINNTが0x0400以上でなければならないといっていたので
stdafx.hに
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
を#include <windows.h>の前に追加したんですがそれでもだめでした。
VC7でDLL(Win32 プロジェクト)でやっています。
よろしくお願いします。
875 :
874:2007/04/24(火) 15:27:56
自己解決しました。
どうやら実際にTryEnterCriticalSectionを使うクラスを宣言したヘッダーに
#include "winbase.h"
としていたのが原因のようです。
はっきりとした理由はわかりませんが、stdafx.hでwindows.hを読んだあとにwinbase.hを読んだことがまずかったみたいです。
>>872 ヘッダファイルでグローバル変数定義なんてするもんじゃないという話はさておき、
0xf1は8ビットのsigned整数として表示すれば-15だからあってるじゃん。
試しにchinBuff[0]をunsignedにキャストしてみたら?
>>873 一般的には、ファイルサイズを調べておいてそのサイズでメモリ確保、fread()で読む込む。
ファイルサイズを調べる手段は、stat()を使うか標準関数だけで済ませたいならfseek()で
ファイル末尾に移動してftell()するとか。
#但し、2GBを超えるファイルには要注意。
教条主義的にファイルサイズを調べる手段も使わないというなら、一度空読みしてやればいい。
#fgetc()はファイル末尾に到達するかエラーに遭遇するとEOFを返すので検出できる。
char は 「チャー」 でいい?
878 :
872:2007/04/24(火) 15:41:55
>>876 ありがとうございます。
if((unsigned char)chInBuff[0] == 0xF1){}
とすることで比較することができました。
staticの位置も修正しました^^;
理由などは調べてみます。
>>877 char キャラ型 と呼ぶかと
チェアー
椅子ではない
つまんね
>>876 いやー、多分一般的にはファイル全体を一気に読み込むんじゃなくて
何とかして必要な部分を切り出して読み込むんじゃないかと思うぞ
もしくはメモリマップファイルを作るとか
どこの貧乏OSだか。そのファイルの全部が必要なら、一気に読むのが一番いいジャマイカ。
うっかりユーザーが10GBのファイルを指定しちゃうと目も当てられないw
フリーでオススメの統合開発環境を教えてくれ
WideStudio以外で
OSくらい書け
WindowsXP Pro SP2です
Visual Studio 2005 Express Edition
フリー公開されてたのか。ありがとう。
浦島太郎ですか
なんで分かった
893 :
デフォルトの名無しさん:2007/04/25(水) 21:06:20
vectorで、初期化する時ではなく、途中で一括して領域を確保したい場合、
forループなどでpush_backするしか内のでしょうか?
vector<vector<int>> vec;
とやっておいて、
あとから与えられた値の分、例えばint x=100,y=100;と与えられたら
for(int i=0;i<x-vec.size();i++){
vec.push_back(0);
for(int j=0;j<y-vec[i].size();j++){
vec[i].push_back(0);
}
}
の用にしなければいけませんか?
resize()があるだろ
reserve
みんなSTLにどんな機能があるか知らずに使ってんだな…
>>895 reserve()はちょっと意味が違うな
vectorについて詳しく調べてみればわかるのだが、思ったよりも
たくさんのメンバ関数を持っている事がわかる。Effective STLなどで
勉強しよう。
899 :
デフォルトの名無しさん:2007/04/25(水) 22:02:02
901 :
デフォルトの名無しさん:2007/04/25(水) 22:20:33
ありがとうございます。早速見てみます。
これからSTLのことで質問しようとしている諸君、
人に聞く前にSTLのソースを見るんだ!
もしくはεπιστημη様にでも訊いて地獄のような説教をしてもらえ!
STLは実装について規定しない。
仕様書を読むべきなんじゃないの?
904 :
デフォルトの名無しさん:2007/04/25(水) 22:54:39
お金をかけずにC言語の勉強をしたいと思うのですが、コンパイラなど
、良いフリーソフトをご存知ないですか?
というか、最低限必要なソフトやツールを教えていただけると嬉しいです・・・
905 :
デフォルトの名無しさん:2007/04/25(水) 22:56:38
超初心者なのですが、C言語について質問です。
コンパイラでdos形式のexeファイルにしたのですが、実行しても一瞬入力した文字が出てきてすぐ閉じてしまいます。
開いたままにするって事はできないのでしょうか?
後、C言語でdos画面以外はできないのでしょうか?
初心者なので分かりづらい質問かもですが、回答よろしくおねがいします。
>>904 visual studio 2005 express edition
cygwin gcc
>>905 getch()
Win32API
>>905 #include <windows.h>
#pragma comment(lib, "user32.lib")
int main()
{
MessageBox(NULL, "hoge", "hage", MB_OK);
return 0;
}
>#pragma comment(lib, "user32.lib")
これの意味について詳しく
いろんな機能が使えるようになるおまじないだ
user32.libをリンクする
リンクしないといろいろな機能を使えない、というかリンクエラーが起こる
素のVC++ EEだとuser32.libがなくてリンカエラーになる予感
プラットフォームSDKだったっけ
913 :
デフォルトの名無しさん:2007/04/25(水) 23:46:45
>>906 ありがとうございました。
早速ググってみます。
>911
その前にwindows.hが見つからないという騒ぎになる
916 :
デフォルトの名無しさん:2007/04/26(木) 00:29:30
>>907 ありがとうございます。
正直超初心者なのであんまり分からないですが、すぐ終わるっていうのが仕様じゃなくてよかったです。
917 :
908:2007/04/26(木) 08:14:52
ほもほも
2003 professionalだとなくても通っちゃったのでなんじゃこりゃって悩んだけど
そういう意味だったのか
>>917 コンパイルオプションにuser32.libをリンクするって設定してあるんだろう。
大抵はコンパイルオプションでシステム系のライブラリはリンクするようにデフォで設定されてる。
#pragma(libはソース中にライブラリのリンクを明示する時に使う。
919 :
デフォルトの名無しさん:2007/04/28(土) 22:11:24
C言語で質問です。
今、式を打ち込んで()内の式を抜き取るという関数を作っているのですが
うまく抜き取れなくて困っています。
これで動かない理由がまったく分りません。
char shiki[256];
char kakko[256];
gets( shiki ); len = strlen( shiki ); len+=1; // shiki←計算式 len ← shikiの長さ \0含めるために+1
c_leni = strcspn( shiki, "("); // c_leni←shiki内の'('の位置
c_lenc = strcspn( shiki, ")"); // c_lenc←shiki内の')'の位置
memcpy( kakko, shiki + ( c_leni + 1 ), ( len - c_lenc ) * sizeof( shiki[0] )); // kakko←'(' の位置+1から ')'の位置-1までの文字列
for( i = 0; kakko[i] != '\0' ; i++){
printf( "%c" , kakko[i]);
}
ちゃんと戻り値を確認しながら実行してみれ
strcspnなんか久しぶりに見たわ。普通にstrchr使えよ
文字列のコピーならstrcpy/strncpyを使うべきだ。
そいから、getsは危険だから絶対に使っちゃならん。
pl = strchr(shiki, '(');
pr = strchr(shiki, ')');
if(pl++ && pr) {
strncpy(kakko, pl, pr - pl);
kakko[pr - pl] = '\0';
printf(kakko);
}
>>921 plがNULLのときにインクリメントするのは鼻から悪魔。
それに、sprintf()でできることをstrncpy()でやるのはちょっと疑問。
plとprの位置関係くらい見ておいた方がいい希ガス。
もう一つ、文字列中に%があると死ぬから第一パラメータに持ってくるのは拙い。
ってことで、こんな感じで。
char * pl = strchr(shiki, '(');
char * pr = strchr(shiki, ')');
if (pl != NULL && pr != NULL && pl < pr) {
sprintf(kakko, "%.*s", pr - pl - 1, pl + 1);
printf("%s", kakko);
}
getsがダメと言ってる人間にsprintfを使って添削すんなよ・・・
gets()が危険だろうが何だろうが使うのは俺の勝手だ。
確かに、gets()がダメと言いつつprintf(kakko)とかやっちゃう香具師に何言っても無駄だな。
ま、Cの規格書にgets()は使用禁止と書いてあればさすがに従うけどな。
書いてないなら誰かに使うなと言われる筋合いは全くない。
>>926 あー、コードレビューでこんな事言ってた奴がいたなぁ・・・
std::string str;
std::cin.getline(str);
もやヴぁいでしょうか?
>>928 それは使い方が違う。
std::cin.getline(char* str, streamsize count)
又は
std::cin.getline(char* str, streamsize count, char delim)
930 :
919:2007/04/28(土) 22:52:23
レスありがとうございます。
取り合えず一通りためしてみます^^;
>>926 自殺するなら止めないけど。人に迷惑かからない範囲で
934 :
デフォルトの名無しさん:2007/04/29(日) 00:01:01
すごく幼稚な質問かもしれないが関数で文字を送るにはプロトタイプ宣言をどうすればいいんだ?
たとえばこんな感じの↓
kansuu("a=",a)
"string"はchar*型なので
kansuu(char*,nanntoka)
936 :
デフォルトの名無しさん:2007/04/29(日) 00:05:10
>>935 C++なら絶対に、Cでもよっぽどの理由がなければconst char*にすべき
ちなみに"string"などの文字列リテラルの正確な型はconst charまたはcharの配列
>>937 Cとの互換性の関係で文字列リテラルは const じゃないよ。
マジですか
>>937と同じく文字列リテラルはconst char*だと思ってた
vector<string*> vec;
vec.push_back(new string("あべし"));
vec.clear();
ってした際には"あべし"が格納されてるstringオブジェクトは
ちゃんとdeleteされるんでしょうか?
>>941 されません。boost::ptr_vectorを使えばされます。
d
ぼーすとって凄いラインぶらり何ですね
944 :
919:2007/04/29(日) 02:35:02
>>922さん
sprintf(kakko, "%.*s", pr - pl - 1, pl + 1);
ってどういう動きしてるんですか?
やってみたんですがpr-pl-1のところとかいじっても出力結果が変わらなかったのですが
何がどうなってるのか全然わからないす・・
いじった理由は'('から次の文字はちゃんと取れているのですが')'の前で終わって欲しいのに
')'の後ろの文字まで出てしまうからです。
>>944 %*s は、文字列の長さが少なくても指定した幅だけは最低とる
指定した長さで切るなら、%.*s
短くても長くても固定サイズにしたいなら %*.*s
NULLをインクリメントしたって鼻から悪魔でもなんでもない
946 :
919:2007/04/29(日) 09:21:19
>>945さん
ありがとうございます。早速試してみます
C言語でのデバッグのコツを教えてください。
printf
949 :
919:2007/04/29(日) 18:19:20
だめだー・・どうあがいても無駄な文字まで拾ってきてしまう・・
大人しくfor文で回して一文字ずつ格納していくしかないのか
950 :
919:2007/04/29(日) 18:38:21
と思ったら事故解決しました。
お騒がせしました
今さらだけど
>>938ってマジ?
PCぶっ壊れてるから確認できない。
>>938-940 C++では、const charの配列だが、文字列リテラルからchar*への変換が定義されている。
X 3014:2003
2.13.4 文字列リテラル 1節目
4.2 配列からポインタへの変換 2節目
constしか取れないとAPIに渡せなくて困っちゃうことが多いから、そうしたんだっけ
>>953 そーしないと、既存の(C言語の)資産を活かせるという
C++の最大の売りのひとつが台無しになっちゃうからね。
Javaは多少やっていて、今C++を調べています。
C++だと宣言しただけでオブジェクトができる?みたいですが、
vector<string> vec;
vector<string> *vec = new vector<string>();
上の二つの宣言でどちらも利用できますが
どちらを使ったほうがいいんでしょうか?
C++にはご存知のとおりGCはない。
後者の場合プログラマが明示的にdeleteしないとメモリリークが発生する。
特に理由がなければ前者を使えばいいし、他のスコープなどから参照するような場合があるなら後者を使えばいい。
boost::smart_ptrとかstd::auto_ptrに入れればスコープが外れると
自然にdeleteされるのでそれをお勧めする
というか
>C++だと宣言しただけでオブジェクトができる?みたいですが、
こう書いてある時点でSTLやらBoostにはまだ手を出してはいけないような気がする。
のど渇いたから水飲んでこよーっと
>>959 ダメ! 寝る前に水飲むとオネショするよ?
今日は早起きしたからこんな時間に居るんだよ?
早起きにもほどがあるw
newで配列を動的に確保する場合、
a[100][2]よりa[2][100]のような形の方がメモリが連続して速くなりますか?
longの場合で[10000][1]と[1][10000]なら50倍近い差が出て笑った
もちろん速いのは後者ね
これはループまわして確保するって事の影響なんだろうけど
ループまわさないでやったら大差なかった
ごめん
966 :
963:2007/05/01(火) 05:31:57
forループで何か計算させる場合も、メモリが連続している方がキャッシュが効きやすくなるのでしょうか?
そんなの環境によるだろ
キミに必要なのは、自分で実際に試してみて計測する気持ちだ
どんな環境でも連続してる方がキャッシュは効きやすくないか?
まあ、それはともかく、type* で連続メモリを確保して、
type** でそこへのアドレスを保存するテーブルを作ればいいんだぜ。
キャッシュが無い環境では効くも何も無い
質問自体が成り立たない状況は
質問の対象外だろ
多次元配列 hoge[X][Y]のX,Yという並びには意味があるときがほとんどだから
その意味を潰す事のコストが大きすぎて、多少の差なんてどうでもよくなってしまう
キャッシュの有無は CPU の仕様を見れば
>>971 そういう気持ちの悪い理由で、二次元データを画像に落とすときにもにょる羽目になることは多い。
C言語で、aaaというファイルを読み書き両用で作成するなら
fp = fopen("aaa.txt", "a+");
でいいと思うんですが
aaaという固定のファイル名ではなくて、
キーボードから入力した任意の文字列のファイル名でファイルを作成したい場合はどうすればいいのでしょうか?
任意の文字列を格納したchar配列を渡せばいいんじゃないか
>>975 ファイルを作成するなら"w+"だな。
"a+"じゃファイルは既存である必要がある。
#尤も、"w+"じゃ既存ファイルを消してしまうが。
a や a+ はファイル作成するよ
既存ファイルの破壊を防ぐ典型的な方法って
書き込み用として開く前に、読み込み用に開こうと試みて指定ファイルの存在を調べる
以外にありますか?
俺の少ない知識ではこれしか思いつかないんですが・・・
char* str = "aiueo";
このaiueoは定数なんですよね?
だったら、
str = "owner";
としてaiueoという定数ではなくownerという定数を指すようにすることはできても
定数自体を書き換えることはできないんですか?
*str = "o"
*(str+1) = "w"
…
みたいな感じです
次スレは?
982 :
977:2007/05/01(火) 15:46:58
>>978 あーそうだっけ。失敬。
どっちみち、既存ファイルの既存部分に手をつけられないから使うメリットは余りないけど。
>>979 環境依存しない方法では、それが無難だね。
"r+"で試みて駄目なら"w+"で開くのが一般的かな。
#追記限定なら"a"でいいでしょ。
983 :
980:2007/05/01(火) 15:50:06
>>980 できてしまうかもしれないけれど、一般的には駄目。
もしかしたらその"aiueo"が"waiueo"と共存しているかもしれないし。
984 :
983:2007/05/01(火) 15:51:26
ありゃ、名前欄ミスった。スマソ
>>983 やっぱりだめなんですね。
共存というのがよくわからないのですが、さらに調べてみます。
>>980 >*str = "o"
>*(str+1) = "w"
これは、
*str = 'o'
*(str+1) = 'w'
こうなる。
ただし元の"リテラル"を書き換える事は普通しない。
配列か、malloc等で確保した領域で行う。
>>980 文字列リテラルは書きかえちゃダメというのが C の規約にあったはず。
その癖型は char* なんだけどな。
そういう規約がなかった時代に書きかえるコードが書かれてて、
そういうコードが通らなかったら困るからという歴史的な理由だった記憶があるけど、
違うかもしれん。
char str[] = "aiueo";
なら書きかえても大丈夫。
str という配列変数を自前で作ってるから。
すごく丁寧な回答をありがとうございます。
とても理解しやすく、非常に為になりました。