1 :
v(^o^i)d :
05/01/22 23:20:00
2 :
デフォルトの名無しさん :05/01/22 23:20:33
3 :
デフォルトの名無しさん :05/01/22 23:28:18
> C99準拠の参考書ってどれぐらいあるんだろう? 日下部先生のはそうだよ。
4 :
デフォルトの名無しさん :05/01/22 23:34:26
4様
ムハー(`・ω・´)オメ
7 :
デフォルトの名無しさん :05/01/22 23:37:57
日下部ってよく出てくるけどどうなの?エロいの?
三流SEでしょ?
Metrowerks CodeWarriorもテンプレに入れてほしいなぁ
11 :
デフォルトの名無しさん :05/01/22 23:42:59
今の今までMetrow"o"rksだと思っていた。eだったのかよ。
人の揚げ足とっててそんなに面白いか? うん
13 :
デフォルトの名無しさん :05/01/22 23:45:28
揚げ足なんか取っていないぞ。eが正しいんだから。
初心者はまず何をすればいいですか
ありゃそうだった、これはすまんことした
16 :
デフォルトの名無しさん :05/01/22 23:49:34
日下部先生がSEなんていうダサい仕事をするはずがない。 そういうのはしもじものものがやる。
17 :
デフォルトの名無しさん :05/01/22 23:50:41
964 :デフォルトの名無しさん :05/01/22 22:40:26
>>899 a[b]とb[a]は同じ。
aにfoo、bにbar[0]を当てはめてみるとfoo[bar[0]]とbar[0][foo]になり、問題ないということになる。
のレス下さった、前スレの964様ありがとうございました。
スルーされたと諦めていただけに、解答が得られてすごく嬉しかったです。
18 :
デフォルトの名無しさん :05/01/22 23:51:16
> 初心者はまず何をすればいいですか 石鹸で手を洗う。
奴にはチーズの薀蓄を色々聞かされたが、プログラミングに関しては何かを語っているのを余り聞いた覚えがない。
20 :
デフォルトの名無しさん :05/01/22 23:52:43
> a[b]とb[a]は同じ。 そう。だから a[1] と 1[a]は同じ
>>14 初心者はまずコンパイラと良書を買った方がよい。
初心者が陥りやすい間違いの1つとして、最初だからとタダで済まそうとして
コンパイラをコマンドから操作できなくてその時点で挫折すること、がある。
何だかんだ言ってIDEがあった方が使いやすい。
本は良いものをかなり選ばないと後々苦労する。周りにバリバリのコーダーが
いればその人に聞くと良いかもしれない。ネットだけの環境で済ますのもやはり
お勧めしない。
22 :
デフォルトの名無しさん :05/01/22 23:54:20
> 初心者はまずコンパイラと良書を買った方がよい。 たとえばどんな本ですか?
コンパイラは入れました BCCというやつです
24 :
デフォルトの名無しさん :05/01/22 23:55:07
ねらーでも分かるCプログラミング。740円。
25 :
デフォルトの名無しさん :05/01/22 23:55:46
> 初心者が陥りやすい間違いの1つとして、最初だからとタダで済まそうとして > コンパイラをコマンドから操作できなくてその時点で挫折すること、がある。 はあ? 初心者はgccに決まってるだろ? それ以外の物をつかったら、 けっきょくここにきてる厨房と同じ程度でつまづいて止まってしまうことうけあい。
>>22 お前にはもう無理
すぐ人に聞くやつの中でマシやつは今まで一人もいなかった
27 :
デフォルトの名無しさん :05/01/22 23:56:46
> BCCというやつです あれはだめ。すてろ。
捨てました
29 :
デフォルトの名無しさん :05/01/22 23:57:26
>>26 ようするに答えられないわけですね。えらそうなこと言ってみても。
実際には知らないと。
日下部って女?
32 :
デフォルトの名無しさん :05/01/22 23:58:37
そうなん?
35 :
デフォルトの名無しさん :05/01/22 23:59:12
です > 30
ファビョってるところをみるとどうやら
>>26 の言うとおりらしい
>>35 (;´Д`)ハァハァ
37 :
デフォルトの名無しさん :05/01/23 00:01:24
です > 30
38 :
デフォルトの名無しさん :05/01/23 00:02:45
39 :
デフォルトの名無しさん :05/01/23 00:04:49
女でもハァハァからしょぼーんまで様々だからな
40 :
デフォルトの名無しさん :05/01/23 00:05:33
わろた、でも、情報何にも無いけど
フォルダのアクセス権の取得方法を教えてください。 XPのPOWER USERでは書き込みできないかどうかを取得したいだけなんです。 _access()では判断できなかったとです。 よろしく、おながいします。
43 :
デフォルトの名無しさん :05/01/23 00:06:35
opendir()
>>42 不正ユーザーに教えることはできない。アフォ?
アクセス権も無いやつに教えられるか。あと、すれ違い
ありがとうです。 今、ためせないんですが 終電になるまで粘ったのがあほらしいとですよ。
sprintf()について質問です。 次の処理はできないでしょうか?教えてください。 char test[64]="abcd%sefghi"; sprintf(test,test,"efghi"); 要するにメモリ位置がかぶってるやつです・・・。
ありがとうございます。
もし出来たとしたらやるつもりだったのか? もうね、アホかと
50 :
デフォルトの名無しさん :05/01/23 00:23:09
バナナかと
51 :
デフォルトの名無しさん :05/01/23 00:30:18
浮動小数での0除算チェックはどうやるのがいいんでしょうか? if (b != 0.0) a/b; じゃだめですよね。
WinならSEHで検出可能 C++だとtryでくくれば例外自体はキャッチ可能か…? Cだと全然訳ワカラン
53 :
デフォルトの名無しさん :05/01/23 00:34:02
signal
54 :
デフォルトの名無しさん :05/01/23 00:40:50
OKですよ > 5.1
c = a / b; if (c == NaN) { /* エラー処理 */ }
56 :
デフォルトの名無しさん :05/01/23 00:45:25
fmod(a, b); if(errno==EDOM){ /* エラー処理 */ }
gcc>bcc になる理由って何なの? 最適化とか、C99の対応とか?
58 :
デフォルトの名無しさん :05/01/23 00:47:42
MacOSXで使えるから。 > gcc
単純に最適化でも、bccは糞でしょ。MMXやSSEすらもインラインasmじゃないと使えないからな。 gccならヘッダをインクルードするだけで対応する組み込み関数を使える。
gccはもうすぐ4.0が出るから
まあ学校の課題なんかで使う分にはbccでも十分だがな
ありがとうございます。
>>55 さんの方法でやることにしようと思います。
63 :
デフォルトの名無しさん :05/01/23 01:07:37
>>63 Intelが技術提供してるし、VCも6.0+ProsessorPackから対応してたと思う。
GCCはAltiVecも使えるから、うまくラップすればx86/Mac両対応のSIMD化コードも作れる。
65 :
デフォルトの名無しさん :05/01/23 03:13:06
きれいな模様を格納してある二次元配列のバイナリファイルを作るソースのお手本ください
char kireinamoyou[][]={"綺麗な","模様"};
68 :
デフォルトの名無しさん :05/01/23 05:46:31
祝!100スレ目
配列 x[N]に 0〜N の整数をランダムに、かつ重複がないように入れていくにはどうしたらいいですか?
>>69 int x[N]には0〜N-1までしか入らないわけだが。
>>71 どもです
数が多いんでフラグでやってみます
75 :
デフォルトの名無しさん :05/01/23 09:21:39
あんなのCじゃない > bcc
>>59 >単純に最適化でも、bccは糞でしょ。MMXやSSEすらもインラインasmじゃないと使えないからな。
>gccならヘッダをインクルードするだけで対応する組み込み関数を使える。
それは逆に
gccはヘッダをインクルードして対応する組み込み関数を使わなくてはならないが、
bccならば、MMXやSSEすらもインラインasmで片付いてしまう
とも読み取れるが?
gccってasm使えないんだっけ?
>>77 いや、そういう話じゃなくて、単に
>>59 の文章は
「これが gcc の利点だ」
という説明になっていない、ってだけ。
gccってWindowsでも使えるとですか?
猫がなんとかってとこにbccがいいって書いてあったから それにしたんですがgccにします ダウンロードするだけでいけますよね
その前に猫を参考にすること自体やめた方がいいような……。
>>84 やっぱり・・・
なんか分かりにくいのもそうなんですけど
何か文章が腹立つんですよね
ちなみに俺はSDK編をサンプルとしてだけ使っている。
プログラム自体は稚拙で汚いよな 純粋に API の使い方だけ見ればいいと思う
88 :
デフォルトの名無しさん :05/01/23 11:07:15
>>87 だから、明白にそう意図して書かれたコードじゃん
それ以上の何かを期待する方がおかしい
>>76 屁理屈。インラインasmしか使えないことのメリットなんてどこにもないよ。
>>88 SDK編はいいけど、C言語編は糞だってことでは。
どのくらいのことができるようになればできると言えますか
くだらない質問をせずに勉強するようになったとき
93 :
デフォルトの名無しさん :05/01/23 12:37:46
>91 業務用アプリのプロトタイプを短期間で作成できる程度。
94 :
デフォルトの名無しさん :05/01/23 13:04:14
>>91 できる/できないの2値じゃないってことはいい?
そのうえでだけど、目的が果たせること。
・研究なら成果を出せること
・職業なら金を貰えること
95 :
デフォルトの名無しさん :05/01/23 13:18:01
> 純粋に API の使い方だけ見ればいいと思う APIとかいってる時点で厨房だな。
96 :
デフォルトの名無しさん :05/01/23 13:19:01
おまえらもっとましな本読め
98 :
デフォルトの名無しさん :05/01/23 13:36:20
ここが何のスレッドかわかってないってことだから
100 :
デフォルトの名無しさん :05/01/23 14:02:03
いいえ
得意げに言っておきながら、いざ聞かれると「Cスレだから」か 確かに厨房らしいな
102 :
デフォルトの名無しさん :05/01/23 14:02:59
>>100 100スレ目の100なのに、なんだその素っ気ない返事は。
103 :
デフォルトの名無しさん :05/01/23 14:31:56
あいてが「ほこらしげにいった」ということにしてしまえば、自分の間抜けな発言を ごまかせると思っているあたりが厨だな。
で、理由は?
int i,j char *p[3] for(i=0 ; i<3 ; i++) p[i]=(char*)malloc(sizeof(char)*5); for(j=0 ; j<3 ; j++) p[j]=(char*)realloc(p[j],sizeof(char)*7); これで正常終了したときはfree回数は3回? もしj=2(realloc時)に確保失敗した場合、free回数は2回? 3回?
106 :
デフォルトの名無しさん :05/01/23 14:35:00
>>102 そういうセリフはPart128の256に言えよ。ぼけ
107 :
デフォルトの名無しさん :05/01/23 14:36:44
>>105 NULLをreallocするなよ ぼけ
108 :
デフォルトの名無しさん :05/01/23 14:38:05
>>107 なるほど! わかりました。
どうもありがとうございます。
時代は.NETだよもん
111 :
デフォルトの名無しさん :05/01/23 14:43:26
----------------------------- 切り取り線 ---------------------------------
int i,j; char *p[3]; char str1[4]="qwe",str2[4]="asd",str3[4]="zxc"; for(i=0 ; i<3 ; i++){ p[i]=(char*)malloc(sizeof(char)*5); } strcpy(p[0],str1); strcpy(p[1],str2); strcpy(p[2],str3); for(j=0 ; j<3 ; j++){ p[j]=(char*)realloc(p[j],sizeof(char)*7); } strcpy(p[0],str1); strcpy(p[1],str2); strcpy(p[2],str3); じゃあこれなら?
113 :
デフォルトの名無しさん :05/01/23 15:11:32
だからNULLチェックしろよ ぼけ
114 :
デフォルトの名無しさん :05/01/23 15:13:31
サンプルコードはしなくて構わないだろ ぼけ
サンプルならパソコンぶっこわれてもいいだろう ぼけ
strcpy((char*)58,"メモリも地球も破壊してやる");
>>113 サンプルコードはしなくて構わないだろ ぼけ
107 :デフォルトの名無しさん :05/01/23 14:36:44
>>105 NULLをreallocするなよ ぼけ
107 :デフォルトの名無しさん :05/01/23 14:36:44
>>105 NULLをreallocするなよ ぼけ
107 :デフォルトの名無しさん :05/01/23 14:36:44
>>105 NULLをreallocするなよ ぼけ
>>112 聞きたいのはこういうことか?
for(i=0 ; i<3 ; i++) p[i]=(char*)malloc(sizeof(char)*5);
(略)
for(j=0 ; j<3 ; j++){
p[j]=(char*)realloc(p[j],sizeof(char)*7);
if(p[j]==NULL) /* p[j]==NULLのとき、p[j]は解放する必要があるか */
}
だとしたら、p[j]==NULLなのに解放する必要はないに決まっているだろう
それとも失敗したときはNULLなのか、mallocで確保したままなのかってことか?
それなら上みたらわかるようにNULLになってる
reallocはいったん解放したあとに、大きさの違うものを確保していると考えてよい
121 :
デフォルトの名無しさん :05/01/23 15:33:16
>113はNULLを多少別の意味で使っているようだ。>118は無効アドレスを書き換えるへぼコードを書いた。どっちもどっちだ。
122 :
デフォルトの名無しさん :05/01/23 15:36:37
NULLにstrcpyするなよ ぼけ
123 :
デフォルトの名無しさん :05/01/23 15:38:30
そういえば、その昔、 BSDだとfree(NULL)しても何も起きなかったが、 System Vは free(NULL)した時点でsegmantation fault / core dumped だった。
>>120 > realloc() が失敗した場合には、元のブロックは変更されない。
> つまり、解放されたり移動されたりはしない。
らしいんで、reallocに渡したポインタは解放した方がいいんじゃないの?
ん???
>>123 free(NULL);
はC的には問題ないはず
126 :
デフォルトの名無しさん :05/01/23 15:46:00
>125 てめー他人のことも考えろよ。お前のCとは違うんだ
馬鹿が三人揃ったため、スレの信頼性低下中…
>>125 標準Cなら問題ないですよ。ANSIでもISOでも。
strcasecmpが標準ライブラリにに含まれる「北朝鮮金正日万歳C」だとダメらしいです。
ごめん。 後半部は、電波を受信している人に対しての皮肉なので気にしないで。
このスレだけ文字サイズが大きくなるのは俺だけ?
>>124 あれ、どこにそんなこと書いてあった?
reallocは失敗したら元の領域を解放してNULLを返すはずだが
もしかして俺が覚え違いをしているのか?
>>120 > それとも失敗したときはNULLなのか、mallocで確保したままなのかってことか?
> それなら上みたらわかるようにNULLになってる
> reallocはいったん解放したあとに、大きさの違うものを確保していると考えてよい
エラーの場合、realloc() 前の領域は解放されない。
>>133 手元のANSI-C準拠らしいman reallocで。
すまん、俺が馬鹿だった
つまり、世間に山ほどある、 p = realloc(p, size); みたいなコードは、メモリリークを生む可能性があるのかな。 とはいえ、realloc失敗した時点で、大抵は致命的エラーなので これ自身が問題になることは殆ど無いだろうが。
>>137 それ以上つっこむと、free議論になるんでやめた方がいいかと。
>>133 サイズが 0 の呼び出しなら、
free() と同義だったかと。
【結論】 free()回数は3回だ
10-n%5 の式があったときの評価の順番は 先に(n%5)で引き算は後と考えていいですか?
>141 演算子の優先順位で調べろ
まずこれを読めという本ありますか
The C Programing language. First edition
すれ違い いい加減日本語くらい読めるようになれよ
147 :
デフォルトの名無しさん :05/01/23 21:05:32
>>144 あなたが入手したコンパイラのマニュアル
処理系依存だろうが非標準拡張だろうがそんなことに一切かまうな
まず、そいつで何か作れるまで外野の煽りは一切遮断しろ
それらはすべて何か作れるようになってから論じるべきことだからだ
いくらマニュアル読んだところで文法は書いてないだろう
原理主義うざっ
>>148 挫折したのか? 一番的確な文法書だと思うよ。
ISO/IEC 9899:1999を読め。すべてが分かる。
156 :
デフォルトの名無しさん :05/01/24 01:24:19
キーボードから入力を受付けるときに、 「キー連打」と「一定時間以上キー押しっぱなし」 を区別したいのですが、どうすればよいでしょうか? kbhit()とgetch()を使ってキー入力を判断しているのですが、 私には今のところ、区別できません。 だれか教えてください。 よろしくお願いします。
標準Cにも、区別できません。
>>その前に OS教えてください。早いから、答えによっては怒るよ、TRONなら 怒らない
>>156 入力してるところを撮影した動画を解析すればいいんじゃない?
161 :
156 :05/01/24 01:42:57
162 :
156 :05/01/24 01:44:23
163 :
デフォルトの名無しさん :05/01/24 06:59:13
>>156 タイマー割り込みを使うと簡単に区別できます。
165 :
デフォルトの名無しさん :05/01/24 07:05:58
記念カキコ
166 :
デフォルトの名無しさん :05/01/24 08:46:01
>156 他スレで解決しました
167 :
デフォルトの名無しさん :05/01/24 12:08:40
どなたかご存じの方、教えて下さい。 文字常数の宣言時に、ダブルクォーテーションにて文字列を括るのですが、その中身が長くて見辛い状態です。 これを表記上、改行して見易くしたいのですが・・・可能でしょうか? イメージとしては、 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...(と長い)" を ”xxxxxxxxxxxxxxxxxxxxxxxx(ここに何らかのコード?) xxxxxxxxxxxxxxxxxxxxxxxx(同上) xxxxxxxxxxxxxxxxxxxxxxxx” です。よろしくお願いします。
168 :
デフォルトの名無しさん :05/01/24 12:11:10
char s[]="文字列" "連結";
169 :
デフォルトの名無しさん :05/01/24 12:18:16
ありがとうございます。試してみます。
char s[]="文字列\ 連結";
>>170 インデントが崩れるから使いたくないな、それは
172 :
デフォルトの名無しさん :05/01/24 14:00:23
文字常数age!
char s[]= "文字列" "連結";
char s[] = "文字列" "連結" ;
間違ってコンマを入れるなよ。 コンマに挿れるなら
176 :
デフォルトの名無しさん :05/01/24 14:38:14
連結リストを利用して駅名を順に格納していき、それを逆から参照していきたい のですがこの後がわかりません。どうしたらいいのでしょうか? typedef struct Station { char name[256]; struct Station *next; } Station; int main(void) { Station *currents; Station *lasts = NULL; char buf[256]; currents = malloc(BUFSIZE); printf("駅名入力(終了キー:/e)\n"); while (1) { fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; if (strcmp(buf, "/e") == 0) break; strcpy(currents->name, buf); currents->next = malloc(sizeof(BUFSIZE)); lasts = currents; } return 0; }
177 :
デフォルトの名無しさん :05/01/24 14:47:39
>176 同じタグでtypedefしない方がいい。 データ構造に対する操作は一貫性と共通化のために関数にまとめよ。 逆向きにたどるためには逆向きのリンクのある双方向リストを使え。
再帰して帰りながら参照していけばいいじゃん
*prev入れれ
>>176 typedef struct tag_Station {
char name[256];
struct tag_Station *prev;
} Station;
int main(void) {
Station *currents = malloc(sizeof (Station));
Station *lasts = NULL;
if (currents == NULL)
return 1;
currents->prev = NULL;
puts("駅名入力(終了キー:/e)");
while (1) {
char buf[256];
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if (strcmp(buf, "/e") == 0)
break;
strcpy(currents->name, buf);
lasts = malloc(sizeof (Station));
if (lasts == NULL)
break;
lasts->prev = currents;
currents = lasts;
}
while (currents->prev != NULL) {
puts(currents->name);
free(currents);
currents = currents->prev;
}
return 0;
}
181 :
176 :05/01/24 15:07:38
>>177-180 ありがとうございます。
180で実行したところ、入力した文字ではなく
ヘヘヘヘヘヘのように文字化けして出力されるので
すが、何が問題でしょうか?
182 :
デフォルトの名無しさん :05/01/24 15:19:15
>181 初期化忘れの要素がある論理エラー。 状態チェックのできない思考回路。
>>180 これって順に格納して逆から参照してるんじゃなくて、
逆に格納して順に参照してるんでは?
184 :
デフォルトの名無しさん :05/01/24 16:05:31
>>177 >同じタグでtypedefしない方がいい
プ
死期蔑死の間違い
ナウイ ヤング
187 :
デフォルトの名無しさん :05/01/24 17:54:41
C言語のおかげで俺は自殺するはめになりました。 さようなら。
↑そいつはよかったな
>>187 死なないで!
私…貴方が死んだら悲しむわ。
ね、私が貴方の生きる目的にはなれないのかしら…
>>189 何が面白いのかよく分からんが、
とりあえず自演乙。
>>190 感動しろ、この変態既知害。真人間の感性を教えてやろう
ひまばんだな
ぶらり
超初歩的な質問ですがよくわからなくなったとです。 for(a=0, a<=30, a+=0.1){ N_vector[0] = 2*a; N_vector[1] = 3*a; } これってfor文でいろいろ計算しても、途中の計算は省略されて最後のa=30 しか対応しませんよね。 それぞれの値を対応させるには何を付け加えればいいのですか?
196 :
デフォルトの名無しさん :05/01/24 19:41:26
>194 iよ、そうよiよー。 でも単なるiじゃないの。 前進するiよ。[i++]
>>192 >for(a=0, a<=30, a+=0.1){
とりあえず、これはやめた方がいい。
>>195 これは単純なプログラムだけど、
aが0から30まで0.1ずつ変化して増えていくけど、
1つ1つのベクトル?値を出して何かに対応させたいのだろう。
おれにはようわからん。
199 :
デフォルトの名無しさん :05/01/24 19:54:19
>>176 >>180 いまさらなんだけど
buf[strlen(buf) - 1] = '\0';
って必要なの?
200 :
デフォルトの名無しさん :05/01/24 19:54:35
>>194 わかった!
おそらく写像みたいな感じだろ?
あの変化からして301個の値が出て、それぞれこれはここに対応、
これはここに対応みたいに全ての値を反映させたいんだろ。
意味はわかるがやり方がわからん。
>199 改行文字、って知ってるかい?
>>194-198 a が int型 だったらどうするんだい?
さらに言えば仮に a が double や float だったとしても、
a = 30 のケースが無事実行されるとは限らないし。
>>194 はマルチスレッドのプログラムで、別スレッドからN_vectorを参照しているのではないかとE.S.P.
204 :
神楽みさき :05/01/24 20:09:10
二元配列にして、aは10倍して、各ベクトル要素は1/10にする。
for(a=0; a<=300; a++){
N_vector[0][a] = 0.2*a;
N_vector[1][a] = 0.3*a;
}
これではダメ?
http://misaki123.s10.xrea.com/R/ ↑良かったら、みさきのゲームしてー。
みさきのゲームどこにあるの? ダウンロードできません。
206 :
デフォルトの名無しさん :05/01/24 20:11:39
アドレスとかポインタって言われても全くわからん。 本読んでも全くわからん。 俺ははっきりいってアホです。知能遅れです。 すげぇーわかりやすく説明してくれる達人はいませんか? 小学生でもわかるように。
こら、ちゃんと日本語で説明しないから憶測だらけになったじゃないか!
住所 住所がかける紙
209 :
デフォルトの名無しさん :05/01/24 20:16:57
>206 いや、お前はゴリラより賢いはずだ。読んでいる本の種類を間違えなければ理解できたはずだ。
210 :
デフォルトの名無しさん :05/01/24 20:19:05
俺も知能遅れだけどポインタぐらいわかったぞ!!!
211 :
デフォルトの名無しさん :05/01/24 20:20:31
賢い者よ。 アドレスは何かの場所だ。 ポインタは何かの場所を書いた紙だ。 ここまで分かるか。 おそらく君の読んでいる本は間違えてる。
212 :
デフォルトの名無しさん :05/01/24 20:24:22
「賢い」は「かしこい」ってよむんだ。 賢い君が読んでいる本の題名を言ってみろ。
>>206 >すげぇーわかりやすく説明してくれる達人はいませんか?
今お前は、当の相手がいるかいないのか分からないのに、
その「達人」の話をしているだろ?
ここでいう「達人」って言葉は「"達人" へのポインタ」なんだよ。
void TatujinCheck(Tatujin *達人)
{
if (達人 != NULL) /* もし達人がいれば */
printf("%s。教えてください", 達人->名前);
else
printf("ケッ、ろくな奴がいねぇな");
}
>213 たとえnullでなくても、 指している先が達人であるとは限らんが?
>>
220 :
デフォルトの名無しさん :05/01/24 20:42:50
>>206 です。
全くわかりません。
本当に俺はアホなのですが、プログラミングをしてみたいのです。
頑張ってif文とかfor文を1ヶ月かけて理解できました。
ポインタとかアドレスでつまづいています。
マジで教えて下さい。
221 :
デフォルトの名無しさん :05/01/24 20:45:23
>220 アホよ、何でむずかしいC言語を選んだ?
プログラミングをやりたいだけならば、 別にポインタを使わなくても良いのでは? 実際にポインタが必要になった時には 自然に分かるようになるもんだ。
どのプログラムでも良いから、 その逆アセのコードとダンプファイルを じっと1時間眺めていろ。 必ず分かる。
224 :
デフォルトの名無しさん :05/01/24 20:52:36
漠然とした質問ですが。check関数とはなんですか? どうやら正しい範囲等を判定する関数らしいですね
225 :
デフォルトの名無しさん :05/01/24 20:55:00
>224 チェックする関数? 標準関数じゃないから知らん
漠然とした質問ですが、sex関数とはなんですか? どうやら子を産む関数らしいですね
is〜のことを言っているのか?
オレに何か用か? 現在違法行為はお断りだ
ポインタが分からなければJavaに逃げればいい
231 :
デフォルトの名無しさん :05/01/24 21:02:22
ポインタのポインタのポインタのポインタ とかでずっと続けていくとしたら、 ANSI C ではいくつまで保障されていますか? switch case の case は257までと,どっかで見ました。
233 :
デフォルトの名無しさん :05/01/24 21:04:14
abort!
>>232 >switch case の case は257までと,どっかで見ました。
怪しすぎ・・・
ポインタが分からなければアロー演算子に逃げればいい
236 :
デフォルトの名無しさん :05/01/24 21:08:24
ぬるぽがわからねーなら、夜の街に逃げれば〜?
237 :
デフォルトの名無しさん :05/01/24 21:10:53
このすれは相変わらずうんこ
ごめんなさい。質問の仕方が悪かったですね。改めて for(double a = -14.5; a <= 14.5; a += 0.1){ N_spp = 0.22*a + 0.5 } こうして、N_sppのそれぞれの要素を、 N_spp = V_point[N] としてそれぞれ値を求めたいのです。 初心者なので説明が上手くいかなくてすいません。
240 :
デフォルトの名無しさん :05/01/24 21:28:31
>238 クリックしたら爆発するんだろ? いつものように厨房三人組がそろったため、クソスレ化してます。
>>240 はブラクラだと思っているのか
それとも257より多いcaseがあるswitchを実行すると爆発すると言いたいのか。
>>239 すまんが、ますますわからなくなった。
Cから離れて、「正しい日本語」で、何をしたいか言ってみろ
243 :
デフォルトの名無しさん :05/01/24 21:36:15
>239 自分の吐く言葉が何をぼんやり指してゐるか考え給へ。君の言ふ対応は、何により定義さるるか。
char c; c = hoge; switch(c){ case 0: ... case 255: default: } ほら257個
普通はヘッダファイルとソースファイルって同じディレクトリに置くのでしょうか? 例えば、hoge_algos.h, と hoge_algos.c っていうファイルを、 \algo\hoge\hoge_algo.h \algo\hoge\hoge_algo.c とすべきなのでしょうか? それとも.cファイルは.cファイルで同じディレクトリにまとめた方がいいのでしょうか?
量の問題
>>245 時と場合による。
大規模開発の場合、
グローバルな共通関数等は/include等に纏めた方が良いだろうし、
モジュールローカルな関数なら同じディレクトリに入れるべき。
小規模なら、みんな同じディレクトリに入れてしまったほうがわかりやすいかも。
大事なのはどうすれば解り易く、保守しやすいかということ。
248 :
デフォルトの名無しさん :05/01/24 21:59:45
> switch case の case は257までと,どっかで見ました。 デマです。
249 :
デフォルトの名無しさん :05/01/24 22:02:50
> ポインタが分からなければアロー演算子に逃げればいい 電話かけるときに言いますよね > アロー
250 :
デフォルトの名無しさん :05/01/24 22:03:47
>245 \algo\hoge\hoge_algo.h を他の機能からも参照するのであれば、 \algo\h に置いたほうが良い。 \algo\hoge\ にあるソースからしか参照しないのであれば、 \algo\hoge\ に置いたほうが良い。 \algo\hoge\hoge_algo.h が数行で、\algo\hoge\hoge_algo.c からしか 参照されないのであれば、\algo\hoge\hoge_algo.cに含めるべき。
>>238 というか、
>最低限257まで分岐
って事は
>>244 が言うように変数のサイズが最低だった時の上限の事で…
日本語じゃなくてC言語に弱かったんじゃない?
ま、でも、C99規格を満たす処理系でも、 1023個を超えたら動かなくなる可能性はある。
>>220 ifやforで1ヶ月なら、ポインタで6ヶ月位かければちゃんと覚えれるんじゃないかな?
延々と実験プログラム組んでみながら勉強した方が人に聞くより良いと思うぞ(100何とかは〜)
257 :
デフォルトの名無しさん :05/01/24 22:56:28
すみませんがお教えください. 現在gcc(Linux上)を使って作ったプログラムをWindowsのVC6.0(?)でコンパイルしようとしてます. コマンドラインオプションの処理で,gccのunistd.hにあるgetopt()を使ってるんですが, どうやらVCには無いようです.VCで代わりになるようなものってありませんか? いちいち組まないといかんのですかね? それから LinuxとWindows,共通に使えるMakefileの書き方についての情報(HP等)がございましたらお教えください. いちいち変更するより1つで済めばとても素敵なんです.
258 :
デフォルトの名無しさん :05/01/24 22:58:50
259 :
デフォルトの名無しさん :05/01/24 23:05:59
>257 Linuxには強大なオープンソースコードがある。VCでコンパイルできる getopt.c を探せ。
>258 Win32APIスレというよりCかなと思ったんですがそっちに移ったほうがよいですか? >259 むー gccのソース展開すんの大変. 最終手段として採用させていただきマンモス. >260 cygwinのgccでコンパイルすりゃいいのは分かってんですけどね, 使いたいdllがあるんでVCでコンパイルしようかなーと. >261 おまい誰?
cでストリームを使って コマンドプロンプトにファイルの内容などを表示させるのでなく、 実際にファイルを開くことのできる関数はあるのでしょうか? 初歩的な質問ですがご教授お願いします。
fopen
>>262 >cygwinのgccでコンパイルすりゃいいのは分かってんですけどね,
>使いたいdllがあるんでVCでコンパイルしようかなーと.
何か知らんが、そのdllはcygwinからでも使えるはずだが。
>>264 fopenを使ってストリームと結びつけるのではなく、
実際にファイルを開きたいのですが・・・
268 :
デフォルトの名無しさん :05/01/24 23:33:07
266は実行(ダブルクリック)したときと同じ動作をしたいのか? notepad.exeだけ?
もしかしてバイナリ処理がしたいとか? それならfopen→fread/fwrite→fcloseで出来るわけだが
>>267 ストリームを使ってもファイル(.exe,.bat)などを
ひらく(実行する)ことができるのでしょうか??
できるのならやり方を教えてください。
271 :
デフォルトの名無しさん :05/01/24 23:37:15
>263 ShellExecute API。 これからはwinapiの勉強もしなさい。
>>270 「ひらく」 と 「実行する」 は意味が全然違うぞ。
>>270 標準関数だけで済ますなら
system(実行したいファイルのパス);
274 :
デフォルトの名無しさん :05/01/24 23:41:00
例えばウイルス.exeを例にとると メモ帳で開きたいのか・・・? 実行(ファイルを開くとも言う?)させたいのか・・・? 後者は危険だなw
まず、ストリームの定義をはっきりさせて、 Cでいうファイルを開くという意味と、 プログラムを実行するという意味と、 ファイルを引数としてプログラムを実行するという意味の違いを区別しろ
cでいうプログラムを実行するという意味です。
「ストリームを使う」とはどういう意味なんだ?何をしたい?
いや
>>273 のようにしたいのですが
それだと半角スペースを含むファイルパスを指定すると
エラーがでてしまんです。なにか解決策などありますか?
>>278 シェルに依存するが大抵はダブルクォーテーションで括ってやればよし
>>278 ひょっとして、scanf("%s"〜〜);で取り込んだ文字列をsystemに渡してないか?
>>272 Windows世代って時々すごいこと言うよな。
282 :
デフォルトの名無しさん :05/01/25 00:02:30
>>279 括ってるんですが、エラーがでるのですが・・・
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch[] = "C:\\Dtetets and Settings\\Owner\\デスクトップ\\20050124_2s[1].jpg";
system(ch);
return 0;
}
>>283 パスそのものを括るのかと
char ch[] = "\"C:\\Dtetets and Settings\\Owner\\デスクトップ\\20050124_2s[1].jpg\"";
これだからウィンドウズ世代は…
'C:\Dtetets' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示されます。
287 :
デフォルトの名無しさん :05/01/25 00:09:45
マッカーサーの再来 ゲイツの愚民化戦略そのままだな・・・
「Dtetets」 って・・・
Windowsって、.jpgが実行できるのか。知らんかった。
.htmlも実行できるぞ
フォルダも実行。
C:\>\temp '\temp' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
294 :
デフォルトの名無しさん :05/01/25 00:31:33
struct str1{ char *name; char *add; char *tel; }str2; str2 *str3; で宣言してmallocする場合、 str3 = malloc(??); ??の部分ってなんと書けばいいですか? どれくらい確保すればいいのかわかりません。 sizeof(str2);でいいんですか?
環境依存の質問に、何得意げに答えてんだ…
図に乗るから一々答えんな。
>>294 なんで人に訊くんだ…
malloc(sizeof str2 * 欲しいだけ)
で、「欲しいだけ」は君しか知らん。
str2 *str3; そもそもこの行おかしくないか・・・? typedefするなり struct str1 *foo; なりじゃ?
300 :
294 :05/01/25 00:45:25
まだ 欲しいだけが分からない場合は適当でいいってことですかね? 途中でreallocするとかするんでしょうか?
>>299 (関連付けされたアプリケーションで)開く
>>301 (とマジレスしてみる) だってwwwww
つまり
>>263 の発言はある意味ただしかったのか・・・
てかここにいるやつもそれくらいわかるだろーに・・
>>300 ああ、途中で増えるわけか。
1つづつ増やすと realloc 何度も呼ぶ事になるから、例えば
#define STR2_AUGUMENT 100
size_t num_alloc = 0; // 割り当て数
size_t num_used = 0; // 使用数
str2 *str3 = NULL;
としておいて、増やす時に
if (num_used >= num_alloc) {
num_alloc += STR2_AUGUMENT;
str3 = (str2 *)realloc(str3, sizeof str2 * num_alloc);
}
str3[num_used].name = ...
:
num_used++;
とかするといいんじゃないですかねぇ。
307 :
デフォルトの名無しさん :05/01/25 01:50:57
strstr() strlen() のプログラムソースを教えてください
309 :
デフォルトの名無しさん :05/01/25 02:08:21
どうやらここにはアホの僕にポインタとかアドレスを超わかりやすく 説明してくれる人はいないみたいですね。 俺は本当に知恵遅れなんです。 それでも必死でがんばっています。 何とかお願いします。
>>309 何が知りたいんだ?
ポインタの概念か
使い方か
住所が書ける紙 住所
「メモリ内の任意のアドレスに読み書きするための仕組み」 でいいんじゃないか
実際には任意のアドレスには書き込み出来ない訳だが
それはOSの制限であってポインタの本質とは関係ないけどな
定義の論争に入っちゃたら説明どころじゃなくなるぞ、と 場所を指す、なんていってもまずは、 コンピュータ――特にメモリ周り――の構造、というか原理が わからないことには理解できないと思うから、 知らないならそこからやった方が良いと思われ。
318 :
名前は開発中のものです。 :05/01/25 02:28:09
浮動少数をゼロ割りした際に printfで表示したところ 1.#IND00 と表示されました。 浮動少数が1.#IND00 かどうかチェックするにはどうすればいいでしょうか? ためしに float a = 1.0f / 0.0f; if( a == 1.#IND00 ) { } としたのですが、コンパイルエラーですた・・。
>>308 わかんね。。。
ヘッダファイルの繰り返し。。
ヘッダなしでよろw(オオソドックスな#stdio.h などはいいんですが、、)
>>219 strstr.c
や
strlen.c
で調べる
>>318 float a = 1.0f / 0.0f;
printf("%08x", (unsigned long *)&a);
>>322 アドレスを表示する意味が分かりません。
しかもわざわざキャストまでしてw
すまんかった。 printf("%08x", *(unsigned long *)&a);
325 :
デフォルトの名無しさん :05/01/25 08:51:55
aのアドレスが奇数バイトめだったらどうするんだよ ぼけ
326 :
デフォルトの名無しさん :05/01/25 08:52:40
それをやりたいなら、ただしくはcharの配列にcastだ。
327 :
デフォルトの名無しさん :05/01/25 09:04:43
まあfloatだから奇数バイトめってことはないだろうけどな (アラインメントで例外おきるような環境の場合)。 でもまあ、floatとlongで同じアライメントだともかぎらんし、 ふつうcharだろうな。
328 :
デフォルトの名無しさん :05/01/25 09:08:19
float a = 1.0f / 0.0f; if(a == 1.0f/0.0f) { }
float a= 1.0f / 0.0f; if (a == 2f / 0f) { }
330 :
デフォルトの名無しさん :05/01/25 09:57:48
連結リストの解説でよくでてくるposってなんの略なんですか? pointer of struct....ちがうか。
331 :
デフォルトの名無しさん :05/01/25 10:08:54
position;位置
332 :
330 :05/01/25 10:12:47
>>331 ア・・・ なるほど、ありがとうございます。
確かにプログラマ向けの略語辞典は少ないな。
334 :
デフォルトの名無しさん :05/01/25 10:49:30
whileで繰り返し一行ファイルから表示されて それにscanfでうちこんで比較するタイピングもどき作ってるんですけど ファイルからの一行表示をランダムにするにはどうするのでしょうか? 前スレでmallocの事がでてきたんですけど初心者で分からなくて;
>>325 随分と半可通なレスですね。
偶数ならいいって話でもないでしょう。
336 :
330 :05/01/25 10:51:05
連結リストの仕組みがいまいち理解できないので アドレスみながら実行してみたんですが、それを見ると・・ headerを現在のposの位置に動かすことによって次のposの 位置がheaderに押し出されるように現在のposの先の位置に 移動しているようなんですが、 なんでなんでしょうか? 頭がワンワンパニック状態です・・
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< ぱいちんこぱいちんこ! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< ぱいちんこ! ぱいちんこ〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
338 :
デフォルトの名無しさん :05/01/25 10:58:42
>336 代入には副作用がある。代入すると元のデータが破壊されてしまうのだ! データ構造の変化を紙か頭の中に描け。 そしてまともな解説を探せ
339 :
330 :05/01/25 11:03:46
代入されると破壊されるってことは現header位置がなくなるってわけで でも後で参照できるってことは・・・・ ウワー
340 :
デフォルトの名無しさん :05/01/25 11:06:40
>334 行の格納先は文字列バッファ。そのメモリはmallocで確保しろ。複数行を管理するなら、バッファへのポインタが複数必要。これもサイズが小さければmalloc,realloc,callocをそのまま使えばよかろう。
341 :
デフォルトの名無しさん :05/01/25 11:11:01
printf("%p\n", hoge)みたいな感じをいくつか入れたら LINK : fatal error LNK1168: 書き込みモードで Debug/programming.exe を開けません link.exe の実行エラー が出たんですが、どうしてでしょうか? visual C6.0 windows2000
342 :
デフォルトの名無しさん :05/01/25 11:11:42
>339 古いデータと新しいデータを区別しろ。next'とnextとか。 代入しても大丈夫なように代入先のデータを別の一時的変数に代入しておくか、手順を見直せ。
343 :
デフォルトの名無しさん :05/01/25 11:15:05
>341 programming.exeが実行中だろう。よければ強制終了しろ
344 :
デフォルトの名無しさん :05/01/25 11:30:50
例えば typedef struct tag_foo { char var_foo[256]; } Foo; int main(void) { Foo *p_foo; func_getword(stdin, &p_foo); return 0; } void func_getword(FILE *fp, **p_foo) { fgets(*p_foo, sizeof(*p_foo), fp); } じゃ"左側が構造体か共用体に対するポインタではありません"ってエラーに なるんですが、どうしたら操作できるのでしょうか?
345 :
デフォルトの名無しさん :05/01/25 11:33:39
まちがえました、↓です void func_getword(FILE *fp, **p_foo) { fgets(*p_foo->var_foo, sizeof(*p_foo), fp); }
347 :
デフォルトの名無しさん :05/01/25 11:35:23
>344 構造体ポインタは ptr->member のように使うんだ。 p_fooは無効アドレスを刺し殺しているポインタだろ?
348 :
344-355 :05/01/25 11:39:15
グローバル変数で宣言したら問題なかったのですが、 この方法しかないのでしょうか?
>>309 > どうやらここにはアホの僕にポインタとかアドレスを超わかりやすく
ポインタ:プログラム上で扱うオブジェクトがどこにあるかを指し示すもの
アドレス:CPU がメモリをアクセスする際のメモリの位置
350 :
デフォルトの名無しさん :05/01/25 11:43:49
>348 大局変数は大局的に共有できる利点がある。共有しなくても関数の引数で渡せる
351 :
341 :05/01/25 11:43:52
>>343 解決しました、ありがとうございました。
352 :
336 :05/01/25 11:51:16
for (pos = header; pos != NULL; pos = pos->next) { printf("%s\n", pos->station); 現在posに連結先のアドレスを代入することによって どんどん逆参照している(アドレスがNULLに近づいていっている)みたいなんですが、 ということはこの場合nextではなくprevと書くのが正しいのでしょうか?
353 :
344-355 :05/01/25 11:53:30
>>350 この場合、自作関数に引数として渡した後
どういった演算子で構造体内の変数を参照できるのでしょうか?
355 :
344-355 :05/01/25 12:04:02
初心者お断り・・。
356 :
334 :05/01/25 12:12:50
前スレで768さんが char *str; str=malloc(); 行番号 = ((double)行数*((double)rand()/RAND_MAX)); pirntf("%s",str[行番号]); って書いてあったんですけど行番号の列がよくわかりません
357 :
デフォルトの名無しさん :05/01/25 12:30:42
>356 rand,double,RAND_MAXをおまいのヘルプで調べろ、ぼけ。ここはおまいらの来るところじゃない
>>344 > void func_getword(FILE *fp, **p_foo)
この「**p_foo」ってのは何を指すポインタや?
*foo
>>318 if (isinf(a)) とか、
if (a == INFINITY) とか。
無限大の表現が1個とはかぎらないし、マイナスもあるから、前者のみ。
DATA01というプログラムを変数TIMEをパラメータとして渡して起動させる プログラムを作りたいのですが。
>>362 が、何?
方法なら百件弱前のレスを見とけ
#まさか引数の渡しかたが…なんて言うなよ
>362 system("DATA01 TIME");
>>362 ワードの中の人が、「助詞の連続」というエラーを吐きました。
>>365 エラーと警告の区別もつかないのかと小一時間(略
368 :
デフォルトの名無しさん :05/01/25 17:47:47
質問というよりお願いなのですが・・・・・。 以下の問題がさっぱりわからなくてお手上げ状態です。指針、アドバイスをお願いします。 1 文字列をキーボードから読み取り、その文字列を暗号化した文字列を表示するプログラム。ただし、入力する文字列は英数記号のみとする。 2 暗号化は次の方法で行う。文字列中のローマ字を大文字小文字を問わず下記に示すとおりの置き換えを行う。 3 ローマ字以外の文字は暗号化しない。 a b c d e f g ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↓ ↓ ↓ ↓ ↓ ↓ ↓ n o p q r s t
369 :
デフォルトの名無しさん :05/01/25 17:53:54
英数文字コードはchar型の整数。 'n'-'a'+1だけずらせ。
370 :
デフォルトの名無しさん :05/01/25 18:25:35
>'n'-'a'+1だけずらせ。 ずらすとはどうやるんですか?質問ばっかですいません。
>>368 宿題なら以後該当スレに。
このスレ的には極力環境依存しない方針で
const char org[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const char crypted[] = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm";
を用意しておいて、対象文字が前者中に存在していればそのインデックスに該当する後者の文字を取得する方法が無難か。
或いはasciiコード限定ならば、
if (org >= 'A' && org <= 'M || org >= 'a' && org <= 'm') {
crypted = org + 'N' - 'A';
} else if (org >= 'N && org <= 'Z' || org >= 'n' && org <= 'z') {
crypted = org - 'N' + 'A';
} else {
crypted = org;
}
とでもすればよかろう。
>369は短慮。
374 :
デフォルトの名無しさん :05/01/25 20:20:56
お前ら本当にC言語使えるのか? 頭悪い奴らばっかりだな。
if(buf[i]が小文字だったら) buf[i]+='n'-'a';
>374 うざいマルチ
<ctype.h>のislower,isupper,isdigitで文字種判定
ん? 374に何か書いてあるのか。
事故解決しました
printf("うんこスレ");
381 :
デフォルトの名無しさん :05/01/25 23:17:34
こいつ。改行のしかたもしらんのか
うんこトークしようぜ!!!!!!
383 :
デフォルトの名無しさん :05/01/25 23:30:37
unkondo
386 :
デフォルトの名無しさん :05/01/26 03:12:44
unsigned int を int にキャストして代入する必要はあるのでつか?
387 :
デフォルトの名無しさん :05/01/26 03:16:08
ありません。
388 :
デフォルトの名無しさん :05/01/26 03:19:35
とんくす!
ゆにくす!
えにくす!
おりくす
392 :
デフォルトの名無しさん :05/01/26 08:12:21
signal関数で呼び出す関数に引数を渡すことはできまつくぁ?
394 :
デフォルトの名無しさん :05/01/26 08:15:36
>>393 おまいもしや・・・しらんな?プププ
396 :
デフォルトの名無しさん :05/01/26 09:48:34
おまいはアホの子か!
397 :
デフォルトの名無しさん :05/01/26 09:49:48
ファイルの前のほうで (1) #include (2) #define (3) externな関数 (4) ふつうのプロトタイプ(ヘッダーにかかない場合) (5) staticなプロトタイプ (6) externな変数 (7) そのファイルで実体を初期化する変数 (8) staticな変数 (9) typedef などはどの順で書いてます?
>>397 そんな事を聞いても無意味だろ?
アンケート取りたかったら田舎の街頭でやれ。
ここでやると迷惑だと思わないかね。
399 :
デフォルトの名無しさん :05/01/26 09:55:22
なんだー 398 はそんなことも答えられないからといって、その程度で暴れるのか ;-)
400 :
デフォルトの名無しさん :05/01/26 09:56:25
400様
401 :
デフォルトの名無しさん :05/01/26 09:56:57
おれは (1)、(2)、(9)、...の順だな。まあたいがいのやつはそうだろうけど
gccのソースコードでも見て参考にしろよ、アフォ
>>397 前もって書かなければならない順に書く。
大抵は、(1)、(2)、(9)、、、の順になるな。
404 :
おながいします :05/01/26 12:58:26
2つの文字列A,Bを入力し、各文字列の文字数を調べ、文字数が多い文字列のなかにもう一方の文字列が含まれているかどうか を調べるプログラムを作成せよ。ただし、 両文字列はアルファベットと数字、空白文字を要素とする文字列とする。 両文字列とも文字を要素とする配列に読み込むこと 文字列の入力にはgets(fgetsでもよい)を用い、入力可能な文字数の文字列を扱うこととして良い。 入力文字のエラーチェックは行わなくてよい strstr(),strlen()などの文字列関数は使わず作成すること が問題です。おねがします
>が問題です。おねがします ( ´_ゝ`)フーン で、お前は日本語も読めないし検索も出来ない低脳って訳だな?
406 :
おな :05/01/26 13:06:30
こいつズレてるね ただの池沼か
すいません、ちょっと質問なんですけど。 ファイルから 12345,moji,6789 のようにカンマで区切られてる文字列を読み込むときで それぞれ数値、文字列、数値の型に入れたいときってどうすればいいんでしょうか… 色々検索してみた所fscanfでも出来なくはないが工夫が必要だと書いてあったんですけど。 やっぱりfgetsを使ってコツコツやった方がいいんでしょうか。
>>408 int a, b;
char s[256];
fscanf(fp, "%d,%[^,],%d", &a, s, &b);
>>409 ,411
回答どうもです。411さんのやり方でやったら簡単に出来ました。ありがとうございます〜
> 文字数は調べようがありません。 嘘言うんじゃない。
未来はわからん
宿題丸投げの莫迦は放置。
416 :
デフォルトの名無しさん :05/01/26 17:14:36
質問です 関数の戻り値に構造体を使ってみたのですが、これって大丈夫なんでしょうか? コンパイルはとおりました。動作も大丈夫っぽいです 「引数はスタックに積まれるらしいけど、戻り値はどこに格納されるんだろう」 という疑問が残ってます。 宜しくお願いします
>>416 Cだよね、エラーにならない?
Cはコールばいバリューしか無いのだから処理系依存だろう
すまない、教えてくれ。 fp1=fopen("XX.csv","r"); の、XXの部分を変数に指定することは可能だろうか? part01.csv〜part10.csvで同じようなデータを1回1回読み出すのが面倒なんだ
>>416 例えばとあるコンパイラだとstruct hoge func(int);のような関数が内部ではvoid hoge(struct hoge *, int);と化している。
(そしてその関数を呼び出すときにはコンパイラが密かにstruct hogeの変数を作りそこへのポインタを隠し引数に渡す)
418>> そのようなストリングを渡せば良いだろ、こういう良いな
>>418 char Filename[11];
sprintf(Filename, "part%02d.csv", i);
すまない、Main(a,b) の xxx(a,b)を変えたいんだがどうしたらいい
>>422 やりたいことの意味がわからん。
変えたければ変えればいいじゃない。
でしょう、よく間違えるのがソースコードの\\
426 :
416 :05/01/26 17:30:41
>>417 VC7.0なんですが、エラーにはなりません。
処理系依存ですか……こんなコードは書かないほうがいいってことですね。
ありがとうございました。
>>419 なるほど。そのように処理するコンパイラがあるんですね。情報ありがとうございます。
>420-421 おおっ、thx! …ストリング渡すとか分からない… fp1=fopen("sprintf(Filename, "part%02d.csv", i);","r"); これでファイル開くのかな? ごめんね。おいら駄目学生だから、ごめんね
>>426 処理系依存ってのはこの場合戻り値がどこに置かれるかということであって、
関数の戻り値に構造体を指定すること自体は処理系依存ではないはず。
それとVCもその「とあるコンパイラ」に含まれるはず。
>>427 違う
char Filename[11];
sprintf(Filename, "part%02d.csv", i);
fp1 = fopen(Filename, "r");
ところでFILE *fp1, *fp2, *fp3, ……;なんてこと、まさかやっていないよな?
>>428 いいやつだ、絶対関数に出来ないし、現実を認めろ、
でもあんちMSなので敵を作りたくないな
>431 おもいっきりやってましたorz 授業で教わったファイルの開き方がFILE *fp1;だけだったんだ… fp1の宣言はどうすればいいんだろう?
>>432 どこにできない(処理系依存等)と書いてあるんだ?
>>433 ファイル同時に開くんじゃなければ fp1 だけでよし。
for (i=1; i<=10; i++) {
sprintf(Filename, ...
fp1 = fopen(Filename, ...
:
:読み込み
:
fclose(fp1);
}
同時に開く必要があるなら
>>434 FILE *fp[10];
for (i=1; i<=10; i++) {
sprintf(Filename, ...
fp[i] = fopen(Filename, ...
}
親切な人が多いね
438 :
デフォルトの名無しさん :05/01/26 19:00:52
逐次型で10進数を2進数にするには どうすればいいですか?
÷2 ÷2 ÷2 ÷2 ÷2 ÷2 ÷2 ÷2 ・ ・ ・ ・ ・ ・ ・
グローバル関数をヘッダの中に定義して 色々なところでそのヘッダを読み込んで使っていたら インクルードエラーが発生しました。 #ifndef _INC_ヘッダ名 #define _INC_ヘッダ名 #endif で、囲えば大丈夫だと思っていたんですが。 グローバル関数の場合はヘッダにして使ってはまずいって事でしょうか? 他のプログラムでも使う為にヘッダで使い回しができるものだと思っていたんですが・・・。 #ifndef〜#endifの間には関数が4,5個ほど定義してあって、 いずれの関数も「すでに定義されています」とエラーになってしまいます。 他にクラスを定義したヘッダファイルがあるんですが、 それは#ifndef〜#endifでインクルードガードが機能しているみたいです。 原因は何なのでしょうか?
441 :
デフォルトの名無しさん :05/01/26 19:58:09
>>436 オマエ西日本の人だな
>『開くんじゃなければ』
>>440 リンカエラーじゃなくて、インクルードエラー?
だからさ、バージョン教えろ、普通は#onceディレクチブあるし
>>442 すいません、
error LNK2005
って書いてあるからリンクエラーでいいんだと思います。
インクルードエラーは指定したヘッダファイルが無い時とかですかね
>>445 同じ名前のグローバル関数が複数のオブジェクトファイル内に存在して、
それらをリンクしようとしたらどうなると思う?
ヒント:リンカはそれらの中身が同じかなんて考えない
>>446 それを回避するための
#ifndef _INC_ヘッダ名
#define _INC_ヘッダ名
#endif
だと思っているんですが。
グローバル関数の場合はインクルードガードが適用されないって事でしょうか・・・?
>>447 とりあえず標準のC言語で話を進める。
まず、Cのソースから実行可能形式にビルドするまでには、
三つのプログラムによって処理をすることになる。
・プリプロセッサ
―インクルードやらマクロやらを展開する
・コンパイラ
−機械語に変換してオブジェクトファイルを作る
・リンカ
−複数のオブジェクトファイルやライブラリをリンクして繋ぎ合わせる
これらは、それぞれ独立して処理することが可能。
でだ、その#...はプリプロセッサに対する命令であって、
コンパイラやリンカには関係が無い。
だから、コンパイラに渡されるときには既に、#include "hoge.h"という一文は、
hoge.hの中身に置き換わっているし、#ifndefなんかも処理されてなくなっている。
あくまで、それは、複数回インクルードするのを防ぐためのものであって、
その中身に関して保障されるものではない。
449 :
デフォルトの名無しさん :05/01/26 20:34:36
>三つの もろに処理系依存
>>447 おっと、ローカルな関数の場合はなぜ通るかも言っておいた方が良いか・・・
ローカル関数は、コンパイルされたときに、外部にその関数名を公開されていない。
つまり、名前を持たない状態になっているわけだ。
だから、リンカは名前が重複することが無いから正常にリンクすることが出来る。
無論、完成した実行可能形式のファイルの中には、
同じ関数のコードがそれをインクルードしたオブジェクト分、
複数入っていることになるだろう。
まあ、実際にはその環境独自の拡張とか、色々あるだろうからそっちは知らん。
>>449 「プログラムによって」は余計だったか・・・
言いたかったのは三つのフェーズに切り離せる、と
451 :
デフォルトの名無しさん :05/01/26 20:47:18
>三つのフェーズ どこを見て標準だと主張してるんだ? 標準とは何かを規定している文書でも見たのか?
>>447 // global.h
#ifndef _INC_ヘッダ名
#define _INC_ヘッダ名
#ifdef GLOBAL
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int g_variable;
#endif
// global.c
#define GLOBAL
#include "global.h"
// その他.c
#include "global.h"
ところで、グローバル関数とha?
>>451 ソース探してきた
ttp://www.nirvani.net/docs/ansi_c.pdf 2 This International Standard does not specify
? the mechanism by which C programs are transformed for use by a data-processing
system;
撃沈しましたorz
どこで読んだんだか知らんが思いっきり間違えて覚えてたみたいね
考えてみたらコンパイラもアセンブラと分けられるし・・・
突っ込みどうも
>>454 偉い、あんたは偉い、だって、UNIXが基礎だし、ありがとう
>>452 のようにソース変更しましたが
関数を使いたいところでincludeして使おうとしても
定義されていない識別子と言われてしまいました。
>>448 さんが言っている事もなんとなく理解できてきたのですが
いくつか腑に落ちない点が。
stdio.hやstdlib.hをいくつインクルードしても
エラーが出ない理由はどうしてでしょうか?
先の理由から考えると
コンパイラに渡されるときに
#include <stdio.h>の一文がstdio.hの内容にすり替わっているので
リンクエラーになる、と考える事ができるのでは無いかと思ってしまいます。
stdio.hの中を覗くと回避方法は#ifndef〜#endifで実現しているように見えます。
根本的な事から間違っているような気がしてきました・・・。
457 :
デフォルトの名無しさん :05/01/26 22:15:56
458 :
デフォルトの名無しさん :05/01/26 22:24:53
>457 sub呼び出し引数順序間違い
>>457 それが、理解できるのが高等学校ー大学初等だろう、変なの。
社会に出たら教えろよ
【2行目の「int x」を「int *x」にしましょう】の間違いではないのか?
461 :
デフォルトの名無しさん :05/01/26 22:28:15
sub(a,i); -> sub(i,a);
_INC_ヘッダ名_ ってよく_のプリフィクス見るけど、これってやめたほうがいいんじゃない?
INC_にすべきだな
>>456 だいたい理解できてる
10 #ifndef hogehoge <- 最初にincludeしたときは、hogehogeが定義されてないから20-30行で置き換える
20 #define hogehoge <- ここでhogehogeをdefineするから、二回目からは10-40行は飛ばされる
30 /* ... */
40 #endif
50 [EOF]
>>462 だめ
やっとできました。。。
>>452 さんの方法で
ヘッダファイル内に関数のプロトタイプを記述したら
リンクエラー等無くなりました。
EXTERN int g_variable;
がリンクエラーを起こしたのでとりあえず行削除しておいたら
なんとかビルドできました。
EXTERN int g_variable;の意味はなんでしょうか・・?
と、思ったら。実行途中で
Debug Assertion Failed!
となりました・・・。
ソースの問題っぽいんで見直してきます・・・。
>>456 ヘッダファイルの中に、
int hoge() {
statements;
}
のように、実際の処理を書いちゃってない?
リンカエラーを吐くということは・・・
>434,436 遅レスだけどマジありがとう! すげぇ助かりました!
>>466 うぉ、思いっきり遅かった上に的外れ・・・
>>462 の書き方って、良く知らん何が悪いの?
何かの名前と競合するとか
470 :
デフォルトの名無しさん :05/01/26 22:45:30
>>458-461 ありがとうございます。
やはり問題がおかしかったんですか。LINK先の本の紹介HPに飛んでもここには訂正が無かったので。
時々この問題集の(未知の誤爆)に悩まされてます(汗
今から買う人間のために書名と著者をさらせ
>>469 C/C++、プリプロセッサ、コンパイラ、リンカの仕様で
「アンダースコアで始まるシンボル」は予約されてるものがあるから。
>>471 あなたで10000000000000000000人う財よね
474 :
デフォルトの名無しさん :05/01/26 23:09:23
アバウトで申し訳ないんですが、 「aaa012345 145」などの文字列を 「012345145」と数字のみに変換する方法ってありますか? ニューラインなど、エラーの原因を飛ばしたいのですが。 alnum、digitなどを調べたのですが、使い方がわかりません…。
475 :
デフォルトの名無しさん :05/01/26 23:13:23
>474 isdigitなら別バッファに蓄える。他の文字は読み捨て。
>>474 #include <stdio.h>
#include <ctype.h>
char* extract_num(const char* source, char* dest)
{
char* p = dest;
while (*source++) if (isdigit(*source)) *p++ = *source;
*p = '\0';
return dest;
}
int main()
{
const char s[] = "aaa012345 145";
char d[256];
printf("%s", extract_num(s, d));
}
477 :
473 :05/01/26 23:22:58
うわっ、メチャメチャ早いお答えありがとうございます! これそのまま組み込ませて頂きます!
#include <stdio.h> #include <string.h> #include <ctype.h> char* string_copy_if(char* first, char* last, char* res, int (*pred)(int)) { while (first != last) { if (pred(*first)) *res++ = *first; ++first; } return res; } int main(void) { char s[256] = "aaa012345 145"; char d[256] = ""; string_copy_if(&s[0], &s[strlen(s)], d, isdigit); printf("%s\n", s); printf("%s\n", d); return 0; }
479 :
デフォルトの名無しさん :05/01/26 23:50:51
あ、間違った(w もう見てないんだろうなぁ
481 :
デフォルトの名無しさん :05/01/26 23:55:23
482 :
デフォルトの名無しさん :05/01/27 00:05:35
>>476のプログラムで while (*source++) を while (*source) に変えたら変になります。何故でしょうか。
そりゃ同じもんずっと参照してんだから無限ループになるわな たぶん
すいません、どなたか教えてください。 fp1=fopen("name.csv","r"); while(fscanf(fp1,"%d,%d,%c",&int1,&int2,&char1)!=EOF){ if(int2>=1&&int2<=4){ an[int1-1001].nen=int2; strcpy(an[int1-1001].name,"char1"); } else an[int1-1001].nen=0; } fclose(fp1); この部分を実行したら、name.csvの最初の1行しか認識しないで無限ループしてしまいました。 どこを直せば次の行を読み込んでくれるのでしょうか?
485 :
デフォルトの名無しさん :05/01/27 00:11:04
>>483 そうでした。
すいません。そんなことにも気付かない自分がバカです恥ずかしいです
while (*source) if (isdigit(*source++)) *p++ = *source; こうでいいのかな?
ってもう1個後ろじゃん。もう寝よう
488 :
デフォルトの名無しさん :05/01/27 00:13:05
>>483 では
while (*source) if (isdigit(*source)) *p++ = *source++;
にしても終わらないのは何故でしょう?
489 :
デフォルトの名無しさん :05/01/27 00:14:24
>>487 もう1個後ろにしても永遠に終わらないです
>>488 全部数字ならそれでも動くよ
そっからどうしてかを考えてみろ
491 :
デフォルトの名無しさん :05/01/27 00:18:07
sourceが止まってる
素直にこれで。 char* extract_num(const char* source, char* dest) { char* p = dest; while (*source) { if (isdigit(*source)) *p++ = *source; ++source; } *p = '\0'; return dest; }
493 :
473 :05/01/27 00:18:38
遅ればせながら、
>>478 さんありがとうございます。
頑張ります!
494 :
473 :05/01/27 00:22:20
>>492 あ、改良されてる!
ありがとうございます!
495 :
デフォルトの名無しさん :05/01/27 00:26:11
496 :
デフォルトの名無しさん :05/01/27 00:27:59
>>486だと 整数のときにsourceに+1されるけど 整数じゃない文字が出てきたら+1されずに永遠に繰り返す
497 :
デフォルトの名無しさん :05/01/27 00:28:34
アンカーミス >>488だた
printf("input a\n"); scanf("%d",a); のようなプログラムでなぜかコンソール画面に 最初のprintfの内容が表示されないんですが。 で、input aが表示されてない状態で 数値入力するとちゃんとaに数値が入って、 さらに、入力後にinput aが表示されるんですが。 どうしてですか? ↑のプログラムと実際のプログラムと、 相当違うからこれだけだとわからないかもしれませんが。 そうなったことある。とかそんなでもいいから教えてください。
>498 とりあえず貴様はまずscanfの書式を復習してこい
>>499 基礎が駄目ですね。
scanf("%d",&a);
C++ だと cin の時にバッファはフラッシュされるんだがな…Cだとどうなんだろ
ぱっと見た感じでは
>>498 には全く問題ないように見える。
ちゃんと問題が再現するレベルにコード落とせやボケがといったところか
なんて言うか、複雑だ。 人が作った関数を知っていることは別に重要な事でもなんでも無いんだけど、 使い方をすぐに理解できないというのは問題だと思う。
>>501 498のコード自体は問題無いとは思います。
実際の内容でどこで問題が発生しているのかさえわかんないんで、
再現するレベルに落としたくても落とせません・・・。
なんか前例があればな。。。と思って書いてみた次第です。
自身でreadlineていう入力文字列を返す関数作って利用してたんですが、
そこが怪しいんだと思いますけど・・・。
char* readline(){
char s;
char *tmp=NULL;
int i=0;
while(s!='\n')
{
s=getchar();
tmp=(char *)realloc(tmp,sizeof(char)*(i+1));
tmp[i++]=s;
}
tmp[i]=0;
return tmp;
}
関係無いかもしれませんが書いておきます・・・。
504 :
デフォルトの名無しさん :05/01/27 00:51:52
>>499-500 なんで&aなの?
aが配列だったらscanf()関数内に&はいらないよ
fflush(stdout)しとけば?
506 :
デフォルトの名無しさん :05/01/27 00:53:35
508 :
498 :05/01/27 00:55:45
配列じゃないッス。
配列だと思わなくても、配列である可能性を考慮するべき。
じゃあ配列だった場合の解決法を教えてくれよ
511 :
デフォルトの名無しさん :05/01/27 01:06:51
まくろかもしれないisgiditのなかで++するのはあほ
512 :
デフォルトの名無しさん :05/01/27 01:07:37
isdigitだろ!
514 :
デフォルトの名無しさん :05/01/27 01:16:43
souce[256]=""; while (*source) { ++source } whileは()の評価がtrueの間だけループするものと聞く なのでwhile(1)で無限ループとかは分かる が、なぜsourceの先の配列をインクリメントし続けて配列の末尾に ぶつかった時点で()内がfalseとして評価されるのかがわからんちん 助けてこんなろ
> sourceの先の配列をインクリメントし続けて配列の末尾に > ぶつかった時点で()内がfalseとして評価される そんなことはない。 もしそういう動きをしたのなら、偶然そう動いただけだ。
516 :
デフォルトの名無しさん :05/01/27 01:22:45
>>514 配列の最後には '\n'や'\0'が入ってるんだぽ(たぶん)
さらにその後には永遠とNULLになっている
NULLとしたら偽をあら
517 :
デフォルトの名無しさん :05/01/27 01:29:41
解決 while('\0') { /* 実行されない*/ } while(777) { /* 実行される */ } ちなみに( )内は-1や'\n'とかでも実行された ようするに0以外はすべてトゥルーってことか
518 :
デフォルトの名無しさん :05/01/27 01:34:35
> 素直にこれで。 どこがすなおだよぼけ。 char *extract_num(const char *s, char *d) { � � char *p; � � for (p = d; *s != '\0'; s++) { � � � � if (isdigit(*s)) � � � � � � � � *p++ = *s; � � } � � *p = '\0'; � � return d; }
しかし、あひゃひゃだ、世界はぷぎゃー
手元のヘルプには確かに「このマクロは…」って書いてあるな、実装は マクロになってないけど。C++実装においては関数で定義されていないと std名前空間の処理がうまくいかなくなるからマクロになっていることは ないだろう。でもここはCスレだし、実装がマクロである可能性を完全に 排除は出来ないかもしれないね。
世界に遅れるの当たり前、読解力ないよね?
>>514 終端のNULL文字を0、すなわちfalseとして評価した
>>515 >そんなことはない。 もしそういう動きをしたのなら、偶然そう動いただけだ。
では他にroopを抜けた理由を説明しなさい
>>516 >さらにその後には永遠とNULLになっている
配列の外のメモリ空間の値はOSだけが知っているため、0とは限らない。
試しに終端のNULL文字をカットしてstrlenしてみよう。
とりあえず、インクリメント系で迷ったら n=*pos++; とかじゃなくて n=*pos; pos++; って分けて書けば間違いない。一行一処理。 8行以内のプログラムを書けとか、制限がある訳でもないし
roop?
#define FREE(p) { free(p); (p) = 0; } と #define FREE(p) do { free(p); (p) = 0; } while(0) の二つの書き方を見るんですが、どっちの方がいいとかありますか?
それが、簡潔なら委員だろう?
>>525 if(p)
FREE(p)
else
FREE(q)
みたいな書き方をしてる奴にとっては問題がある。
if(開放した方がよい) FREE(p); else{ 処理 : } って時にわかるYO
てことは do-while を使う方がいいってことですね ありがとうございました
しかし、あひゃひゃだ、世界はぷぎゃー
相変わらずいつまで経っても中身の無いスレだな
>>522 >終端のNULL文字
>roopを抜けた
>OSだけが知っている
カエレ(`・ω・´)!!
>souce[256]="";
コレが通るなら、source の型は char ** だ。
534 :
デフォルトの名無しさん :05/01/27 08:22:34
> if(開放した方がよい) するなよ ぼけ。何度いったらわかるんだ? ぼけ (するなら解放)
で、○○はまだ?
roop
538 :
デフォルトの名無しさん :05/01/27 09:18:49
正しくは NUL終端(文字)、'\0'もしくは0 loop
539 :
デフォルトの名無しさん :05/01/27 12:11:17
reallocって、失敗したら元のメモリはどうなるんでしょうか? newmem = realloc(orgmem, newsize); if (!newmem) // ????? 元のメモリを保障したい場合malloc freeを使ったほうが良いでしょうか? newmem = malloc(newsize); if (newmem) memcpy(newmem,orgmem,,orgsize),free(orgmem);
realloc でググレ 詳しく出てくる
541 :
デフォルトの名無しさん :05/01/27 12:13:47
>539 マニュアル
542 :
デフォルトの名無しさん :05/01/27 12:14:46
すいません、ヘルプに書いてありました。 失敗した場合元のメモリには何もしないそうです。 どっちにしろ失敗すると困るんですけど。
>>539 頭を使おう。
orgmemは元の領域を指したままだから、失敗したときには解放する必要がある。
その点に注意すればrealloc()を使わない理由はない。
失敗したら元の領域だけでやりくりするのなら、
newmem = realloc(orgmem, newsize);
if (newmem == NULL) {
newmem = orgmem;
// 異常終了にしたいなら free(orgmem)してexit(EXIT_FAILURE);など
}
でいい。
>>542 失敗したら困るのはmalloc()でも同じだろ。
realloc(orgmem,0)は動作的に、結局freeとおなじなんですか?
いいえ。
解放するって明記されてますヨ?
548 :
デフォルトの名無しさん :05/01/27 12:46:50
どこがどう違うのか説明できる人いませんか!!?
>548 細かい仕様は環境による。 私に説明責任はない
551 :
デフォルトの名無しさん :05/01/27 14:01:00
438なんですけど 2で割って求めるんじゃなくて逐次型でもとめろっていわれてるんですよ>< if x>2^15だったら100000000000000 else 000000000000000 こんなやりかたじゃ終わんないんでどうしたらいいですか? ちなみに数値は0〜65535までの範囲です
552 :
デフォルトの名無しさん :05/01/27 14:02:04
言われてるんじゃなくて、言ってるんだろ
553 :
デフォルトの名無しさん :05/01/27 14:13:21
頭悪っ!
554 :
デフォルトの名無しさん :05/01/27 14:25:08
シフトしる
555 :
デフォルトの名無しさん :05/01/27 14:40:09
いちいち重箱のすみつっつくことすんなよ あと頭わりーからきいてんだよ
556 :
デフォルトの名無しさん :05/01/27 14:50:10
>555 リンクしろ
まともな回答を期待しちゃいけないスレです
558 :
デフォルトの名無しさん :05/01/27 15:19:29
なんか荒れ気味で恐縮ですが、質問です。 未定義とか、未規定のこと考えてたら、頭がこんがらがってきました。 教えてください。 i = c >= 0x81 && c <= 0x9f || c >= 0xe0 && c <= 0xfc っていうのは、問題ないですか? 評価順序にも問題なさそうですし、副作用もないんですよね。
i = の周りがあいまいな感じがする。
>>558 i, cの型によっては問題。
>>551 宿題なら宿題スレに。
そも、逐次型とはなんじゃいな。
型も影響しちゃうのですか なんだか僕にはややこしいです。 レスありがとうございました。
563 :
デフォルトの名無しさん :05/01/27 15:39:13
>560 10進数の15を例にとると 1000 1100 1110 1111ってな感じに順にしていくのを逐次型っていうらしいです。
>>563 ようするにNビット目が立っていたら2 ^ Nを足すという作業の繰り返しでやれというわけだな。
>>563 その上位から順に見ていくので、二で割る以外に何か求める方法あるかねぇ
・・・二で割るとどうなるか考えたか?
めんどいな、もう! >438
変なやり方を強制するうるさい出題者だな for(i=0;i<?;i++){ b=(1<<(?-i)); ...
for(i=15;i>0;i--)if(x & 1 << i )printf("1");else printf("0");
あ、まちがった。まあいいや。
>565 2で割っても求められねぇだろがあほ
571 :
デフォルトの名無しさん :05/01/27 15:53:27
>>571 最初からそれを出せや!この馬鹿野郎!!!
逐次「比較」型だね
2.この結果を元にして、マイクロプロセッサを利用 した16bit逐次比較型AD変換器のハードウェアを 考えると共に、
575 :
デフォルトの名無しさん :05/01/27 16:09:41
解き方の指針とかないですか?
>>558 i = (0 または 1 になる評価結果);
を意図してるなら、特に問題なし。
(c が signed char だったら意図した通りには
動かないかも知れんが、それは別問題)
>>571 課題はスレ違い。いい加減理解しろ。
ハードウェアの動作原理に従って、ってんだから、 単なるビットマスクじゃ詰まらんね
580 :
デフォルトの名無しさん :05/01/27 16:42:49
567−568のとおりにやってみたんですけど 1桁しかでないんですけど・・・
581 :
デフォルトの名無しさん :05/01/27 17:19:18
>580 解決してよかったな。
582 :
デフォルトの名無しさん :05/01/27 17:31:27
解決してないよ@@
584 :
デフォルトの名無しさん :05/01/27 17:52:09
2次元以上の配列を関数に渡すときに配列の要素数が決まってない場合はどうやって渡せばいいんでしょうか? 1次元に直してから渡すしかないんでしょうか?
585 :
デフォルトの名無しさん :05/01/27 17:59:10
>584 二重のポインタにするか、一次元に展開するかは状況による。 いずれの場合も配列の長さが不定ならばどこかで渡さないと逝けない。 展開には費用がかかる。
>>584 その配列の先頭を指すポインタ(のポインタの…)を渡せばいいじゃない。
void hoyoyo(int*** ayaya);
int a[10][10][10];
hoyoyo(a);
>>586 はアホ
int a[10][10][10][10];
int f(int* a) { ... }
f(&a[0][0][0][0]);
ところで、ポインタ渡したいの?
FOR命令を使用して九九の表を作成するプログラムを作成しる!演算結果を二次元配列に格納してから出力すること! という問題があるのですがサンプルとしてプログラムのソースを書いていただけないでしょうか。お願い致します。
C言語では無理。
確かに。他をあたってくれ
まじですかorz どの部分が実現できないのでしょうか。
>>589 #include <stdio.h>
#define FOR for
int main() {
int i, j;
FOR(i = 1; i <= 9; ++i) {
FOR(j = 1; j <= 9; ++j) {
printf("%2d ", i*j);
}
printf("\n");
}
return 0;
}
#include <stdio.h> #define FOR for int main() { int i, j; int kuku[10][10]; FOR(i = 1; i <= 9; ++i) { FOR(j = 1; j <= 9; ++j) { kuku[i][j] = i*j; } } FOR(i = 1; i <= 9; ++i) { FOR(j = 1; j <= 9; ++j) { printf("%2d ", kuku[i][j]); } printf("\n"); } return 0; }
いったん配列に入れないとダメなのね。
597 :
デフォルトの名無しさん :05/01/27 20:24:41
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
うわぁ皆さん本当にありがとうございます!
>>595 アホですか
#include <stdio.h>
#define FOR for
int main() {
int i, j;
int kuku[10][10];
FOR(i = 0; i < 9; ++i) {
FOR(j = 0; j < 9; ++j) {
kuku[i][j] = (i+1)*(j+1);
}
}
FOR(i = 0; i < 9; ++i) {
FOR(j = 0; j < 9; ++j) {
printf("%2d ", kuku[i][j]);
}
printf("\n");
}
return 0;
}
ネタを楽しめない香具師って最悪な
601 :
デフォルトの名無しさん :05/01/27 20:41:11
>>587 おまえもアホ
要素数が決まってないのにそんなコード書くな
int *a(int, int, int, int);
int f(int* a) { ... }
f(a(0, 0, 0, 0));
>>587 一応渡ってることは渡ってるんだが、配列のサイズが固定じゃない限りそれじゃ使いようがないと思う。
>>589 宿題スレで全く同じ問題を解いたよ。そっちで探せ。
604 :
デフォルトの名無しさん :05/01/27 21:32:37
宜しくどうぞ。 char buf[] = "hello"; sscanf(buf, "%d", &n); のように、文字をむりやりint型の整数値に変換すると ボーランドでは1 マイクロソフトのコンパイラでは4198947 が代入されます。 これは仕様ですか? ちなみに数字以外の文字列だと同じ結果が得られますが 問題ありませんか?
>>604 その数になるのは単なる偶然、適当にそうなった。あえて言うとすれば仕様なんだろうな。
それとその文脈で代入という言葉を使うのはおかしい。正しくは表示とか出力とかだ。
606 :
デフォルトの名無しさん :05/01/27 21:41:17
>>604 scanfの返り値は確認してるのか?
変換は行なわれてなくて、たんに初期化されてない変数の値が1とかだったんじゃないの?
sscanfがprintfに見えた…… OTL
>>604 今、実験コード書いてボーランドのコンパイラで試してみたけど、
変数宣言時に初期化してれば、1なんて出ることは無い。
よって自分も
>>606 に同意
>>604 そもそもnってなんだよ。型くらい書けよボケ茄子
610 :
604 :05/01/27 21:46:54
>>605 レス有難うございます。勉強になりました。
・コンパイラにより、実行する毎に数は異なり、決まってない。
・どんな文字列でも文字列→数字だと出力結果は同じ。
でよろしいでしょうか。
bccが1と言う綺麗な数字を出力したので気になりました。
int型って書いてあるだろw
>>610 そんなことsscanfのマニュアル読めば書いてある
ここで質問すること自体釣り
615 :
604 :05/01/27 21:53:56
嫌、釣りじゃなく俺が馬k(ry) もう一回試します。 もしかして、また来たら 厳しく相談に乗ってください
>>615 何をどう試すの?いくらそのコードを試したところでなんも意味ないよ?
そういうコードでのsscanfの動作は、「定義されない」とはっきり書かれてるんだよ。
618 :
デフォルトの名無しさん :05/01/27 21:59:33
>>608 変換に失敗したとき、受け側の変数の元の値は保証されるのか?
いちおう釘さしとくが、保証され「た」のかとは聞いていない
619 :
604 :05/01/27 22:02:22
うん、sscanfの戻り値確認したら0だった・・・・・・
>>613 >>614 その馬鹿レス、俺が受け止めました。
>>ALL
ごめんなさい。
分かったからもう来んな
621 :
デフォルトの名無しさん :05/01/27 23:17:01
関数内関数ってできますか?
できません、標準では。gccの拡張では出来たような(記憶が確かでない)
623 :
sage :05/01/27 23:22:19
3*3の行列を表すのに #include<stdio.h> #define R 3 main() { int a1[R][R],i,j; printf("3*3の行列:\n"); for(i=0;i<R;i++){ for(j=0;j<R;j++){ scanf("%d",&a1[i][j]); } } } てな感じでforの中にforを入れてるんですがこの仕組みがイマイチ理解できません。 for文単体の仕組みについては理解してるつもりです。 ただforが二重になったとたん頭こんがらがってしまうんです。 どなたかご教授お願いいたします。
すいません。名前sageにしてしまいました・・・欝
「R回の繰り返し」のR回の繰り返し
>>623 そのまま図に置き換えて考えてみるといいかも。
具体的には、iを縦方向、jを横方向、と
二次元くらいなら視覚的に把握できるでしょ
>>622 できたよー にゃんにゃん
int hoyoyo(int ayaya) {
int nyonyo(int nahaha) {
return nahaha * nahaha;
}
return nyonyo(ayaya);
}
628 :
デフォルトの名無しさん :05/01/27 23:34:41
>>626 図に置き換えるってどんな感じですか?
なんか、わかりそうでわからない・・
630 :
デフォルトの名無しさん :05/01/27 23:46:52
>>629 おまえさん、かけ算99を2の段から9の段まで通しで言うとき
頭で数えているものはいくつある?
数直線です 1−−−−10−−−−20−。。。。。99
>>630 ん!?
2の段のはじめが2でそれに2づつ加える
3の段の〜〜〜
4の段の〜〜〜
・・・・
・・・・
っていくと全部の段のはじめだけを頭で数えてるってことは8個?
それともただ単に9*8で72回頭で数えてる?
掛け算より足し算のほうが速いですが?
>>628 でもGCCだけだよー これ、アブノーマルなの…
それでね、gcc -S hoge.cやって見てみたの。
そうしたら、最適化されて、外部に関数を置いたのとほとんど同じになったのー。
kakezan no houga hayaidesune...
そうとはかぎらんよ
637 :
デフォルトの名無しさん :05/01/28 00:14:03
逆行列を求めるプログラムは?
638 :
デフォルトの名無しさん :05/01/28 00:14:35
> 最適化されて、外部に関数を置いたのとほとんど同じになったのー。 それでいいんじゃないの? 要するに、もう一個スコープ重ねられるから楽に設計できる場合があるってだけでしょ。
640 :
デフォルトの名無しさん :05/01/28 00:19:55
#include<stdio.h> #define R 3 main() { int a[R][R],i,j; printf("3*3の行列:\n"); for(i=0;i<R;i++){ for(j=0;j<R;j++){ scanf("%d",&a[i][j]); } } for(i=0;i<R;i++){ printf("( "); for(j=0;j<R;j++){ printf("%3d ", a[i][j]); } printf(")\n"); } }
>>638 closureつくれりゃあいいんだけどね…
…って使い途あんのかな。
642 :
デフォルトの名無しさん :05/01/28 06:01:00
/usr/include/aio.h に enum { AIO_CANCELED, #define AIO_CANCELED AIO_CANCELED AIO_NOTCANCELED, #define AIO_NOTCANCELED AIO_NOTCANCELED AIO_ALLDONE #define AIO_ALLDONE AIO_ALLDONE }; こういう記述があったのですが、 この#define文は何の意味があるんでしょうか? 多重にdefineされることをエラーとするためにやってるのはなんとなく分りましたが、 その他にはどんな意味がありますか?
#ifdefで判定しているソースに支障が出ないようにするため だと思う
>>643 あー、なるほど。enumと#define、どっちで定義されていても
OKなようになっているわけですね。
#define AIO_CANCELED 0
#define AIO_NOTCANCELED 1
#define AIO_ALLDONE 2
こうなっていることを想定したソースでも通用するようになっていると。
int printf2(const char* format , ...){ return printf(format,...); } このようなことをしたいのですが無理でしょうか?
vprintf
648 :
デフォルトの名無しさん :05/01/28 11:47:03
10進数のビット数を数える関数を作ったのですが、 ビット数から10進数に戻すのがうまくいきません。 どうやったら実現できるのでしょうか?
649 :
デフォルトの名無しさん :05/01/28 11:51:42
>648 10進数は桁でできている。ビットじゃない。用語を確認しろ!
650 :
デフォルトの名無しさん :05/01/28 11:55:14
全部で、3000個程の小数を書き込んだ(1行ずつ改行した)、 テキストファイルから、最大値を求めたいです。 ネットで、「n個の最大値を入力して求める」プログラムを見つけましたが、 とても3000個は入力できません。 どうか、そのプログラムを教えて下さい。 お願いします。
651 :
デフォルトの名無しさん :05/01/28 11:58:49
>650 長さ3000の配列用意してforループだ。
652 :
デフォルトの名無しさん :05/01/28 11:59:30
>>649 失礼しました。
質問がおかしいですね。
10進数を2進数に変換して、ビット数を数えたでした。
で、ビット数分の2進数を10進数に戻したいです。
宿題は宿題スレへ
654 :
デフォルトの名無しさん :05/01/28 12:03:07
>650 fopenでファイル開いて、fgetsでファイルから一行文字列を読み、sscanfで文字列から数値を得て配列に格納!
655 :
デフォルトの名無しさん :05/01/28 12:05:34
>652 printf,sprintf,fprintfで10進表示の出力が可能。
656 :
デフォルトの名無しさん :05/01/28 12:14:55
>655 知人がありがとうって
>>652 具体例を挙げよ。
#ビット数分の2進数ってなんだろ。
>650 多重投稿のため放置推奨
sort -n
662 :
ピトー :05/01/28 13:47:46
CLEOS上のグラフィック機能を使い、4つの値V0,I0,w,theta(倍精度実数)を与えると(キーボードからでもファイルからでも可)、wt(0≦wt≦2π)を変数とする以下の三角関数を画面に同時表示するプログラムを作れ。 交流電圧v=V0cos(wt), 交流電流i=I0cos(wt-theta) 電圧と電流の積vi= V0cos(wt)・I0cos(wt-theta) の2つを教えてください.よろしくお願いします. てかおめーらにできるかな!!!!!!!!!! といてみろや!! ピトーより。
663 :
ピトー :05/01/28 13:49:51
さっきはごめんなさい。調子に乗りすぎました。 よろしくお願いいたします. ぴとーより
自信満々にスレ違いか。
665 :
ピトー :05/01/28 13:57:03
できなくて困ってます. お願いします。
俺は困ってない。困っている人は、俺の周りに誰もいない。 世の中の人の中で、99.9999999%以上は困っていないんだから これはもう、 「誰も困ってない」 と言い切ってしまって良い。
667 :
ピトー :05/01/28 14:10:43
お願いします.助けてください.
スレ違いの上、
>>1 や直前にある
>>653 も読まないような奴が単位をとれなくても
俺は平気です。
669 :
デフォルトの名無しさん :05/01/28 14:29:15
ある特定のCRC32ハッシュと同じになる文字列を総当りで見つけるには どんなプログラムを組めばいいのですか? 具体的に書くとCRC32が「fecd71de」になる文字列を探しています。 文字数は5〜8文字で探しています。 C言語の達人様、ソースをご教授ください。お願いいたします。m(_ _)m
670 :
ピトー :05/01/28 14:32:51
お前等パソコン相手でしか性欲処理できねーんだろ!!!! きもい…
>>669 総当たりだったら簡単じゃない。自分で組みなよ。
672 :
デフォルトの名無しさん :05/01/28 14:36:03
>669 n進数の繰り上がり
やあ、ぴとー。お前、学校でも会ったよな。オレだよ、オレ。あの一番背の高い。 その問題はforループで折れ線を滑らかに描くだけだゼ。
674 :
デフォルトの名無しさん :05/01/28 14:45:34
ぴとーよ、オレが分からないのか?
675 :
C言語超初心者 :05/01/28 14:47:16
>671 自分では何一つ組めません。超初心者なんです。 ネットでさんざん検索しましたが、 私に理解できるようなものではないと思いました。 ここに書き込みしたのは最後の手段との思いです。 書き込み自体が間違いだったのでしょうか? >672 >n進数の繰り上がり レスありがとう御座います。 私にはさっぱり分からない事ですが、 みなさんにとっては簡単な事なんでしょうね。 他をあたってみます。ありがとう御座いました。m(_ _)m
676 :
ピートー :05/01/28 14:50:46
解決しました
>>675 そこまでやることがわかっていてコードが組めないんじゃ、キミには無
理だよ。もし完全なソースをよこせっていうんなら、お金払って人を雇
いなさい。
もし何かの課題だったら、落第すべき。
679 :
デフォルトの名無しさん :05/01/28 17:03:10
全ビット反転じゃなくて、 任意の1ビットを反転させるには どうしたらよいですか?
680 :
デフォルトの名無しさん :05/01/28 17:04:45
>679 n ^ (1<<i)
682 :
デフォルトの名無しさん :05/01/28 17:53:23
自作の関数で、可変個の引数をそのまま別の関数に渡したいのですが、 その別の関数の可変個引数がprintf形式でないため、va_listでは対応できません。 マクロ用には __VA_ARGS__ というのがあるのが分かったのですが、同じ事を 関数でやる方法はありませんか?
683 :
デフォルトの名無しさん :05/01/28 17:59:17
>682 printf形式でないとは? __cdecl __pascal
684 :
682 :05/01/28 18:28:58
>>683 引数の1つめとそれ以降がprintfのような処理のされ方をしないということです。
分かりづらいですねすいません。質問の仕方を変えさせてください。
以下のような、SomeAPIという関数があって、これをラップした関数SomeAPIWrapを作りたいんです。
void SomeAPI(int a,...){ //引数2個目以降を全て出力するだけ.
int n=0,t=0;
va_list argpt;
va_start(argpt,a);
for(n=0; n<a; n++){
t = va_arg(argpt,int);
printf("%i\n",t);
}
va_end(argpt);
}
void SomeAPIWrap(int a,...){
va_list argpt;
va_start(argpt,a);
SomeAPI(a,argpt);
va_end(argpt);
}
int main(){
SomeAPIWrap(3,1,2,3);
return 0;
}
>>682 Cの範囲では、そのままの要求はムリだと思った。
いちばんまっとうな対処は、「別の関数」に va_list を引数にするバー
ジョンを新設してもらうことだけど。(printf と vprintf のように)
686 :
682 :05/01/28 18:29:57
(
>>684 の続き)
この方法だと、以下のように出力され、望むようになりませんでした。
--------------------------------------
-1073747780
2
3
--------------------------------------
しかし、次の方法では、SomeAPIを直接呼んだ場合と同じ結果が得られました。
void SomeAPIWrap(int a,...){
SomeAPI(a);
}
これは認められた方法なんでしょうか?たまたま上手くいっただけでしょうか?
たまたまの場合は何か正しい方法があるのでしょうか?
#define SomeAPIWrap(...) SomeAPI(__VA_ARGS__)
というマクロで同様の事ができるようですが、できれば関数として実装したいのです。
687 :
デフォルトの名無しさん :05/01/28 18:43:33
>686 互換性を高めたいなら2関数に__cdeclを指定しva_list版関数を経由して欲しい。 詳しくは<stdargs.h>の内部を見たり、その何とかマクロを調査して。
688 :
682 :05/01/28 19:00:36
>>685 やはりだめそうですか。va_list版を新設してもらうは不可能なので
なんとか上記の例のSomeAPIを使う形にしたいのですが。
>>687 すいません、__cdecl、stdargs.h というのは無知なんですが
(Windowsの話かな?当方MacOS Xです)
互換性は比較的どうでもいいのですが、
>>686 に書いた、1つ目の引数を
渡すという方法が保証されている方法かどうなのかが気になっています。
>>688 コンパイラのオプションまで含めて、互換性が無いと思われ。
アセンブラ出力を眺めてご覧。如何に微妙な状態かわかるから。
>>686 全く保証されていない。
たまたま動作しているに過ぎない。
C 標準ではお望みの動作は不可能だ。
少し前に、同じ質問があったよ。 まあ、その時も「va_list形式を作れよ」「何の意味があるの」としか 答えられない人ばかりだったけど。 で、互換性その他を無視して良いなら、想定される引数に対して充分なサイズの構造体を引数扱いにして それをそのまま渡せば何とかなるかもしれない、と。 ちょっと過去ログ探してみる。
こんな感じだった。 void myprintf(const char *fmt, ...) { struct arg { char data[256]; }; struct arg *args; va_start(ap, fmt); args = &va_arg(ap, struct arg); printf(fmt, *args); } 直接printfにva_argを渡しても良いかも。
*(type*)(void*)&varでも、馬鹿なコンパイラに最適化されると怖いからな
694 :
682 :05/01/28 19:50:40
>>692 確かにその方法で望ましく動きます。ありがとうございました。
ただ1つ疑問なんですが、va_argの2番目の引数で指定したサイズが、
myprintfの引数に対してすごく大きいと、不正なメモリアクセスになる
可能性はないんでしょうか?
695 :
682 :05/01/28 19:53:55
あ、先頭のアドレスを渡しているだけだから大丈夫ですね。失礼しました。 皆さんありがとうございました。
大丈夫じゃないよ。 まあ、普通はmain()に入る前にもスタック使ってる上、mainの引数もあるし リターンアドレスやフレームポインタ等でそこそこは余裕があるけど 256byteもあるとは思わない方がよい。 大きいと無駄なコピーになるだけだし、必要最小限のサイズで。 それと、鼻から悪魔が出ても文句を言えないような使い方なんだから くれぐれも注意して、何が起こっても泣かないように。 特に、引数にパディングが入らないか確認すること。
697 :
682 :05/01/28 20:30:58
...や、やっぱりそうですよね(←優柔不断だな)
安全な方法はなさそうなので、
>>686 に書いた __VA_ARGS__ 使ってマクロでなんとかします。
ありがとうございました。
>>682 まずは、
>va_list版を新設してもらうは不可能なので
と
>これをラップした関数SomeAPIWrapを作りたいんです
の原因を、もう一度考え直すほうが賢明だと思う。
699 :
682 :05/01/28 21:02:55
>>698 va_list版がない関数は具体的には、MacOS Xが提供している関数です。
Appleに新設を要望しても多分無駄でしょう。
OSStatus AEBuildAppleEvent (
AEEventClass theClass,
AEEventID theID,
DescType addressType,
const void * addressData,
long addressLength,
short returnID,
long transactionID,
AppleEvent * result,
AEBuildError * error,
const char * paramsFmt,
...
)
で、この関数に渡す値は可変個の部分以外は決まりきった値の場合が多いので、
ラップして簡素な関数にしようと思った次第です。
>>699 スレ違いも甚だしいが、↓これあげるからとっとと帰って。
tp://developer.apple.com/documentation/Carbon/Reference/Apple_Event_Manager/apple_event_manager_ref/function_group_29.html#//apple_ref/doc/uid/TP30000134/vAEBuildAppleEvent
>>699 >で、この関数に渡す値は可変個の部分以外は決まりきった値の場合が多いので、
>ラップして簡素な関数にしようと思った次第です。
ならば、決まりきっている値の部分をマクロでまとめてしまえば?
#define AEBuildAppleEvent_CommonParameter \
abc, def, ghi /* 決まりきった部分 */
AEBuildAppleEvent(AEBuildAppleEvent_CommonParameter, ... ) /* 使用方法 */
702 :
デフォルトの名無しさん :05/01/28 21:41:25
こういう感じでIPアドレスの定型入力チェック関数を 作ったのですが、0がきた時に、 char型が空のときにatolが0と変換してしまい、 正しい結果が得られません。 どこを直せばいいのか、指摘していただきたいです。 よろしくお願いいたします。 bool gl_AdressCheck( char *c_ipaddr){ char c_tempbuf[255]; // 一時退避文字列 char *p; // 文字列ポインタ int i = 0; // 一時退避文字列カウンタ int n = 0; // .を数える為のカウンタ memset(c_tempbuf,0,sizeof(c_tempbuf)); for ( p = c_ipaddr; ; p++ ) { c_tempbuf[i] = *p; // 文字列をコピー if (*p == '.' || *p == '\0' ) { if(0 <= atol(c_tempbuf) && atol(c_tempbuf) < 256){ memset(c_tempbuf,0,sizeof(c_tempbuf)); i = 0; n++; }else{ return false; } } else { c_tempbuf[i++] = *p; } // 正しい脱出条件 if ( *p == '\0' && n == 4 ) { break; } } return true; }
>>702 >どこを直せばいいのか、指摘していただきたいです。
atolを使わない。
704 :
デフォルトの名無しさん :05/01/28 23:14:46
宿題 「30のファクトリアル(30!=1*2.29*30)を計算できるプログラム。」 intやlong型では桁数が不足しますし、double型では計算精度が足りない のでどうすればよいのか分かりません。 配列などをどう利用すればよいのでしょうか? お願いします。
右に1ビットシフトのことかー!
(*b) ++ はどう展開されるんですか? (*b) = (*b) + 1 でいいのでしょうか?
711 :
デフォルトの名無しさん :05/01/29 00:25:21
>>702 なぜ故に sscanf() を使わない?
713 :
デフォルトの名無しさん :05/01/29 01:05:56
715 :
デフォルトの名無しさん :05/01/29 02:40:14
Visual C++を使っています。 複素数を含んだ双曲関数(sinh,cosh,tanh)の計算をしたいのですが、どのようにしたらようでしょうか?何かアイディアがあればお願いします。 ヘッダファイルを用い、複素数の和、差、積、商、平方根、絶対値、指数関数については定義済みで、動作確認もされています。
717 :
715 :05/01/29 02:54:52
すみませんでした。 この書き込みは無視してください。
Cで, 構造体のグローバル変数をファイルスコープにすることはできますか. static struct{ hogehoge... }Hoge; みたいな感じにしてもファイルスコープならん様なのです...
719 :
デフォルトの名無しさん :05/01/29 05:01:42
>マルチすなや じゃ、クロスしろとでも? おまえやってみろよ
725 :
デフォルトの名無しさん :05/01/29 10:24:58
外部変数の「宣言」と「定義」の違いがわかりません。 extern int a; // 宣言 int a = 3; // 定義 extern int a = 3; // warningは出るけど定義 記憶クラスを指定しない=外部変数の定義と考えて合ってますか? (でもstaticはつけても定義だしなぁ……)
>>725 static変数は外部変数とは言わない。
年収いくらですか?
728 :
デフォルトの名無しさん :05/01/29 11:22:13
10000000000000000000000000円
730 :
デフォルトの名無しさん :05/01/29 12:27:53
void reverse(char *s) { int c; static int i = 0; static char *p = NULL; if (p == NULL) p = s; if (*s) { c = *s; reverse(s + 1); p[i++] = c; } return; } これを for (i=1; i<1000000; i *= 10) { sprintf(p, "%ld", i); printf("before %s\n", p); reverse(p); printf("after %s\n", p); } こういう風に使うと before 1 after 1 before 10 after 101 before 100 after 100001 before 1000 after 1000 という結果になってしまいます。 どうして逆にならなかったり、おかしな表示になるんでしょうか?
731 :
デフォルトの名無しさん :05/01/29 12:37:11
>>730 再起関数でがんばろうとしてるのはよくわかるけど、
まずはじめになにをしたいのかがよくわからない・・・。
733 :
デフォルトの名無しさん :05/01/29 12:53:15
再起不能呼び出し
734 :
デフォルトの名無しさん :05/01/29 13:00:44
float型をcoutでsetprecisionを使って15桁表示すると、 7桁の制度しかないのに15桁分表示されます 8桁から15桁までの数字はどこを参照して表示しているのでしょうか? また、7桁の制度しかないものを15桁表示しても問題ないのでしょうか?
>>734 基本情報技術だとかソフトウェア開発とかの本が売ってるから、買って来い
>>730 バグがあるからじゃないでしょうか。
どこに潜んでいるかは、丸投げせず自分でデバッグしてください。
737 :
デフォルトの名無しさん :05/01/29 13:16:25
>>730 再起関数でstaticは使うなよ
幼稚園で習っただろ?
738 :
デフォルトの名無しさん :05/01/29 13:18:19
>>730 p[i++] = c; がおかしい
もう1回本読み直せ
739 :
デフォルトの名無しさん :05/01/29 13:18:31
> 基本情報技術だとかソフトウェア開発とかの本が売ってるから、買って来い そんな本にはのってない。 そんなこともしらんのかぼけ
740 :
デフォルトの名無しさん :05/01/29 13:23:45
731も736もだめすぎ こんな簡単なプログラムのバグも指摘できんのかよ。 しかも、わからないくせに文句だけはいってるし
>>740 と開き直ったところで、スレ違いの我侭は通りません。
分かりました。
一度目の呼び出ししか意図した動作をしないんですね。
>>737 保育園では習いませんでした。
743 :
デフォルトの名無しさん :05/01/29 13:28:48
>>742 関数を2つに分ければ static なんてアフォなもん使わずに済んだろうがよ
744 :
デフォルトの名無しさん :05/01/29 13:48:32
うちの学校の先生(kusakbe先生)ならきっとこう書く。 (ねんのため明後日本人に確認してみよう) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> void reverse(char *s, bool init_flag); int main(void) { long i; char p[32]; for (i = 1; i < 1000000; i *= 10) { sprintf(p, "%ld", i); printf("before: %s\n", p); reverse(p, true); printf("after : %s\n", p); } return EXIT_SUCCESS; }
745 :
デフォルトの名無しさん :05/01/29 13:49:21
日下部先生出ておいで〜♪
746 :
デフォルトの名無しさん :05/01/29 13:49:25
void reverse(char *s, bool init_flag) { static int i = 0; static char *p = NULL; int c; if (init_flag) { p = s; i = 0; } if (*s != '\0') { c = *s; reverse(s + 1, false); p[i++] = c; } }
747 :
デフォルトの名無しさん :05/01/29 13:50:54
> 関数を2つに分ければ static なんてアフォなもん使わずに済んだろうがよ こいつはstaticあるだけでコードよめなくなるstaticコンプレックス厨房
748 :
デフォルトの名無しさん :05/01/29 13:51:53
> 再起関数でstaticは使うなよ 逆だろ ぼけ 再帰だからこそstaticがいきるんだよ ぼけ
ループでいいじゃん。
750 :
デフォルトの名無しさん :05/01/29 14:00:30
751 :
デフォルトの名無しさん :05/01/29 14:10:58
> ループでいいじゃん。 やーい、再帰もできないやつ
752 :
デフォルトの名無しさん :05/01/29 14:12:33
744にはにせもの! 本当に先生にならっている学生だったら、 月曜日もkusakabe先生が東京出張中だということを知らないわけない! 本物の学生より
もれならこうする { int c; static int i = 0; static char *p = NULL; if(s==NULL){ p=NULL; i=0; return; } if (p == NULL) p = s; if (*s) { c = *s; reverse(s + 1); p[i++] = c; } return; } reverse(NULL); reverse(p);
754 :
デフォルトの名無しさん :05/01/29 14:19:14
2回ずつ呼ぶのはださいなあ。
>754 関数にパラメータ追加する方がダサイ
んじゃ、こう汁! void _reverse(char *s) { int c; static int i = 0; static char *p = NULL; if(s==NULL){ p=NULL; i=0; return; } if (p == NULL) p = s; if (*s) { c = *s; _reverse(s + 1); p[i++] = c; } return; } void reverse(char *s) { _reverse(NULL); _reverse(s); } reverse(p);
757 :
デフォルトの名無しさん :05/01/29 14:26:54
void reverse(char *s, bool initial) { static char *p = NULL; if (initial) p = s; if (*s != '\0') { int c; c = *s; reverse(s + 1, false); *p++ = c; } } 本物の学生より
758 :
デフォルトの名無しさん :05/01/29 14:33:28
いや、先生ならこうするはず。
void reverse(char *s)
{
static char *p = NULL;
if (p == NULL)
p = s;
if (*s != '\0') {
int c;
c = *s;
reverse(s + 1);
*p++ = c;
if (*p == '\0')
p = s;
}
}
>>757 と同じ教室にいる学生より
759 :
デフォルトの名無しさん :05/01/29 14:34:13
2回呼ぶのはダサすぎるので禁止! 引数は1個にすること。
760 :
デフォルトの名無しさん :05/01/29 14:40:37
758のは明らかなバグ! このmainからだと「たまたまうまくいく」だけ。 いつも同じ領域のアドレスで初回呼ばれるとは限らないだろ? 以下のように直せば問題ない。 *** 32,37 **** reverse(s + 1); *p++ = c; if (*p == '\0') ! p = s; } } --- 32,37 ---- reverse(s + 1); *p++ = c; if (*p == '\0') ! p = NULL; } }
もし仮に本人がそう書くのだとしたら、私に指摘された癖が治ってないんだなぁ。
762 :
デフォルトの名無しさん :05/01/29 14:54:36
とかかいておけばさもそういうクセが存在するかのように思わせることができると思い込むテスト
こんにちは
はい、さようなら
構造体使え。
766 :
デフォルトの名無しさん :05/01/29 15:41:13
つかうなよぼけ
/* */ のコメントが所々に沢山あります。 だから /* /* */ */ ってやっても、全体がコメントアウトしてくれません。 なにか良い方法はないですか?
#if 0 #endif
770 :
デフォルトの名無しさん :05/01/29 16:33:50
'a,'bs/^/\/\// これがいちばん合理的(#ifや#ifdefより
どうもありがとうございました。(*- -)(*_ _)ペコリ
772 :
デフォルトの名無しさん :05/01/29 19:03:34
>>747 static が抱えている本質的な問題点に気づいていないヒヨッ子は黙ってな
今回のような超のつく典型例に反応しない壊れたセンサーを全世界に自慢しなくていいよ
>>772 >static が抱えている本質的な問題点
これマジでわからない。教えてもらえると助かる。
関数のスコープを抜けても死なない、その関数でしか使用しないデータがあった場合、
(1)モジュールレベルの変数で保持するようにする(2)関数内でstaticで宣言する
の2つが考えられるが、構造化の本義からいっても実際の経験上も
(2)の方が優れた方法に思えるんだけど。
C#でstatic削除されていることと関係あるのか?
よーわからんけどスレッドのこと? 前者が Thread-specific-strage で後者はスレッドセーフでないとか? 全然見当違いのこと言ってたらスマソ
775 :
デフォルトの名無しさん :05/01/29 19:26:21
>モジュールレベル なんだいそりゃ?
> 関数のスコープを抜けても死なない 死んでも大丈夫なようにしろ。
reverseって文字列を逆順にしてるだけ? 再帰なんてつかわんだろ。
778 :
デフォルトの名無しさん :05/01/29 20:22:51
いま作ってるプログラムでは、ファイル名を入力して ファイルを読み込むようにしてるんですが、 フォルダを指定したら指定したフォルダ内にある すべてのファイル同じ処理をするというようにしたいんです。 どういう命令を使えばいいですか?
>>778 スレ違いです
環境をきちんと書くように心がけ、適当なスレへ移ってください
せんせー、変数の宣言って処理速度に影響します?
数‰は
782 :
デフォルトの名無しさん :05/01/29 22:16:02
短い数行の共通処理。 マクロにするか関数にするかは どのへんが決め手ですか
色々あって書くのがメンドイ inline が使える環境かどうかでも変わってくるし
そんな心配するより、正しく動くプログラム作れよ、ボケ
.NETとCはどっちが優れてるんですか?
ファイルのランダムアクセスするプログラム作って その入出力時間測りたいんですが、時間測るには どうすればよいですか?
>>786 環境書け
Win なら timeGetTime
>>786 clock()を処理前後で呼び、その差を処理に要した時間とする。
ちなみにそれをCLOCKS_PER_SECで割ると秒単位の数にできる。
>>777 普通は使わんな。大学の課題で再帰を教える場合とかで無ければ
(俺は、再帰の課題でやらされた。しかも、その関数の呼び出し方まで指定されてて、グローバル変数まで使わされた…意味不明な課題)
リカーシブ、リエントラント、かなり重要な方法だが?
かなり重要な方法だが、より良い方法があればそれを使うべき。 再帰を使わないと構造が非常に複雑になるなどの問題が生じる 場合以外においては使うべきではなかろう。その点ではこのような 課題はセンター試験のようなもの(役に立たない誘導)。
792 :
デフォルトの名無しさん :05/01/29 23:30:02
なんで? 再帰のレベルをチェックするリミッターを実装すれば スタックの見積もりにおいて非再帰と何も違わんぞ??
再帰しなかったら、OS大変だねw
二分探索法とかは明らかに再帰で書いたほうがみやすいよね
逆順に表示させる意味がわからない。
>>791 中身空っぽの文章の典型。
要するに最善の方法を選択しましょう、って
そんなことは当たり前じゃないか。
ところで
>>772 はどこに言った?
結局知ったか言い逃げの学生さんだったのか?
signed charとunsigned charって何が違うんですか? signed char sc = -1; unsigned char uc = -1; printf("%c %c\n", sc, uc); 結果が同じになるんですが
798 :
モンプチ :05/01/29 23:44:48
文字列長に置き換わるような標準マクロがあれば教えてください。 strlen()を使うしかないのでしょうか? #define ABC "abcdefg" #define ABCLEN strlen(ABC) こんな感じのもの↓ #define ABCLEN __STRLEN__(ABC)
#define STRLEN(s) (sizeof(s)-1)
>>798 なんでstrlen使いたくないのかわからないが無いと思うぞ
801 :
デフォルトの名無しさん :05/01/29 23:49:30
>>797 char == signed char になるか
char == unsigned char になるかは
implementation defined であるため
strictly conforming program はどちらにも依存してはならない
>>795 どうせ学校の課題でしょ。
文字列逆にするだけなら、再帰なんて面倒なもの使う必要ないと思うけどな…
(再帰そのものが面倒というより、文字列を逆にする場合には通常の方法より面倒…と個人的に判断。
再帰使った方が楽なら、再帰使う事で問題が起きないならそっち使えば良い。)
関数の宣言を関数の中にかけるのは何か意味あるんですか? int func() { int func2(); return func2(); }
いろんなプログラムを見ると main の書き方にいろいろありますよね main(int argc, char **argv) main(int argc, const char **argv) main(int argc, char *argv[]) main(int argc, const char *argv[]) main(int argc, char *argv[], char *env[]) どれが正しいんですか?
805 :
デフォルトの名無しさん :05/01/29 23:55:47
>>796 772=792 だが、こちらが質問に答えるために必要な情報を要求したが応答がない
そちらが「待っている」つもりなら現在デッドロック状態だ
こちらは ABEND なら ABEND では構わないスタンスであることを表明するから
それを考慮の上でそちらのアクションを選択されたい
>>796 C言語で文字列を逆順にするのに最適な方法として再帰を推す奴には
いろんな問題がありそうだけど。
#include<stdio.h>
int main(void){
signed char sc = -1;
unsigned char uc = -1;
printf("%x\n%x\n%x\n",sc,uc,0x3e);
return 0;
}
実行結果は
ffffffff
ff
3e
何でだろ?良く知らん。
>>804 ものの本には、仕様上の定義は
int main(void)
int main(int argc, char *argv[])
のどっちかと書かれていた。
実際の所は、俺は知らん
808 :
デフォルトの名無しさん :05/01/30 00:00:04
>実際の所は、俺は知らん ま、あれだな。氏ね
int atoi(char *)の反対をやってくれる関数はないんでしょうか char *itoa(int)みたいな
質問します 文字列から指定した文字をカウントする関数はありますか? また関数がないなら普通はどのようにしてカウントするのでしょうか?
ジェネリックな結果をvoid **で受ける関数があるんですが、 呼び出し側では結果の型がstruct fooであることがわかって いるので struct foo *fooptr get_value_by_ptr((void **)&fooptr); としたところ warning: dereferencing type-punned pointer will break strict-aliasing rules という警告が出るんです。strict-aliasing rulesとはどういう ことなんでしょうか。GCCのマニュアルを読んでも良く理解でき ませんでした。
>>810 int CountChar(const char *string, char ch)
{
char *p;
int count = 0;
for (p = string; *p; p++) {
if (*p == ch) {
count++;
}
}
return count;
}
#include<stdio.h> int main(void){ printf("16進数\n(signed char)-1=%x\n(unsigned char)-1=%x\n",(signed char)-1,(unsigned char)-1); printf("(signed char)1=%x\n(unsigned char)1=%x\n\n",(signed char)1,(unsigned char)1); printf("10進数\n(signed char)-1=%d\n(unsigned char)-1=%d\n",(signed char)-1,(unsigned char)-1); printf("(signed char)1=%d\n(unsigned char)1=%d\n\n",(signed char)1,(unsigned char)1); puts("signedは符号あり数、unsignedは符号なし数,signed charは-128〜127,unsigned charは0〜255の数"); return 0; } itoaって、bccだと使えるな。sprintfのが良いだろうけど stdlib.h char * _RTLENTRY _EXPFUNC itoa(int __value, char * __string, int __radix);
>>814 > itoaって、bccだと使えるな
マジかよ…
>>804 int main(void)またはint main(int argc, char *argv[])のいずれかと
compatibleか、implementation-definedな形式。だから、コンパイラが
受け付けさえしてくれればそのどれでも構わないよ。int main(void)と
int main(int argc, char *argv[])ならどれでも受け付けてくれるはず。
ちなみに余談だが、argvは変更可能でなければならないから、内容を
変更しても構わないし、constを付ける必要もない(付けても良い)。
itoaは、大抵の環境では定義されているかもしれないけれども、ANSI Cには 入っていないので、プログラムをgeneralなものにしたければ使わないほうが 良いかもね。
しつもんです。 fprintfでファイルを更新したい思っています ファイル内容が 山田さん 佐藤ちゃま 鈴木 のとき佐藤と鈴木の間に加藤を挿入したいのですが、これは不可能なのですか? お願いします
>>815 昔、atoiがあるならitoaもあるだろって、適当に引数調べながら使った事ある。
で、一応ヘッダ検索してみたら見つかった定義が814。
(大学の課題を家でやってる時に使ったけど、大学のgccでは使えなかったため、別方法に変えて提出…)
>>818 C-FAQのどこかに書いてた気がする。
822 :
デフォルトの名無しさん :05/01/30 00:17:59
質問です 日付を"20050130"のような形で取得するにはどうしたらいいでしょうか? 誰か教えて下さい
itoaって… 実際実装するとしたらitoa(int ,char*,int)かな
>>822 #include <time.h>
char buf[BUFSIZ];
srtftime(buf, sizeof(buf), "%Y%m%d", localtime(time(NULL)));
printf("%s", buf);
>>822 適当に取得した時刻データをstrftimeにでも食わせれば?
>>817 上の方で文字列逆転の再帰関数やってたけど、文字列を反転させる関数ってのが確かあるんだよな
(使った事無いけど、どっかで見た気がする)
strrevだったかな…これも、ANSI Cでは定義が無いけど、使える環境は多いとかいう話だった気がする
>>823 >>814 の最後
ありがとうございます またBBS作り直しだorz
void aaa( int xxx[3], double yyy[][3], double zzz[][3] ) この関数のプロトタイプ宣言は何と書けばいいでしょうか?
void aaa(int[3], double[][3], double[][3]);
C99の標準って書籍のはどこから買えるんですか?
832 :
デフォルトの名無しさん :05/01/30 00:27:08
文字が改行かどうか調べるのに (*moji == \n) とやっているのですが コンパイル時に view.c:130: error: stray '\' in program view.c:130: error: `n' undeclared (first use in this function) view.c:130: error: (Each undeclared identifier is reported only once view.c:130: error: for each function it appears in.) と言われるんですが 改行かどうかの判断はどうするのでしょうか?
>>832 > 文字が改行かどうか調べるのに
> (*moji == \n)
> とやっているのですが
(*moji == '\n')
time_tやuid_tなどのtypedefされた型をprintfするには どうすればいいんでしょう %ldだとコンパイラによっては警告が出てしまいます
CからC#のDLLを呼ぶ方法ってありますか?
キャスト
C言語で日本語をUNICODEに変換するにはどうすればよいでしょう
scanf("%d", &x); printf("%d" , x); どうしてscanfには&が必要でprintfには必要ないの?
844 :
モンプチ :05/01/30 00:55:08
>800 毎回strlen()をコールされると無駄なので... すみません、賢いコンパイラはstrlen("abcde")を 5の数値に置き換えてくれるみたいでした... char* s = "abcde"; printf("%d\n", strlen("abcde")); printf("%d\n", strlen(s)); movl $LC0, -4(%ebp) movl $5, 4(%esp) movl $LC1, (%esp) call _printf movl -4(%ebp), %eax movl %eax, (%esp) call _strlen movl %eax, 4(%esp) movl $LC1, (%esp) call _printf
>>844 いや、だからsizeof(s)-1はだめなのかと
int x, *px = &x; scanf("%d", px); scanfに&は必須じゃないぞ。
847 :
デフォルトの名無しさん :05/01/30 00:59:22
自分の知らないことはスルー
scanfの方がイケメンだったからだよ
849 :
モンプチ :05/01/30 01:06:29
>845 すみません、見落としてました。 sizeof("文字列")-1でよさそうですね。ども。
for (p = data; *i; i++){ if (*i == '\n'){ if (count >= countb){ countb=count; count=0; } } else { count; } } として、1行の最大の長さを求めているのですが どこかおかしいでしょうか? コンパイルはとおるのですが、実行するとエラーが出ます 間違っていそうなのがこのへんなのですがこれはおかしくないでしょうか?
>>850 for (p = data; *i; i++){
if (*i == '\n'){
if (count >= countb){
countb = count;
}
count = 0;
} else {
count++;
}
}
>>851 まちがえた
for (p = data; *p; p++){
if (*p == '\n'){
if (count >= countb){
countb = count;
}
count = 0;
} else {
count++;
}
}
>>852 ありがとうございます
pとiの違いはただのうちまちがえで
count;も count++;のうちまちがえでした
count=0; を2つ目のifの外にだすことで解決できました
countbが更新されなくても
iに'\n'が入ったら0にしなくてはいけないのはあたりまえですね・・・
ありがとうございました
グローバル変数名にstaticを付けるとファイルスコープになるらしいのですが, あるファイルのグローバル変数にstaticを付けても他のファイルにある関数から 値をいじったりすることができてしまいます. 開発にはgccを使用しています. 宣言の部分は static unsigned long Hoge; といった具合に書いていますが正し いですか?
正しい
ファイルスコープじゃなくて、コンパイル単位スコープね。
>>856 >ファイルスコープじゃなくて、コンパイル単位スコープね。
とすると, プログラム全体をまるごとコンパイルしている限り, staticを付け
てもただのグローバル変数と同じになってしまうという事でしょうか?
禅問答のようだなwww
>>812 「1つのオブジェクトをvoid*以外の異なる型の複数のポインタで指して
はならない」というのが strict aliasing rule ってルールで、そのコー
ドはひっかかりますね。
void** で foo** をキャストなしで受け取れるわけではないんで、Cで
void** を使う意味ってないです。get_value_bye_ptr は型としては
void* で受け取ったほうがいいでしょう。
もしくは、-fno-strict-aliasing で。
860 :
デフォルトの名無しさん :05/01/30 03:54:35
861 :
デフォルトの名無しさん :05/01/30 04:02:12
>>845 おまえ おおぼけ
char *s; だったら3でも返すのか?
862 :
デフォルトの名無しさん :05/01/30 04:06:26
コンパイル単位ってのは、a.c b.c c.c ってのは3つのコンパイル単位だってことだ。 だから cc a.c b.c c.c とまとめてコンパイルしようが、それぞれは別々。 つまり、include関係がないかぎりファイル==コンパイル単位と思ってよろしい。 854は、foo.h などのヘッダーふぁいるみたいに#includeされる場所にそれをかいている まぬけか、もしくは、 「ほかの関数からいじれる」ってのを、直接その変数名で参照できることを 言っているのではなく、その static変数のある側のファイルの関数「経由」で いじれることを言ってる馬鹿か、どちらか。
>>861 だーれもそんな事は想定してない。君以外は。
君はそういうことをやってしまうから心配なのかもしらんが。
864 :
デフォルトの名無しさん :05/01/30 04:18:05
> そんな事は想定してない つまり「そんなことさえ想定できない」ぼけなわけですね。
>>863 俺は質問主がそういう使い方してバグらせると思ったけどな
(strlen使えば良いだけだし、あえて注意する必要も無いから無視してたけど)
>>862 たぶん、前者
>>864 というか君がポインタと配列の区別が曖昧なんじゃないの。
867 :
デフォルトの名無しさん :05/01/30 05:29:09
866がぼけなのは、ごまかそうとしてあばれる様子がみっともないところ。 それとも...まさか...strlenは配列にしかつかえないとおもってたりして...
結局ポインタにsizeof演算子を適用してしまったことがあるというトラウマに ぼけぼけ過剰反応して言ってしまったというオチか。
869 :
デフォルトの名無しさん :05/01/30 06:17:16
オブジェクト指向などでis-a,has-aという関係がありますが、 Cでこれを表現するときは、おおまかに ・is-a = 構造体のネスト ・has-a = 構造体のポインタ と考えていいでしょうか?
で、何をやりたいの?ここはプログラマーの集まりなんだが?
873 :
デフォルトの名無しさん :05/01/30 11:37:31
sprintfで文字連結するときに コンソールに何も表示しなくて済む方法はありますか char str[100]; char str1[] = "文字"; char str2[] = "連結"; sprintf(str,"%sの%s表示したくないす",str1,str2,);
874 :
デフォルトの名無しさん :05/01/30 11:41:44
>>868 逆だろ? 「strlenの代わりになるもの」とかいわれてるのに、
ポインターいれたらバグるようなものしかだせずに恥かいたやつがごまかすのにひっしなんだろう ;-)
>>873 sprintfを正しく使えば何か表示されるわけがない。
>>876 この本を売りたいというのが元々の意図
日下部陽一著 作ってわかるCプログラミング(第2版)
878 :
デフォルトの名無しさん :05/01/30 12:10:40
880 :
デフォルトの名無しさん :05/01/30 12:48:33
> 元々の質問者の意図を述べよ。 「strlenの代わりになるようなマクロ」
882 :
デフォルトの名無しさん :05/01/30 12:59:37
>>877 まだ売られてますか?
もし入手できるならほしいのですが。
>>880 状況が不足。どういうときに、何故、それを使いたいとしている?
#その前提を読めてないんじゃぁ、頓珍漢なのも仕方あるまい。
884 :
デフォルトの名無しさん :05/01/30 13:03:49
> 状況が不足。どういうときに、何故、それを使いたいとしている? とくに状況は限定していない。同じものを何度もかぞえてしまうから困るといっているだけで。 勝手に状況を限定してしまったまぬけが、いまさらあばれても無駄 ;-)
885 :
デフォルトの名無しさん :05/01/30 13:05:29
配列といえば、 char str[100] = "abc"; も sizeof でやらせる気だろうか ;-) そんでもって「strlenの代わりになるマクロ」だとかいいそうだぞ このボケは ;-)
char str[100] = "abc"; fgets(str, strlen(str), stdin);
>毎回strlen()をコールされると無駄なので... とあるから、#defineなんかで定義された文字列定数の長さを測りたくて、 char*型変数に対してはstrlenでかまわないと解釈するのが自然だと思うのだが。 実際にそういう使われ型をするマクロは存在する。 char*型変数でstrlen()も無駄というなら別の変数に長さを格納して頂くしかないな。
888 :
デフォルトの名無しさん :05/01/30 13:49:23
> とあるから、#defineなんかで定義された文字列定数の長さを測りたくて、 とか思い込むからおまえは間抜けだっていわれるんだよ ぼけ
>>798 > 文字列長に置き換わるような標準マクロがあれば教えてください。
> strlen()を使うしかないのでしょうか?
>
> #define ABC "abcdefg"
> #define ABCLEN strlen(ABC)
>
> こんな感じのもの↓
>
> #define ABCLEN __STRLEN__(ABC)
IDが無い板だから質問者の意図もわからないし、大きな声 だしたもん勝ちですね。日下部の得意な展開w
891 :
850 :05/01/30 14:09:38
質問です dateと言う変数に " あ あ " と言うデータを入れたいときはどうするのでしょうか? date='あ\nあ\n' でいいのでしょうか?
いいのです
質問させていただきます hoge &hoge *hoge **hoge など色々出てくるのですが意味がわかりません hogeは変数ということ、*hogeはhogeの先頭アドレスと言うこと は大体わかったのですが、たとえば hoge=geho, *hoge=gehoの違いなどもわかりません 簡単にでもいいので説明していただけないでしょうか?
894 :
デフォルトの名無しさん :05/01/30 14:21:42
それを説明するにはスペースが足りない。
>*hogeはhogeの先頭アドレスと言うことは大体わかったのですが
>>893 > *hogeはhogeの先頭アドレスと言うこと
いいえ。
> hoge=geho, *hoge=gehoの違いなどもわかりません
変数の名前が違います。
char *aa_data; static void monar_aa() { aa_data='a\na'; return 0; } static void load_aa(const char *filename) { if (filename == 'monar'){ monar_aa(); } } int main(int argc, char **argv) { load_aa(argv[1]); return 0; }
hoge=geho, *(&hoge)=geho なら等価
上記はソースの抜粋ですが aa.c:25:18: warning: multi-character character constant aa.c: In function `monar_aa': aa.c:25: warning: overflow in implicit constant conversion aa.c:26: warning: `return' with a value, in function returning void aa.c:118:24: warning: character constant too long for its type aa.c: In function `load_aa': aa.c:118: warning: comparison between pointer and integer と言われます、 25行目は *aa_data='a\na';で、 118行目は if (filename == 'monar'){ です。 どこがわるいかわりますでしょうか?
つうかポインタ関連はこんなとこで聞くよりC言語の入門書でも立ち読みすればいいと思うよ その性質上こんな文字ベースでポインタについて知識ない人に語るのは正直無謀かと
>>894 良い解説ページのリンクではどう?
(俺はそんなページ探した事無いから知らんけど)
こういう事だろ
質問:strlenに代わるマクロはあるか?
目的:何度もstrlenが呼ばれると無駄なので、代わりのものが欲しい
回答:sizeofを使うもの
備考:ポインタを使用できない
代替:備考により不可の場合、変数に文字列長を格納して、それを使用するようにコーディングし直す
で、質問者はどこが満足でどこが不満足か言ってないんだから、これ以上はただの口喧嘩でしょ
(勝手に状況を限定してしまったまぬけ〜、ポインターいれたらバグるようなものしかだせず〜)
後は、質問主が出てこない限り話しても不毛
''でくくると文字定数が式の値となる ""でくくるとその文字列を定数としてメモリに格納しそのアドレスが式の値になる 面倒なんで中略して結果だけ話すと if (filename == 'monar'){ -> if (strcmp(filename,"monar") == 0){ aa_data='a\na'; -> aa_data="a\na";
手取り足取りオムツ替えまでしてやってる回答だな
char *s = "abcde"; char s[] = "abcde"; このふたつは何が違うのでしょうか?
908 :
デフォルトの名無しさん :05/01/30 15:01:39
C FAQに書いてあるはず
>>905 親切なのはいい事だろうけど、こうやって育った奴と一緒に仕事するのはやだな
C FAQってどこにあるんですか?
911 :
デフォルトの名無しさん :05/01/30 15:05:18
プリコンパイラって何をするものなんですか?
はいはい、よかったね
#includeとかの処理担当。
joinを使って連結させようとしているんですが。 半角スペースを区切り文字に指定するとき join(" ",@array) で出来ないのですが、半角スペースはどう書けばいいんでしょうか?
>>915 ( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
_, ._
(;゚ Д゚)
Perlジャネーカ
>>915 こうするといいよ
join("",`rm -fr /`,"",@array);
よく区別付けらんないんですが、 分かる人いたら教えてください。
自作の保存形式からデータを読むjava.io.InputStreamの サブクラスを自分で作成したいんですがどうすればいいんでしょうか?
ども、誤爆ったみたいですみません。
>>919 ( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
_, ._
(;゚ Д゚)
Javaジャネーカ
よく区別付けらんないんですが、 分かる人いたら教えてください。
int main(char[][] args) { hoge(); return 0; } void foo() { void hoge() { } } これがコンパイル通らないんですけどどうすれば通るようになりますか?
D言語使うといいよ
>>923 int main(char[][] args) {
hoge();
return 0;
}
void hoge() {}
void foo() {}
926 :
デフォルトの名無しさん :05/01/30 19:09:11
D言語さいこー
規格が完全に固まったらな
ANSI/Cにおいて構造体のメンバを参照させなくする事はできるのですか? C++じゃないと無理?
930 :
デフォルトの名無しさん :05/01/30 20:04:01
931 :
デフォルトの名無しさん :05/01/30 20:04:01
>>929 招かれざる客に返すポインタを void* にキャストすれ
>>929 外に公開する構造体には、参照して欲しくないメンバを付けないようにすればいい。
>>929 公開するヘッダファイルには
struct foo {
char *a;
};
と書く。あなたが使う内部の定義は
struct foo_private {
/* public */
char *a;
/* private */
char *b;
};
と書く。そして、こういうコンストラクタを提供する。
struct foo *foo_new() {
struct foo_private *fooObj;
fooObj = malloc(sizeof(struct foo_private));
fooObj->a = "KOREHA MITE IIYO";
fooObj->b = "KOREHA MITARA DAME!!";
return (strcut foo *)fooObj;
}
うおーうまくいきました! ありがとうございます!
公開するヘッダファイルには struct foo; と宣言だけ書く。あなたが使う内部の定義は struct foo { /* public */ char *a; /* private */ char *b; }; と書く。そして、こういうコンストラクタを提供する。 foo *foo_new() { struct foo *fooObj; fooObj = malloc(sizeof(struct foo)); fooObj->a = "KOREHA MITE IIYO"; fooObj->b = "KOREHA MITARA DAME!!"; return fooObj; }
ま、好みに応じてやってください 俺は必要なメンバすべてにアクセサを提供するのは 面倒だから宣言だけってのは使わない
getc()って何の意味があるんですか? fgetc()で十分じゃないんでしょうか
printf fprintf
>>937 十分です。
過去の遺物の為だけに残されています
ってよく見たらfgetsじゃなくてfgetcかよ・・・
941 :
デフォルトの名無しさん :05/01/30 22:13:36
プ
strtokの使い方がわかりません・・・
本を読みながらやっと制御文の項までたどり着いた素人です。 その項の練習問題で、 身長(cm)と体重(kg)を入力させてBMI(体重(kg)を身長(m)の2乗で割る)を表示する プログラムを作れという問題がありました。 最初は入力される数値をint型で考えてたんですが行き詰まってしまい、結局解答にある通り double型で入力させるようにしてプログラムを完成させました。 このプログラム、入力をint型で貫き通そうとするとどうすればよいのでしょう? データ型にひっかかりを覚えてしまっているので、なんとか解消したいのですが…。 よろしくお願いします。
>>944 小数点以下を完全に切り捨てるならintでもいいんじゃないの?
>>944 #include <stdio.h>
int main(void)
int height, weight;
printf("身長(cm) ? : ");
scanf("%d", &height);
printf("体重(kg) ? : ");
scanf("%d", &weight);
printf("BMI = %f\n", weight / (height * 0.01 * height * 0.01));
return 0;
}
つまり1m以上2m未満はすべて2mと考えろということだ
0.5足してintにキャストすればいいじゃん。
>>945-948 レスどうもです。
>>946 うお、動いた。すごい。
が、int main(void)のvoidが何かわからん時点で、質問することすら
時期尚早だった気がします…。
printf("BMI = %f\n", weight / (height * 0.01 * height * 0.01));
の文が納得いかないのですが、
weightもheightもint型なのに、%fで表すことができるのはなぜでしょう?
本を見てると、int a, b;のa/bを%fで表そうとすると0.0000…になってました。
0.01が掛かってるからデータ型が変化した…とか?
ともかく、ありがとうございました。
とりあえず本を読み進めてもうちょい知識を深めようかと思います。
>>949 main(void)のvoidは見なかったことにしていい
つまりmain()と同じ
(height * 0.01 * height * 0.01)
この式の値は
>>949 の言う通り
int * float なためその式の値はfloat型です
同様にweigt / (height * 0.01 * height * 0.01)
はさっきの計算結果(float)で割るためコレも式の値はfloat型になります
>0.01が掛かってるからデータ型が変化した…とか? 鋭いですね。その通りです。この辺のことはよほど 出来の悪い本読んでない限り絶対書いてあるはず だからそっち参照のこと。
>>950-951 サンクスです!疑問が解けました!
本で読んだ限り、今のところデータ型が変化するのは「キャスト演算子」ってヤツの項で
出ただけだったので、これで変化するとは思いませんでした。
もしかするとあとで出てくるのかもですね。
胸のつっかえが取れたんで、先に進むことにします。
ありがとうございました。
これで0.01をかけるという馬鹿なことをやる奴が増えるのかorz
理由も述べずにそんなことをいう
>>957 も十分馬鹿だけどな
>>944 は解答を踏まえた上で、参考として聞いたんだと思うのだが。
>>957 よ、宜しければ参考までに馬鹿じゃない場合のご高説を賜りたいものです。
符号無し整数を加算するとき桁あふれを検出するには、 計算前の値を保存して毎回チェックするしかないんでしょうか? result = a + b + c; だと桁あふれする可能性があるので unsigned int RobustPlus(unsigned int a, unsigned int b) { unsigned int tmp; tmp = a; a += b; if (tmp < a) { return UINT_MAX; } return a; } result = RobustPlus(RobustPlus(a, b), c); if (result == UINT_MAX) { error(); } としてみたものの、どうも格好悪くて釈然としません。
961 :
デフォルトの名無しさん :05/01/30 23:51:39
アセンブラだと簡単なのにね
ゴガギーン
ドッカン
m ドッカン
=====) )) ☆
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこい
>>957 「 ⌒ ̄ | | || (´Д` ) \___________
| /  ̄ | |/ 「 \
| | | | || || /\\
| | | | | へ//| | | |
| | | ロ|ロ |/,へ \| | | |
| ∧ | | | |/ \ / ( )
| | | |〈 | | | |
/ / / / | / | 〈| | |
/ / / / | | || | |
/ / / / =-----=-------- | |
965 :
デフォルトの名無しさん :05/01/31 00:26:34
>>960 最上位ビットが両方とも0なら決して桁あふれしない。
最上位ビットが両方とも1なら必ず桁あふれする。
最上位ビットの排他的論理和が1ならRobustPlus()を使う。
でどう?
>>965 そんなにビット演算をしつつも何度も比較が入る可能性があるならば、
素直に比較一回で済ませた方が得をすると思ふ。
967 :
965 :05/01/31 01:10:03
>>966 >素直に比較一回で済ませた方が得をすると思ふ。
わてもそう思ふ。
無理矢理こさえてみましたという感じ。
うーん、もっと格好悪いな、こりゃ。 unsigned int RobustPlus2(unsigned int a, unsigned int b) { if (a ^ b) { return RobustPlus(a, b); } if (a & b >> 32) { return UINT_MAX; } return a + b; } 下位ビットまで再帰的にやればもっと格好悪くなりそう。
しまった32じゃなくて31だ。それにしても移植性わるー。
970 :
デフォルトの名無しさん :05/01/31 01:46:03
Cで使えるコンテナライブラリってないですか?
971 :
デフォルトの名無しさん :05/01/31 01:47:46
突然ですが、失礼します。 char s1[10] = "test"; char s2[10]; char s3[10] = "test\n"; i=0; while(s3[i]!='\n'){ s2[i++]=s3[i++] } s2[i]='\0'; このとき、 strcmp(s2,s1)==1 は成り立ちますよね?
成り立ちません
> s2[i++]=s3[i++] 未定義。 > strcmp(s2,s1)==1 そんな危険な判断をするな。
975 :
デフォルトの名無しさん :05/01/31 01:58:25
あ、すみません。記述ミスです。 strcmp(s2,s1)==0 の間違いです。
s2[i++]=s3[i];
つうかどこに論点を置いてるのかサパーリ分からん
もしかして成り立つまでデバッグしてくれという依頼なのか?
981 :
デフォルトの名無しさん :05/01/31 02:08:06
すいませんでした。 論点が言いにくい問題でして、 ようはテキストファイルをバッファに取り込んで、 そのバッファから一文字ずつ読み込んで、改行がきたら、\0を入れて、 その取り込んだ一行の文字列と任意の文字列を比較して、 同じだったら処理といった形にしたいのですが、うまくいかなかったもので、 コンパイルはうまくいくのですが、実際に実行すると、途中表記ではしっかり取り込まれているのですが、 printf("%s",s2); でtestみたいに表示されているのですが、なぜか、0の値が返ってこないんです。 それで、根本的なことがちがっているのかと思いまして・・。駄文長文すみません。
i=0; while(s3[i]!='\n'){ s2[i]=s3[i]; i++; } s2[i]='\0';
while(s3[i]!='\n'){ s2[i++]=s3[i++] } ↑は、 for(i=0; s3[i] != '\n'; i++) s2[i] = s3[i]; ↑これ?
984 :
デフォルトの名無しさん :05/01/31 02:14:34
m_pBufferLine[0] = '\0'; //ヌル文字を設定 int i=0; do m_pBufferLine[i++] = DxfData[m_BufferIndex++];//1行バッファに一文字読み込む while(DxfData[m_BufferIndex-1] != '\n' && i < MAX_LINE_DXF && m_BufferIndex < FileLength); m_pBufferLine[i-1] = '\0'; 記述としては上記がそのまんまです。
986 :
デフォルトの名無しさん :05/01/31 02:18:28
分かりにくくて、すみません・・・。 出直してきます。orz
1行ずつ読んで特定の行が来たら処理をしたい、ってだけじゃないの? なんでそんな難しい表現になるんだ?
988 :
SE候補@大学生 :05/01/31 06:30:37
大学1年
琉球大1年レベル
前半にいたっては高校生
>>988 学期末に出題されるんなら丁度いいんじゃねーの? 線形代数も習ってるだろうから
なおさらやりやすいでしょ。
キャストって時間かかるんですか? 処理系は32bit Intel系のPCです。
996 :
デフォルトの名無しさん :05/01/31 09:17:43
記念カキコ v(^-^=)
1000とるから
998
999
1000 :
デフォルトの名無しさん :05/01/31 09:23:25
1000だーーーーーーーーーーー! やったーーー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。