C言語なら俺に聞け! Part 100

このエントリーをはてなブックマークに追加
1v(^o^i)d

まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 99
http://pc5.2ch.net/test/read.cgi/tech/1105454700/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:05/01/22 23:20:33
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/〜lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3デフォルトの名無しさん:05/01/22 23:28:18
> C99準拠の参考書ってどれぐらいあるんだろう?

日下部先生のはそうだよ。
4デフォルトの名無しさん:05/01/22 23:34:26
4様
5デフォルトの名無しさん:05/01/22 23:35:52
ムハー(`・ω・´)オメ
6デフォルトの名無しさん:05/01/22 23:36:37
>>3
( ・∀・)つ〃∩ ヘェーヘェー
7デフォルトの名無しさん:05/01/22 23:37:57
8デフォルトの名無しさん:05/01/22 23:38:10
日下部ってよく出てくるけどどうなの?エロいの?
9デフォルトの名無しさん:05/01/22 23:40:22
三流SEでしょ?
10デフォルトの名無しさん:05/01/22 23:40:41
Metrowerks CodeWarriorもテンプレに入れてほしいなぁ
11デフォルトの名無しさん:05/01/22 23:42:59
今の今までMetrow"o"rksだと思っていた。eだったのかよ。
12デフォルトの名無しさん:05/01/22 23:44:42
人の揚げ足とっててそんなに面白いか? うん
13デフォルトの名無しさん:05/01/22 23:45:28
揚げ足なんか取っていないぞ。eが正しいんだから。
14デフォルトの名無しさん:05/01/22 23:46:55
初心者はまず何をすればいいですか
15デフォルトの名無しさん:05/01/22 23:48:33
ありゃそうだった、これはすまんことした
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
> 初心者はまず何をすればいいですか

石鹸で手を洗う。
19デフォルトの名無しさん:05/01/22 23:52:05
奴にはチーズの薀蓄を色々聞かされたが、プログラミングに関しては何かを語っているのを余り聞いた覚えがない。
20デフォルトの名無しさん:05/01/22 23:52:43
> a[b]とb[a]は同じ。

そう。だから a[1] と 1[a]は同じ
21デフォルトの名無しさん:05/01/22 23:52:56
>>14
初心者はまずコンパイラと良書を買った方がよい。
初心者が陥りやすい間違いの1つとして、最初だからとタダで済まそうとして
コンパイラをコマンドから操作できなくてその時点で挫折すること、がある。
何だかんだ言ってIDEがあった方が使いやすい。
本は良いものをかなり選ばないと後々苦労する。周りにバリバリのコーダーが
いればその人に聞くと良いかもしれない。ネットだけの環境で済ますのもやはり
お勧めしない。
22デフォルトの名無しさん:05/01/22 23:54:20
> 初心者はまずコンパイラと良書を買った方がよい。

たとえばどんな本ですか?
23デフォルトの名無しさん:05/01/22 23:54:51
コンパイラは入れました
BCCというやつです
24デフォルトの名無しさん:05/01/22 23:55:07
ねらーでも分かるCプログラミング。740円。
25デフォルトの名無しさん:05/01/22 23:55:46
> 初心者が陥りやすい間違いの1つとして、最初だからとタダで済まそうとして
> コンパイラをコマンドから操作できなくてその時点で挫折すること、がある。

はあ? 初心者はgccに決まってるだろ? それ以外の物をつかったら、
けっきょくここにきてる厨房と同じ程度でつまづいて止まってしまうことうけあい。
26デフォルトの名無しさん:05/01/22 23:56:44
>>22
お前にはもう無理
すぐ人に聞くやつの中でマシやつは今まで一人もいなかった
27デフォルトの名無しさん:05/01/22 23:56:46
> BCCというやつです

あれはだめ。すてろ。
28デフォルトの名無しさん:05/01/22 23:57:19
捨てました
29デフォルトの名無しさん:05/01/22 23:57:26
>>26
ようするに答えられないわけですね。えらそうなこと言ってみても。
実際には知らないと。
30デフォルトの名無しさん:05/01/22 23:57:29
日下部って女?
31デフォルトの名無しさん:05/01/22 23:58:18
>>24
32デフォルトの名無しさん:05/01/22 23:58:37
>>28
gccにしろ
33デフォルトの名無しさん:05/01/22 23:58:42
そうなん?
34デフォルトの名無しさん:05/01/22 23:58:48
>>30
呼びました?
35デフォルトの名無しさん:05/01/22 23:59:12
です > 30
36デフォルトの名無しさん:05/01/23 00:00:39
ファビョってるところをみるとどうやら>>26の言うとおりらしい
>>35
(;´Д`)ハァハァ
37デフォルトの名無しさん:05/01/23 00:01:24
です > 30
38デフォルトの名無しさん:05/01/23 00:02:45
ちゃんと「女」って書いてある。
http://www.pleiades.or.jp/keiko/Profile1.html
39デフォルトの名無しさん:05/01/23 00:04:49
女でもハァハァからしょぼーんまで様々だからな
40デフォルトの名無しさん:05/01/23 00:05:33
41デフォルトの名無しさん:05/01/23 00:05:33
わろた、でも、情報何にも無いけど
42デフォルトの名無しさん:05/01/23 00:05:55
フォルダのアクセス権の取得方法を教えてください。
XPのPOWER USERでは書き込みできないかどうかを取得したいだけなんです。
_access()では判断できなかったとです。
よろしく、おながいします。
43デフォルトの名無しさん:05/01/23 00:06:35
opendir()
44デフォルトの名無しさん:05/01/23 00:11:35
>>42
不正ユーザーに教えることはできない。アフォ?
アクセス権も無いやつに教えられるか。あと、すれ違い
45デフォルトの名無しさん:05/01/23 00:13:21
ありがとうです。
今、ためせないんですが
終電になるまで粘ったのがあほらしいとですよ。
46デフォルトの名無しさん:05/01/23 00:15:40
sprintf()について質問です。
次の処理はできないでしょうか?教えてください。

char test[64]="abcd%sefghi";
sprintf(test,test,"efghi");

要するにメモリ位置がかぶってるやつです・・・。
47デフォルトの名無しさん:05/01/23 00:17:32
>>46
未定義じゃないかな。
まぁ、無理。
4846:05/01/23 00:19:21
ありがとうございます。
49デフォルトの名無しさん:05/01/23 00:21:33
もし出来たとしたらやるつもりだったのか?
もうね、アホかと
50デフォルトの名無しさん:05/01/23 00:23:09
バナナかと
51デフォルトの名無しさん:05/01/23 00:30:18
浮動小数での0除算チェックはどうやるのがいいんでしょうか?
if (b != 0.0)
a/b;
じゃだめですよね。
52デフォルトの名無しさん:05/01/23 00:33:28
WinならSEHで検出可能
C++だとtryでくくれば例外自体はキャッチ可能か…?
Cだと全然訳ワカラン
53デフォルトの名無しさん:05/01/23 00:34:02
signal
54デフォルトの名無しさん:05/01/23 00:40:50
OKですよ > 5.1
55デフォルトの名無しさん:05/01/23 00:42:21
c = a / b;
if (c == NaN) {
/* エラー処理 */
}
56デフォルトの名無しさん:05/01/23 00:45:25
fmod(a, b);
if(errno==EDOM){
/* エラー処理 */
}
57デフォルトの名無しさん:05/01/23 00:45:40
gcc>bcc
になる理由って何なの?
最適化とか、C99の対応とか?
58デフォルトの名無しさん:05/01/23 00:47:42
MacOSXで使えるから。 > gcc
59デフォルトの名無しさん:05/01/23 00:51:43
単純に最適化でも、bccは糞でしょ。MMXやSSEすらもインラインasmじゃないと使えないからな。
gccならヘッダをインクルードするだけで対応する組み込み関数を使える。
60デフォルトの名無しさん:05/01/23 00:52:18
gccはもうすぐ4.0が出るから
61デフォルトの名無しさん:05/01/23 00:52:55
まあ学校の課題なんかで使う分にはbccでも十分だがな
6251:05/01/23 01:03:27
ありがとうございます。
>>55さんの方法でやることにしようと思います。
63デフォルトの名無しさん:05/01/23 01:07:37
>>59
その機能はiccのパクリだよね。
64デフォルトの名無しさん:05/01/23 01:18:17
>>63
Intelが技術提供してるし、VCも6.0+ProsessorPackから対応してたと思う。
GCCはAltiVecも使えるから、うまくラップすればx86/Mac両対応のSIMD化コードも作れる。
65デフォルトの名無しさん:05/01/23 03:13:06
きれいな模様を格納してある二次元配列のバイナリファイルを作るソースのお手本ください
66デフォルトの名無しさん:05/01/23 03:19:04
char kireinamoyou[][]={"綺麗な","模様"};
67デフォルトの名無しさん:05/01/23 05:29:21
>>66
その式、C99だとありとか?
68デフォルトの名無しさん:05/01/23 05:46:31
祝!100スレ目
69デフォルトの名無しさん:05/01/23 07:10:00
配列 x[N]に 0〜N の整数をランダムに、かつ重複がないように入れていくにはどうしたらいいですか?
70デフォルトの名無しさん:05/01/23 07:39:19
>>67
なんでもかんでもC99にするなよ。
71デフォルトの名無しさん:05/01/23 08:18:23
72デフォルトの名無しさん:05/01/23 08:28:02
>>69
int x[N]には0〜N-1までしか入らないわけだが。
7369:05/01/23 08:29:06
>>71
どもです

数が多いんでフラグでやってみます
7469:05/01/23 08:30:44
>>72
その通りです
0〜N-1でした
75デフォルトの名無しさん:05/01/23 09:21:39
あんなのCじゃない > bcc
76デフォルトの名無しさん:05/01/23 10:01:04
>>59
>単純に最適化でも、bccは糞でしょ。MMXやSSEすらもインラインasmじゃないと使えないからな。
>gccならヘッダをインクルードするだけで対応する組み込み関数を使える。

それは逆に

gccはヘッダをインクルードして対応する組み込み関数を使わなくてはならないが、
bccならば、MMXやSSEすらもインラインasmで片付いてしまう

とも読み取れるが?
77デフォルトの名無しさん:05/01/23 10:06:18
gccってasm使えないんだっけ?
78デフォルトの名無しさん:05/01/23 10:16:01
>>77
いや、そういう話じゃなくて、単に >>59 の文章は
「これが gcc の利点だ」
という説明になっていない、ってだけ。
79デフォルトの名無しさん:05/01/23 10:41:24
gccってWindowsでも使えるとですか?
80デフォルトの名無しさん:05/01/23 10:45:06
>>79
使ってます
81デフォルトの名無しさん:05/01/23 10:47:02
猫がなんとかってとこにbccがいいって書いてあったから
それにしたんですがgccにします
ダウンロードするだけでいけますよね
82デフォルトの名無しさん:05/01/23 10:49:33
>>81
だめです
83デフォルトの名無しさん:05/01/23 10:53:25
84デフォルトの名無しさん:05/01/23 10:55:51
その前に猫を参考にすること自体やめた方がいいような……。
85デフォルトの名無しさん:05/01/23 10:58:05
>>84
やっぱり・・・
なんか分かりにくいのもそうなんですけど
何か文章が腹立つんですよね
8684:05/01/23 11:03:46
ちなみに俺はSDK編をサンプルとしてだけ使っている。
87デフォルトの名無しさん:05/01/23 11:05:06
プログラム自体は稚拙で汚いよな
純粋に API の使い方だけ見ればいいと思う
88デフォルトの名無しさん:05/01/23 11:07:15
>>87
だから、明白にそう意図して書かれたコードじゃん
それ以上の何かを期待する方がおかしい
89デフォルトの名無しさん:05/01/23 11:12:29
>>76
屁理屈。インラインasmしか使えないことのメリットなんてどこにもないよ。
90デフォルトの名無しさん:05/01/23 11:14:13
>>88
SDK編はいいけど、C言語編は糞だってことでは。
91デフォルトの名無しさん:05/01/23 12:03:49
どのくらいのことができるようになればできると言えますか
92デフォルトの名無しさん:05/01/23 12:35:15
くだらない質問をせずに勉強するようになったとき
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
おまえらもっとましな本読め
97デフォルトの名無しさん:05/01/23 13:28:48
>>95
何で?????
98デフォルトの名無しさん:05/01/23 13:36:20
ここが何のスレッドかわかってないってことだから
99デフォルトの名無しさん:05/01/23 13:47:23
結局>>95も厨房ってことだな
100デフォルトの名無しさん:05/01/23 14:02:03
いいえ
101デフォルトの名無しさん:05/01/23 14:02:06
得意げに言っておきながら、いざ聞かれると「Cスレだから」か
確かに厨房らしいな
102デフォルトの名無しさん:05/01/23 14:02:59
>>100
100スレ目の100なのに、なんだその素っ気ない返事は。
103デフォルトの名無しさん:05/01/23 14:31:56
あいてが「ほこらしげにいった」ということにしてしまえば、自分の間抜けな発言を
ごまかせると思っているあたりが厨だな。
104デフォルトの名無しさん:05/01/23 14:34:08
で、理由は?
105デフォルトの名無しさん:05/01/23 14:34:17
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
なるほど! わかりました。
どうもありがとうございます。
109デフォルトの名無したん:05/01/23 14:41:24
時代は.NETだよもん
110デフォルトの名無しさん:05/01/23 14:42:23
>>98がマジなのだとしたら>>103は結局厨ってことになるしな
こいつもうだめぽ
111デフォルトの名無しさん:05/01/23 14:43:26


----------------------------- 切り取り線 ---------------------------------


112デフォルトの名無しさん:05/01/23 15:01:07
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
サンプルコードはしなくて構わないだろ ぼけ
115デフォルトの名無しさん:05/01/23 15:16:23
サンプルならパソコンぶっこわれてもいいだろう ぼけ
116デフォルトの名無しさん:05/01/23 15:18:55
strcpy((char*)58,"メモリも地球も破壊してやる");
117デフォルトの名無しさん:05/01/23 15:22:41
1.>>105質問
2.>>107NULLを〜するな
3.>>112これなら?
4.>>113だから、NULLを(ry
5.>>114サンプルだからOK
5は、3に対するレスならあってるだろうけど、4に対するレスなら変だな
118114:05/01/23 15:28:32
>>113
サンプルコードはしなくて構わないだろ ぼけ
119デフォルトの名無しさん:05/01/23 15:32:26
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するなよ ぼけ

120デフォルトの名無しさん:05/01/23 15:32:36
>>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 だった。
124デフォルトの名無しさん:05/01/23 15:42:28
>>120
> realloc() が失敗した場合には、元のブロックは変更されない。
> つまり、解放されたり移動されたりはしない。
らしいんで、reallocに渡したポインタは解放した方がいいんじゃないの?
125118:05/01/23 15:43:19
ん???

>>123
free(NULL);
はC的には問題ないはず
126デフォルトの名無しさん:05/01/23 15:46:00
>125
てめー他人のことも考えろよ。お前のCとは違うんだ
127デフォルトの名無しさん:05/01/23 15:47:57
馬鹿が三人揃ったため、スレの信頼性低下中…
128デフォルトの名無しさん:05/01/23 15:50:24
>>125
標準Cなら問題ないですよ。ANSIでもISOでも。

strcasecmpが標準ライブラリにに含まれる「北朝鮮金正日万歳C」だとダメらしいです。
129デフォルトの名無しさん:05/01/23 15:53:31
>>125
その事を>>123に言ってる俺に向けて言われてもね・・・
130125:05/01/23 15:54:52
>>128
その事を>>123に言ってる俺に向けて言われてもね・・・
131デフォルトの名無しさん:05/01/23 16:07:08
ごめん。
後半部は、電波を受信している人に対しての皮肉なので気にしないで。
132デフォルトの名無しさん:05/01/23 16:19:05
このスレだけ文字サイズが大きくなるのは俺だけ?
133デフォルトの名無しさん:05/01/23 16:23:03
>>124
あれ、どこにそんなこと書いてあった?
reallocは失敗したら元の領域を解放してNULLを返すはずだが
もしかして俺が覚え違いをしているのか?
134デフォルトの名無しさん:05/01/23 16:26:42
>>120
> それとも失敗したときはNULLなのか、mallocで確保したままなのかってことか?
> それなら上みたらわかるようにNULLになってる
> reallocはいったん解放したあとに、大きさの違うものを確保していると考えてよい

エラーの場合、realloc() 前の領域は解放されない。
135デフォルトの名無しさん:05/01/23 16:34:06
>>133
手元のANSI-C準拠らしいman reallocで。
136デフォルトの名無しさん:05/01/23 16:37:11
すまん、俺が馬鹿だった
137デフォルトの名無しさん:05/01/23 16:40:56
つまり、世間に山ほどある、
p = realloc(p, size);
みたいなコードは、メモリリークを生む可能性があるのかな。

とはいえ、realloc失敗した時点で、大抵は致命的エラーなので
これ自身が問題になることは殆ど無いだろうが。
138デフォルトの名無しさん:05/01/23 16:43:25
>>137
それ以上つっこむと、free議論になるんでやめた方がいいかと。
139デフォルトの名無しさん:05/01/23 16:52:38
>>133
サイズが 0 の呼び出しなら、
free() と同義だったかと。
140デフォルトの名無しさん:05/01/23 18:20:22
【結論】

free()回数は3回だ
141デフォルトの名無しさん:05/01/23 18:55:07
10-n%5 の式があったときの評価の順番は
先に(n%5)で引き算は後と考えていいですか?
142デフォルトの名無しさん:05/01/23 18:56:58
>>141
試せばわかる事を聞くな。
143デフォルトの名無しさん:05/01/23 19:10:25
>141
演算子の優先順位で調べろ
144デフォルトの名無しさん:05/01/23 21:00:32
まずこれを読めという本ありますか
145デフォルトの名無しさん:05/01/23 21:03:07
The C Programing language. First edition
146デフォルトの名無しさん:05/01/23 21:03:12
すれ違い
いい加減日本語くらい読めるようになれよ
147デフォルトの名無しさん:05/01/23 21:05:32
>>144
あなたが入手したコンパイラのマニュアル
処理系依存だろうが非標準拡張だろうがそんなことに一切かまうな
まず、そいつで何か作れるまで外野の煽りは一切遮断しろ
それらはすべて何か作れるようになってから論じるべきことだからだ
148デフォルトの名無しさん:05/01/23 21:07:12
>>145
死んどけ。
149デフォルトの名無しさん:05/01/23 21:17:58
>>144
まずは、人に尋ねる前に自分で調べること。

http://pc5.2ch.net/test/read.cgi/tech/1106175218
150デフォルトの名無しさん:05/01/23 21:30:45
いくらマニュアル読んだところで文法は書いてないだろう
151デフォルトの名無しさん:05/01/23 21:36:02
>>150
ボーランドのマニュアル読んでみ
152デフォルトの名無しさん:05/01/23 21:37:18
原理主義うざっ
153デフォルトの名無しさん:05/01/23 21:45:57
>>148
挫折したのか? 一番的確な文法書だと思うよ。
154デフォルトの名無しさん:05/01/23 23:15:29
ISO/IEC 9899:1999を読め。すべてが分かる。
155デフォルトの名無しさん:05/01/24 00:07:21
>>144
まず>>1を読めバカ。
156デフォルトの名無しさん:05/01/24 01:24:19
キーボードから入力を受付けるときに、
「キー連打」と「一定時間以上キー押しっぱなし」
を区別したいのですが、どうすればよいでしょうか?

kbhit()とgetch()を使ってキー入力を判断しているのですが、
私には今のところ、区別できません。

だれか教えてください。
よろしくお願いします。
157デフォルトの名無しさん:05/01/24 01:27:20
標準Cにも、区別できません。
158デフォルトの名無しさん:05/01/24 01:27:23
>>その前に
OS教えてください。早いから、答えによっては怒るよ、TRONなら
怒らない
159デフォルトの名無しさん:05/01/24 01:31:19
>>156
入力してるところを撮影した動画を解析すればいいんじゃない?
160156:05/01/24 01:41:36
>>159
ありがとうございます
解決しました!
161156:05/01/24 01:42:57
>>158
OSは、WindowsXPです。
162156:05/01/24 01:44:23
>>157
そうなんですか。それは残念。
163デフォルトの名無しさん:05/01/24 06:59:13
>>156
タイマー割り込みを使うと簡単に区別できます。
164デフォルトの名無しさん:05/01/24 07:01:40
>>163
どうやって?
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
ありがとうございます。試してみます。
170デフォルトの名無しさん:05/01/24 13:22:13
char s[]="文字列\
連結";
171デフォルトの名無しさん:05/01/24 13:25:39
>>170
インデントが崩れるから使いたくないな、それは
172デフォルトの名無しさん:05/01/24 14:00:23
文字常数age!
173デフォルトの名無しさん:05/01/24 14:03:01
char s[]=
  "文字列"
  "連結";
174デフォルトの名無しさん:05/01/24 14:03:36
char s[]
=
  "文字列"
  "連結"
;
175デフォルトの名無しさん:05/01/24 14:09:41
間違ってコンマを入れるなよ。
コンマに挿れるなら
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しない方がいい。
データ構造に対する操作は一貫性と共通化のために関数にまとめよ。
逆向きにたどるためには逆向きのリンクのある双方向リストを使え。
178デフォルトの名無しさん:05/01/24 14:51:44
再帰して帰りながら参照していけばいいじゃん
179デフォルトの名無しさん:05/01/24 14:56:12
*prev入れれ
180デフォルトの名無しさん:05/01/24 14:59:01
>>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;
}
181176:05/01/24 15:07:38
>>177-180
ありがとうございます。
180で実行したところ、入力した文字ではなく
ヘヘヘヘヘヘのように文字化けして出力されるので
すが、何が問題でしょうか?
182デフォルトの名無しさん:05/01/24 15:19:15
>181
初期化忘れの要素がある論理エラー。
状態チェックのできない思考回路。
183デフォルトの名無しさん:05/01/24 15:30:25
>>180
これって順に格納して逆から参照してるんじゃなくて、
逆に格納して順に参照してるんでは?
184デフォルトの名無しさん:05/01/24 16:05:31
>>177
>同じタグでtypedefしない方がいい


185デフォルトの名無しさん:05/01/24 16:59:29
死期蔑死の間違い
186デフォルトの名無しさん:05/01/24 17:39:27
ナウイ ヤング
187デフォルトの名無しさん:05/01/24 17:54:41
C言語のおかげで俺は自殺するはめになりました。
さようなら。
188デフォルトの名無しさん:05/01/24 17:57:10
↑そいつはよかったな
189デフォルトの名無しさん:05/01/24 18:02:12
>>187
死なないで!
私…貴方が死んだら悲しむわ。
ね、私が貴方の生きる目的にはなれないのかしら…
190デフォルトの名無しさん:05/01/24 18:09:55
>>189
何が面白いのかよく分からんが、
とりあえず自演乙。
191デフォルトの名無しさん:05/01/24 18:11:46
>>190
感動しろ、この変態既知害。真人間の感性を教えてやろう
192デフォルトの名無しさん:05/01/24 18:16:35
ひまばんだな
193デフォルトの名無しさん:05/01/24 18:46:54
ぶらり
194デフォルトの名無しさん:05/01/24 19:34:35
超初歩的な質問ですがよくわからなくなったとです。

for(a=0, a<=30, a+=0.1){
N_vector[0] = 2*a;
N_vector[1] = 3*a;
}

これってfor文でいろいろ計算しても、途中の計算は省略されて最後のa=30
しか対応しませんよね。

それぞれの値を対応させるには何を付け加えればいいのですか?
195デフォルトの名無しさん:05/01/24 19:39:53
まず、>>194 は一体「何をしたいんだ?」
196デフォルトの名無しさん:05/01/24 19:41:26
>194
iよ、そうよiよー。
でも単なるiじゃないの。
前進するiよ。[i++]
197デフォルトの名無しさん:05/01/24 19:49:37
>>192
>for(a=0, a<=30, a+=0.1){

とりあえず、これはやめた方がいい。
198デフォルトの名無しさん:05/01/24 19:49:38
>>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個の値が出て、それぞれこれはここに対応、
これはここに対応みたいに全ての値を反映させたいんだろ。
意味はわかるがやり方がわからん。
201デフォルトの名無しさん:05/01/24 19:58:58
>199
改行文字、って知ってるかい?
202デフォルトの名無しさん:05/01/24 19:59:14
>>194-198
a が int型 だったらどうするんだい?

さらに言えば仮に a が double や float だったとしても、
a = 30 のケースが無事実行されるとは限らないし。
203デフォルトの名無しさん:05/01/24 20:03:07
>>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/

↑良かったら、みさきのゲームしてー。
205デフォルトの名無しさん:05/01/24 20:10:47
みさきのゲームどこにあるの?
ダウンロードできません。
206デフォルトの名無しさん:05/01/24 20:11:39
アドレスとかポインタって言われても全くわからん。
本読んでも全くわからん。
俺ははっきりいってアホです。知能遅れです。
すげぇーわかりやすく説明してくれる達人はいませんか?
小学生でもわかるように。
207デフォルトの名無しさん:05/01/24 20:12:21
こら、ちゃんと日本語で説明しないから憶測だらけになったじゃないか!
208デフォルトの名無しさん:05/01/24 20:14:05
住所
住所がかける紙
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
「賢い」は「かしこい」ってよむんだ。

賢い君が読んでいる本の題名を言ってみろ。
213デフォルトの名無しさん:05/01/24 20:28:44
>>206
>すげぇーわかりやすく説明してくれる達人はいませんか?

今お前は、当の相手がいるかいないのか分からないのに、
その「達人」の話をしているだろ?

ここでいう「達人」って言葉は「"達人" へのポインタ」なんだよ。

void TatujinCheck(Tatujin *達人)
{
if (達人 != NULL) /* もし達人がいれば */
printf("%s。教えてください", 達人->名前);
else
printf("ケッ、ろくな奴がいねぇな");
}
214デフォルトの名無しさん:05/01/24 20:33:28
>>206-213
自作自演乙
215デフォルトの名無しさん:05/01/24 20:34:45
>213
たとえnullでなくても、
指している先が達人であるとは限らんが?
216デフォルトの名無しさん:05/01/24 20:36:42
>>215
それもポインタ。
217デフォルトの名無しさん:05/01/24 20:37:45
>>215-216
自作自演乙
218デフォルトの名無しさん:05/01/24 20:39:13
>>
219デフォルトの名無しさん:05/01/24 20:41:13
>>218
自作自演乙
220デフォルトの名無しさん:05/01/24 20:42:50
>>206です。
全くわかりません。
本当に俺はアホなのですが、プログラミングをしてみたいのです。
頑張ってif文とかfor文を1ヶ月かけて理解できました。
ポインタとかアドレスでつまづいています。
マジで教えて下さい。
221デフォルトの名無しさん:05/01/24 20:45:23
>220
アホよ、何でむずかしいC言語を選んだ?
222デフォルトの名無しさん:05/01/24 20:45:50
プログラミングをやりたいだけならば、
別にポインタを使わなくても良いのでは?

実際にポインタが必要になった時には
自然に分かるようになるもんだ。
223デフォルトの名無しさん:05/01/24 20:49:01
どのプログラムでも良いから、
その逆アセのコードとダンプファイルを
じっと1時間眺めていろ。

必ず分かる。
224デフォルトの名無しさん:05/01/24 20:52:36
漠然とした質問ですが。check関数とはなんですか?
どうやら正しい範囲等を判定する関数らしいですね
225デフォルトの名無しさん:05/01/24 20:55:00
>224
チェックする関数?
標準関数じゃないから知らん
226デフォルトの名無しさん:05/01/24 20:55:36
>>224
中学で英語習ったらわかると思うよ。
227デフォルトの名無しさん:05/01/24 20:58:17
漠然とした質問ですが、sex関数とはなんですか?
どうやら子を産む関数らしいですね
228デフォルトの名無しさん:05/01/24 20:59:49
is〜のことを言っているのか?
229デフォルトの名無しさん:05/01/24 21:01:40
オレに何か用か?
現在違法行為はお断りだ
230デフォルトの名無しさん:05/01/24 21:01:47
ポインタが分からなければJavaに逃げればいい
231デフォルトの名無しさん:05/01/24 21:02:22
>>227
spawn
232デフォルトの名無しさん:05/01/24 21:03:34
ポインタのポインタのポインタのポインタ とかでずっと続けていくとしたら、
ANSI C ではいくつまで保障されていますか?
switch case の case は257までと,どっかで見ました。
233デフォルトの名無しさん:05/01/24 21:04:14
abort!
234デフォルトの名無しさん:05/01/24 21:04:52
>>232
>switch case の case は257までと,どっかで見ました。

怪しすぎ・・・
235デフォルトの名無しさん:05/01/24 21:05:28
ポインタが分からなければアロー演算子に逃げればいい
236デフォルトの名無しさん:05/01/24 21:08:24
ぬるぽがわからねーなら、夜の街に逃げれば〜?
237デフォルトの名無しさん:05/01/24 21:10:53
このすれは相変わらずうんこ
238デフォルトの名無しさん:05/01/24 21:21:58
>>234
ttp://wisdom.sakura.ne.jp/programming/c/c7.html
ほら、ここのヲタっぽいサイトにそれらしい事が。
239194:05/01/24 21:26:56
ごめんなさい。質問の仕方が悪かったですね。改めて

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
クリックしたら爆発するんだろ?

いつものように厨房三人組がそろったため、クソスレ化してます。
241デフォルトの名無しさん:05/01/24 21:33:06
>>240はブラクラだと思っているのか
それとも257より多いcaseがあるswitchを実行すると爆発すると言いたいのか。
242デフォルトの名無しさん:05/01/24 21:36:03
>>239
すまんが、ますますわからなくなった。
Cから離れて、「正しい日本語」で、何をしたいか言ってみろ
243デフォルトの名無しさん:05/01/24 21:36:15
>239
自分の吐く言葉が何をぼんやり指してゐるか考え給へ。君の言ふ対応は、何により定義さるるか。
244デフォルトの名無しさん:05/01/24 21:39:03
char c;
c = hoge;
switch(c){
case 0:
...
case 255:
default:
}
ほら257個
245デフォルトの名無しさん:05/01/24 21:46:37
普通はヘッダファイルとソースファイルって同じディレクトリに置くのでしょうか?
例えば、hoge_algos.h, と hoge_algos.c っていうファイルを、
\algo\hoge\hoge_algo.h
\algo\hoge\hoge_algo.c
とすべきなのでしょうか?
それとも.cファイルは.cファイルで同じディレクトリにまとめた方がいいのでしょうか?
246デフォルトの名無しさん:05/01/24 21:51:37
量の問題
247デフォルトの名無しさん:05/01/24 21:58:53
>>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に含めるべき。
251デフォルトの名無しさん:05/01/24 22:05:48
>>249 は日下部
252デフォルトの名無しさん:05/01/24 22:06:04
>>238
というか、
>最低限257まで分岐
って事は>>244が言うように変数のサイズが最低だった時の上限の事で…
253デフォルトの名無しさん:05/01/24 22:06:59
結局>>232>>238は日本語が弱かったって事か。
254デフォルトの名無しさん:05/01/24 22:10:52
日本語じゃなくてC言語に弱かったんじゃない?
255デフォルトの名無しさん:05/01/24 22:17:50
ま、でも、C99規格を満たす処理系でも、
1023個を超えたら動かなくなる可能性はある。
256デフォルトの名無しさん:05/01/24 22:37:55
>>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 を探せ。
260デフォルトの名無しさん:05/01/24 23:06:55
>>257
Cygwinだろ
261デフォルトの名無しさん:05/01/24 23:13:46
>>258-260
ありがとうございます.
あちらへ行きます.
262257:05/01/24 23:17:38
>258
Win32APIスレというよりCかなと思ったんですがそっちに移ったほうがよいですか?

>259
むー
gccのソース展開すんの大変.
最終手段として採用させていただきマンモス.

>260
cygwinのgccでコンパイルすりゃいいのは分かってんですけどね,
使いたいdllがあるんでVCでコンパイルしようかなーと.

>261
おまい誰?
263デフォルトの名無しさん :05/01/24 23:17:52
cでストリームを使って
コマンドプロンプトにファイルの内容などを表示させるのでなく、
実際にファイルを開くことのできる関数はあるのでしょうか?

初歩的な質問ですがご教授お願いします。
264デフォルトの名無しさん:05/01/24 23:20:50
fopen
265デフォルトの名無しさん:05/01/24 23:24:42
>>262
>cygwinのgccでコンパイルすりゃいいのは分かってんですけどね,
>使いたいdllがあるんでVCでコンパイルしようかなーと.
何か知らんが、そのdllはcygwinからでも使えるはずだが。
266デフォルトの名無しさん:05/01/24 23:28:23
>>264
fopenを使ってストリームと結びつけるのではなく、
実際にファイルを開きたいのですが・・・
267デフォルトの名無しさん:05/01/24 23:31:09
>>266
ストリームを使えない理由は?
268デフォルトの名無しさん:05/01/24 23:33:07
266は実行(ダブルクリック)したときと同じ動作をしたいのか?

notepad.exeだけ?
269デフォルトの名無しさん:05/01/24 23:34:42
もしかしてバイナリ処理がしたいとか?
それならfopen→fread/fwrite→fcloseで出来るわけだが
270デフォルトの名無しさん:05/01/24 23:35:29
>>267
ストリームを使ってもファイル(.exe,.bat)などを
ひらく(実行する)ことができるのでしょうか??
できるのならやり方を教えてください。
271デフォルトの名無しさん:05/01/24 23:37:15
>263
ShellExecute API。
これからはwinapiの勉強もしなさい。
272デフォルトの名無しさん:05/01/24 23:37:20
>>270
「ひらく」 と 「実行する」 は意味が全然違うぞ。
273デフォルトの名無しさん:05/01/24 23:38:34
>>270
標準関数だけで済ますなら

system(実行したいファイルのパス);
274デフォルトの名無しさん:05/01/24 23:41:00
例えばウイルス.exeを例にとると
メモ帳で開きたいのか・・・?
実行(ファイルを開くとも言う?)させたいのか・・・?

後者は危険だなw

275デフォルトの名無しさん:05/01/24 23:42:14
まず、ストリームの定義をはっきりさせて、
Cでいうファイルを開くという意味と、
プログラムを実行するという意味と、
ファイルを引数としてプログラムを実行するという意味の違いを区別しろ
276デフォルトの名無しさん:05/01/24 23:45:41
cでいうプログラムを実行するという意味です。
277デフォルトの名無しさん:05/01/24 23:48:27
「ストリームを使う」とはどういう意味なんだ?何をしたい?
278デフォルトの名無しさん:05/01/24 23:52:57
いや>>273のようにしたいのですが
それだと半角スペースを含むファイルパスを指定すると
エラーがでてしまんです。なにか解決策などありますか?
279デフォルトの名無しさん:05/01/25 00:00:38
>>278
シェルに依存するが大抵はダブルクォーテーションで括ってやればよし
280デフォルトの名無しさん:05/01/25 00:01:16
>>278
ひょっとして、scanf("%s"〜〜);で取り込んだ文字列をsystemに渡してないか?
281デフォルトの名無しさん:05/01/25 00:01:27
>>272
Windows世代って時々すごいこと言うよな。
282デフォルトの名無しさん:05/01/25 00:02:30
>>279
cool!
283デフォルトの名無しさん:05/01/25 00:05:35
>>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;
}
284デフォルトの名無しさん:05/01/25 00:06:11
>>283
パスそのものを括るのかと
char ch[] = "\"C:\\Dtetets and Settings\\Owner\\デスクトップ\\20050124_2s[1].jpg\"";
285デフォルトの名無しさん:05/01/25 00:07:37
これだからウィンドウズ世代は…
286283:05/01/25 00:08:11
'C:\Dtetets' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

と表示されます。
287デフォルトの名無しさん:05/01/25 00:09:45
マッカーサーの再来
ゲイツの愚民化戦略そのままだな・・・
288283:05/01/25 00:15:53
>>284
有難うございました。できました。
289デフォルトの名無しさん:05/01/25 00:17:05
「Dtetets」 って・・・
290デフォルトの名無しさん:05/01/25 00:20:19
Windowsって、.jpgが実行できるのか。知らんかった。
291デフォルトの名無しさん:05/01/25 00:24:46
.htmlも実行できるぞ
292デフォルトの名無しさん:05/01/25 00:25:44
フォルダも実行。
293デフォルトの名無しさん:05/01/25 00:28:12
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);でいいんですか?

295デフォルトの名無しさん:05/01/25 00:37:38
>>294
必要な要素が 1 つならそれでいい
296デフォルトの名無しさん:05/01/25 00:38:26
環境依存の質問に、何得意げに答えてんだ…
図に乗るから一々答えんな。

>>294
なんで人に訊くんだ…
  malloc(sizeof str2 * 欲しいだけ)
で、「欲しいだけ」は君しか知らん。
297デフォルトの名無しさん:05/01/25 00:40:51
str2 *str3;
そもそもこの行おかしくないか・・・?
typedefするなり
struct str1 *foo;
なりじゃ?
298デフォルトの名無しさん:05/01/25 00:41:16
>>296
何が環境依存だって?
299デフォルトの名無しさん:05/01/25 00:44:40
>>290じゃおまえ何ていうの? 開く、見る??
300294:05/01/25 00:45:25
まだ 欲しいだけが分からない場合は適当でいいってことですかね?
途中でreallocするとかするんでしょうか?
301デフォルトの名無しさん:05/01/25 00:47:47
>>281>>285
私はWindows世代ですけれど、そんな表現は使った事無いです。(とマジレスしてみる)

>>298
systemじゃね?
302デフォルトの名無しさん:05/01/25 00:48:57
>>301
カッコイイ
303!=290:05/01/25 00:49:28
>>299
(関連付けされたアプリケーションで)開く
304デフォルトの名無しさん:05/01/25 00:50:12
>>301
(とマジレスしてみる) だってwwwww
305デフォルトの名無しさん:05/01/25 00:54:33
つまり>>263の発言はある意味ただしかったのか・・・
てかここにいるやつもそれくらいわかるだろーに・・
306デフォルトの名無しさん:05/01/25 01:27:31
>>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()
のプログラムソースを教えてください
308デフォルトの名無しさん:05/01/25 01:52:50
309デフォルトの名無しさん:05/01/25 02:08:21
どうやらここにはアホの僕にポインタとかアドレスを超わかりやすく
説明してくれる人はいないみたいですね。
俺は本当に知恵遅れなんです。
それでも必死でがんばっています。
何とかお願いします。
310デフォルトの名無しさん:05/01/25 02:14:02
>>309
何が知りたいんだ?
ポインタの概念か
使い方か
311デフォルトの名無しさん:05/01/25 02:16:28
住所が書ける紙
住所
312デフォルトの名無しさん:05/01/25 02:17:26
313デフォルトの名無しさん:05/01/25 02:18:01
「メモリ内の任意のアドレスに読み書きするための仕組み」
でいいんじゃないか
314デフォルトの名無しさん:05/01/25 02:21:16
実際には任意のアドレスには書き込み出来ない訳だが
315デフォルトの名無しさん:05/01/25 02:23:09
それはOSの制限であってポインタの本質とは関係ないけどな
316デフォルトの名無しさん:05/01/25 02:25:40
定義の論争に入っちゃたら説明どころじゃなくなるぞ、と
場所を指す、なんていってもまずは、
コンピュータ――特にメモリ周り――の構造、というか原理が
わからないことには理解できないと思うから、
知らないならそこからやった方が良いと思われ。
317デフォルトの名無しさん:05/01/25 02:26:46
>>309
しつけぇよ。諦めろ。
318名前は開発中のものです。:05/01/25 02:28:09
浮動少数をゼロ割りした際に
printfで表示したところ
1.#IND00
と表示されました。

浮動少数が1.#IND00
かどうかチェックするにはどうすればいいでしょうか?
ためしに
float a = 1.0f / 0.0f;
if( a == 1.#IND00 )
{
}
としたのですが、コンパイルエラーですた・・。
319デフォルトの名無しさん:05/01/25 02:28:15
>>308

わかんね。。。
ヘッダファイルの繰り返し。。
ヘッダなしでよろw(オオソドックスな#stdio.h などはいいんですが、、)
320デフォルトの名無しさん:05/01/25 02:28:53
>>219
strstr.c

strlen.c
で調べる
321320:05/01/25 02:30:00
アンカーミスった orz
>>319
322デフォルトの名無しさん:05/01/25 03:05:00
>>318
float a = 1.0f / 0.0f;
printf("%08x", (unsigned long *)&a);
323デフォルトの名無しさん:05/01/25 03:11:52
>>322
アドレスを表示する意味が分かりません。
しかもわざわざキャストまでしてw
324デフォルトの名無しさん:05/01/25 03:13:55
すまんかった。
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)
{
}
329デフォルトの名無しさん:05/01/25 09:17:42
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;位置
332330:05/01/25 10:12:47
>>331
ア・・・  なるほど、ありがとうございます。
333デフォルトの名無しさん:05/01/25 10:46:46
確かにプログラマ向けの略語辞典は少ないな。
334デフォルトの名無しさん:05/01/25 10:49:30
whileで繰り返し一行ファイルから表示されて
それにscanfでうちこんで比較するタイピングもどき作ってるんですけど
ファイルからの一行表示をランダムにするにはどうするのでしょうか?
前スレでmallocの事がでてきたんですけど初心者で分からなくて;
335デフォルトの名無しさん:05/01/25 10:50:47
>>325
随分と半可通なレスですね。
偶数ならいいって話でもないでしょう。
336330:05/01/25 10:51:05
連結リストの仕組みがいまいち理解できないので
アドレスみながら実行してみたんですが、それを見ると・・

headerを現在のposの位置に動かすことによって次のposの
位置がheaderに押し出されるように現在のposの先の位置に
移動しているようなんですが、

なんでなんでしょうか? 頭がワンワンパニック状態です・・
337デフォルトの名無しさん:05/01/25 10:56:37
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< ぱいちんこぱいちんこ!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< ぱいちんこ!
ぱいちんこ〜!    >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」               ̄     / /
338デフォルトの名無しさん:05/01/25 10:58:42
>336
代入には副作用がある。代入すると元のデータが破壊されてしまうのだ!
データ構造の変化を紙か頭の中に描け。
そしてまともな解説を探せ
339330: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);
}
346デフォルトの名無しさん:05/01/25 11:34:04
>>344
一からポインタ勉強しなおせボケ
347デフォルトの名無しさん:05/01/25 11:35:23
>344
構造体ポインタは
ptr->member
のように使うんだ。
p_fooは無効アドレスを刺し殺しているポインタだろ?
348344-355:05/01/25 11:39:15
グローバル変数で宣言したら問題なかったのですが、
この方法しかないのでしょうか?
349デフォルトの名無しさん:05/01/25 11:43:15
>>309
> どうやらここにはアホの僕にポインタとかアドレスを超わかりやすく

ポインタ:プログラム上で扱うオブジェクトがどこにあるかを指し示すもの
アドレス:CPU がメモリをアクセスする際のメモリの位置
350デフォルトの名無しさん:05/01/25 11:43:49
>348
大局変数は大局的に共有できる利点がある。共有しなくても関数の引数で渡せる
351341:05/01/25 11:43:52
>>343
解決しました、ありがとうございました。
352336:05/01/25 11:51:16
for (pos = header; pos != NULL; pos = pos->next) {
printf("%s\n", pos->station);
現在posに連結先のアドレスを代入することによって
どんどん逆参照している(アドレスがNULLに近づいていっている)みたいなんですが、
ということはこの場合nextではなくprevと書くのが正しいのでしょうか?
353344-355:05/01/25 11:53:30
>>350
この場合、自作関数に引数として渡した後
どういった演算子で構造体内の変数を参照できるのでしょうか?
354デフォルトの名無しさん:05/01/25 12:00:41
>>355
いいから初心者スレに行けよ。
355344-355:05/01/25 12:04:02
初心者お断り・・。
356334: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をおまいのヘルプで調べろ、ぼけ。ここはおまいらの来るところじゃない
358デフォルトの名無しさん:05/01/25 13:04:20
>>344
> void func_getword(FILE *fp, **p_foo)
この「**p_foo」ってのは何を指すポインタや?


359デフォルトの名無しさん:05/01/25 13:10:04
*foo
360デフォルトの名無しさん:05/01/25 13:11:31
>>318

if (isinf(a)) とか、
if (a == INFINITY) とか。
361デフォルトの名無しさん:05/01/25 13:27:30
無限大の表現が1個とはかぎらないし、マイナスもあるから、前者のみ。
362デフォルトの名無しさん:05/01/25 14:24:43
DATA01というプログラムを変数TIMEをパラメータとして渡して起動させる
プログラムを作りたいのですが。
363デフォルトの名無しさん:05/01/25 14:39:40
>>362
が、何?
方法なら百件弱前のレスを見とけ
#まさか引数の渡しかたが…なんて言うなよ
364デフォルトの名無しさん:05/01/25 15:17:19
>362
system("DATA01 TIME");
365デフォルトの名無しさん:05/01/25 15:31:51
>>362
ワードの中の人が、「助詞の連続」というエラーを吐きました。
366デフォルトの名無しさん:05/01/25 15:34:06
>>363>>364
ありがとうござます。起動できました。
367デフォルトの名無しさん:05/01/25 15:49:26
>>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だけずらせ。
ずらすとはどうやるんですか?質問ばっかですいません。
371デフォルトの名無しさん:05/01/25 18:37:00
>>370
そのままの式で計算してみ。
372デフォルトの名無しさん:05/01/25 18:41:21
>>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は短慮。
373デフォルトの名無しさん:05/01/25 19:23:42
>>372
> 369は短慮。

むしろ短小
374デフォルトの名無しさん:05/01/25 20:20:56
お前ら本当にC言語使えるのか?
頭悪い奴らばっかりだな。
375デフォルトの名無しさん:05/01/25 20:27:29
if(buf[i]が小文字だったら)
buf[i]+='n'-'a';
376デフォルトの名無しさん:05/01/25 20:28:49
>374
うざいマルチ
377デフォルトの名無しさん:05/01/25 20:38:56
<ctype.h>のislower,isupper,isdigitで文字種判定
378デフォルトの名無しさん:05/01/25 20:50:01
ん? 374に何か書いてあるのか。
379デフォルトの名無しさん:05/01/25 20:58:44
事故解決しました
380デフォルトの名無しさん:05/01/25 22:21:34
printf("うんこスレ");
381デフォルトの名無しさん:05/01/25 23:17:34
こいつ。改行のしかたもしらんのか
382デフォルトの名無しさん:05/01/25 23:19:52
うんこトークしようぜ!!!!!!
383デフォルトの名無しさん:05/01/25 23:30:37
unkondo
384318:05/01/25 23:35:12
>>360
おそレス。
どうもありがとう。
385デフォルトの名無しさん:05/01/25 23:46:04
>>383
近藤の話はマ板で。
386デフォルトの名無しさん:05/01/26 03:12:44
unsigned int を int にキャストして代入する必要はあるのでつか?
387デフォルトの名無しさん:05/01/26 03:16:08
ありません。
388デフォルトの名無しさん:05/01/26 03:19:35
とんくす!
389デフォルトの名無しさん:05/01/26 04:18:05
ゆにくす!
390デフォルトの名無しさん:05/01/26 04:42:41
えにくす!
391デフォルトの名無しさん:05/01/26 06:31:21
おりくす
392デフォルトの名無しさん:05/01/26 08:12:21
signal関数で呼び出す関数に引数を渡すことはできまつくぁ?
393デフォルトの名無しさん:05/01/26 08:13:51
>>392
signalの使い方を調べろ。
394デフォルトの名無しさん:05/01/26 08:15:36
>>393
おまいもしや・・・しらんな?プププ
395392:05/01/26 08:24:00
すまん。わかりました。
>>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
などはどの順で書いてます?
398デフォルトの名無しさん:05/01/26 09:54:33
>>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)、...の順だな。まあたいがいのやつはそうだろうけど
402デフォルトの名無しさん:05/01/26 09:57:13
gccのソースコードでも見て参考にしろよ、アフォ
403デフォルトの名無しさん:05/01/26 12:35:16
>>397
前もって書かなければならない順に書く。
大抵は、(1)、(2)、(9)、、、の順になるな。
404おながいします:05/01/26 12:58:26
2つの文字列A,Bを入力し、各文字列の文字数を調べ、文字数が多い文字列のなかにもう一方の文字列が含まれているかどうか
を調べるプログラムを作成せよ。ただし、
両文字列はアルファベットと数字、空白文字を要素とする文字列とする。
両文字列とも文字を要素とする配列に読み込むこと
文字列の入力にはgets(fgetsでもよい)を用い、入力可能な文字数の文字列を扱うこととして良い。
入力文字のエラーチェックは行わなくてよい
strstr(),strlen()などの文字列関数は使わず作成すること

が問題です。おねがします
405デフォルトの名無しさん:05/01/26 13:03:58
>が問題です。おねがします
( ´_ゝ`)フーン

で、お前は日本語も読めないし検索も出来ない低脳って訳だな?
406おな:05/01/26 13:06:30
>>405

おねがいします でした
407デフォルトの名無しさん:05/01/26 13:11:09
こいつズレてるね
ただの池沼か
408デフォルトの名無しさん:05/01/26 13:12:52
すいません、ちょっと質問なんですけど。

ファイルから 12345,moji,6789 のようにカンマで区切られてる文字列を読み込むときで
それぞれ数値、文字列、数値の型に入れたいときってどうすればいいんでしょうか…

色々検索してみた所fscanfでも出来なくはないが工夫が必要だと書いてあったんですけど。
やっぱりfgetsを使ってコツコツやった方がいいんでしょうか。
409デフォルトの名無しさん:05/01/26 13:13:49
>>408
はい。
410デフォルトの名無しさん:05/01/26 13:15:18
>>404
文字数は調べようがありません。
411デフォルトの名無しさん:05/01/26 13:18:01
>>408
int a, b;
char s[256];

fscanf(fp, "%d,%[^,],%d", &a, s, &b);
412デフォルトの名無しさん:05/01/26 13:23:53
>>409,411
回答どうもです。411さんのやり方でやったら簡単に出来ました。ありがとうございます〜
413デフォルトの名無しさん:05/01/26 15:38:39
> 文字数は調べようがありません。
嘘言うんじゃない。
414デフォルトの名無しさん:05/01/26 15:40:24
未来はわからん
415デフォルトの名無しさん:05/01/26 16:17:38
宿題丸投げの莫迦は放置。
416デフォルトの名無しさん:05/01/26 17:14:36
質問です
関数の戻り値に構造体を使ってみたのですが、これって大丈夫なんでしょうか?
コンパイルはとおりました。動作も大丈夫っぽいです
「引数はスタックに積まれるらしいけど、戻り値はどこに格納されるんだろう」
という疑問が残ってます。
宜しくお願いします
417デフォルトの名無しさん:05/01/26 17:18:38
>>416
Cだよね、エラーにならない?
Cはコールばいバリューしか無いのだから処理系依存だろう
418デフォルトの名無しさん:05/01/26 17:21:45
すまない、教えてくれ。
fp1=fopen("XX.csv","r");
の、XXの部分を変数に指定することは可能だろうか?
part01.csv〜part10.csvで同じようなデータを1回1回読み出すのが面倒なんだ
419デフォルトの名無しさん:05/01/26 17:22:04
>>416
例えばとあるコンパイラだとstruct hoge func(int);のような関数が内部ではvoid hoge(struct hoge *, int);と化している。
(そしてその関数を呼び出すときにはコンパイラが密かにstruct hogeの変数を作りそこへのポインタを隠し引数に渡す)
420デフォルトの名無しさん:05/01/26 17:23:50
418>>
そのようなストリングを渡せば良いだろ、こういう良いな
421デフォルトの名無しさん:05/01/26 17:24:18
>>418
char Filename[11];
sprintf(Filename, "part%02d.csv", i);
422デフォルトの名無しさん:05/01/26 17:25:55
すまない、Main(a,b)
の xxx(a,b)を変えたいんだがどうしたらいい
423デフォルトの名無しさん:05/01/26 17:27:48
>>421
\0
424デフォルトの名無しさん:05/01/26 17:27:58
>>422
やりたいことの意味がわからん。
変えたければ変えればいいじゃない。
425デフォルトの名無しさん:05/01/26 17:30:04
でしょう、よく間違えるのがソースコードの\\
426416:05/01/26 17:30:41
>>417
VC7.0なんですが、エラーにはなりません。
処理系依存ですか……こんなコードは書かないほうがいいってことですね。
ありがとうございました。

>>419
なるほど。そのように処理するコンパイラがあるんですね。情報ありがとうございます。
427デフォルトの名無しさん:05/01/26 17:38:32
>420-421
おおっ、thx!

…ストリング渡すとか分からない…

fp1=fopen("sprintf(Filename, "part%02d.csv", i);","r");
これでファイル開くのかな?
ごめんね。おいら駄目学生だから、ごめんね
428デフォルトの名無しさん:05/01/26 17:39:25
>>426
処理系依存ってのはこの場合戻り値がどこに置かれるかということであって、
関数の戻り値に構造体を指定すること自体は処理系依存ではないはず。

それとVCもその「とあるコンパイラ」に含まれるはず。
429デフォルトの名無しさん:05/01/26 17:40:18
>>427
死ねばいいと思うよ(^Д^)AA超略
430デフォルトの名無しさん:05/01/26 17:40:45
>>427
ちょっと笑った
431デフォルトの名無しさん:05/01/26 17:41:05
>>427
違う
char Filename[11];
sprintf(Filename, "part%02d.csv", i);
fp1 = fopen(Filename, "r");

ところでFILE *fp1, *fp2, *fp3, ……;なんてこと、まさかやっていないよな?
432デフォルトの名無しさん:05/01/26 17:42:07
>>428
いいやつだ、絶対関数に出来ないし、現実を認めろ、
でもあんちMSなので敵を作りたくないな
433デフォルトの名無しさん:05/01/26 17:45:04
>431
おもいっきりやってましたorz
授業で教わったファイルの開き方がFILE *fp1;だけだったんだ…

fp1の宣言はどうすればいいんだろう?
434デフォルトの名無しさん:05/01/26 17:46:27
>>433
配列使え。
435デフォルトの名無しさん:05/01/26 17:49:24
>>432
どこにできない(処理系依存等)と書いてあるんだ?
436デフォルトの名無しさん:05/01/26 18:26:24
>>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, ...
}
437デフォルトの名無しさん:05/01/26 18:49:23
親切な人が多いね
438デフォルトの名無しさん:05/01/26 19:00:52
逐次型で10進数を2進数にするには
どうすればいいですか?
439デフォルトの名無しさん:05/01/26 19:04:58
÷2
÷2
÷2
÷2
÷2
÷2
÷2
÷2









440デフォルトの名無しさん:05/01/26 19:45:52
グローバル関数をヘッダの中に定義して
色々なところでそのヘッダを読み込んで使っていたら
インクルードエラーが発生しました。

#ifndef _INC_ヘッダ名
#define _INC_ヘッダ名

#endif

で、囲えば大丈夫だと思っていたんですが。
グローバル関数の場合はヘッダにして使ってはまずいって事でしょうか?
他のプログラムでも使う為にヘッダで使い回しができるものだと思っていたんですが・・・。

#ifndef〜#endifの間には関数が4,5個ほど定義してあって、
いずれの関数も「すでに定義されています」とエラーになってしまいます。

他にクラスを定義したヘッダファイルがあるんですが、
それは#ifndef〜#endifでインクルードガードが機能しているみたいです。

原因は何なのでしょうか?
441デフォルトの名無しさん:05/01/26 19:58:09
>>436
オマエ西日本の人だな

>『開くんじゃなければ』
442デフォルトの名無しさん:05/01/26 20:03:09
>>440
リンカエラーじゃなくて、インクルードエラー?
443デフォルトの名無しさん:05/01/26 20:03:26
>>441
西日本がそんなに珍しいのか??
444デフォルトの名無しさん:05/01/26 20:05:08
だからさ、バージョン教えろ、普通は#onceディレクチブあるし
445デフォルトの名無しさん:05/01/26 20:13:12
>>442
すいません、
error LNK2005
って書いてあるからリンクエラーでいいんだと思います。

インクルードエラーは指定したヘッダファイルが無い時とかですかね
446デフォルトの名無しさん:05/01/26 20:17:30
>>445
同じ名前のグローバル関数が複数のオブジェクトファイル内に存在して、
それらをリンクしようとしたらどうなると思う?
ヒント:リンカはそれらの中身が同じかなんて考えない
447デフォルトの名無しさん:05/01/26 20:21:26
>>446
それを回避するための

#ifndef _INC_ヘッダ名
#define _INC_ヘッダ名

#endif

だと思っているんですが。

グローバル関数の場合はインクルードガードが適用されないって事でしょうか・・・?
448デフォルトの名無しさん:05/01/26 20:30:19
>>447
とりあえず標準のC言語で話を進める。

まず、Cのソースから実行可能形式にビルドするまでには、
三つのプログラムによって処理をすることになる。
・プリプロセッサ
 ―インクルードやらマクロやらを展開する
・コンパイラ
 −機械語に変換してオブジェクトファイルを作る
・リンカ
 −複数のオブジェクトファイルやライブラリをリンクして繋ぎ合わせる
これらは、それぞれ独立して処理することが可能。
でだ、その#...はプリプロセッサに対する命令であって、
コンパイラやリンカには関係が無い。
だから、コンパイラに渡されるときには既に、#include "hoge.h"という一文は、
hoge.hの中身に置き換わっているし、#ifndefなんかも処理されてなくなっている。

あくまで、それは、複数回インクルードするのを防ぐためのものであって、
その中身に関して保障されるものではない。
449デフォルトの名無しさん:05/01/26 20:34:36
>三つの

もろに処理系依存
450デフォルトの名無しさん:05/01/26 20:41:15
>>447
おっと、ローカルな関数の場合はなぜ通るかも言っておいた方が良いか・・・
ローカル関数は、コンパイルされたときに、外部にその関数名を公開されていない。
つまり、名前を持たない状態になっているわけだ。
だから、リンカは名前が重複することが無いから正常にリンクすることが出来る。

無論、完成した実行可能形式のファイルの中には、
同じ関数のコードがそれをインクルードしたオブジェクト分、
複数入っていることになるだろう。


まあ、実際にはその環境独自の拡張とか、色々あるだろうからそっちは知らん。


>>449
「プログラムによって」は余計だったか・・・
言いたかったのは三つのフェーズに切り離せる、と
451デフォルトの名無しさん:05/01/26 20:47:18
>三つのフェーズ

どこを見て標準だと主張してるんだ?
標準とは何かを規定している文書でも見たのか?
452デフォルトの名無しさん:05/01/26 21:26:55
>>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"
453デフォルトの名無しさん:05/01/26 21:44:05
ところで、グローバル関数とha?
454デフォルトの名無しさん:05/01/26 21:46:59
>>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
どこで読んだんだか知らんが思いっきり間違えて覚えてたみたいね
考えてみたらコンパイラもアセンブラと分けられるし・・・
突っ込みどうも
455デフォルトの名無しさん:05/01/26 22:01:24
>>454
偉い、あんたは偉い、だって、UNIXが基礎だし、ありがとう
456デフォルトの名無しさん:05/01/26 22:14:39
>>452のようにソース変更しましたが
関数を使いたいところでincludeして使おうとしても
定義されていない識別子と言われてしまいました。

>>448さんが言っている事もなんとなく理解できてきたのですが
いくつか腑に落ちない点が。

stdio.hやstdlib.hをいくつインクルードしても
エラーが出ない理由はどうしてでしょうか?

先の理由から考えると
コンパイラに渡されるときに
#include <stdio.h>の一文がstdio.hの内容にすり替わっているので
リンクエラーになる、と考える事ができるのでは無いかと思ってしまいます。
stdio.hの中を覗くと回避方法は#ifndef〜#endifで実現しているように見えます。


根本的な事から間違っているような気がしてきました・・・。
457デフォルトの名無しさん:05/01/26 22:15:56
すいません、授業で使う超々入門者用の問題集で疑問が出ました。
↓にソースを載せておきましたけど、これは問題集が間違っているとしか思えません。判定のほどをお願いします

http://jbbs.livedoor.jp/bbs/read.cgi/computer/18956/1106742533/4
458デフォルトの名無しさん:05/01/26 22:24:53
>457
sub呼び出し引数順序間違い
459デフォルトの名無しさん:05/01/26 22:25:31
>>457
それが、理解できるのが高等学校ー大学初等だろう、変なの。
社会に出たら教えろよ
460デフォルトの名無しさん:05/01/26 22:26:21
【2行目の「int x」を「int *x」にしましょう】の間違いではないのか?
461デフォルトの名無しさん:05/01/26 22:28:15
sub(a,i); -> sub(i,a);
462デフォルトの名無しさん:05/01/26 22:29:00
_INC_ヘッダ名_
ってよく_のプリフィクス見るけど、これってやめたほうがいいんじゃない?
463デフォルトの名無しさん:05/01/26 22:32:36
INC_にすべきだな
464デフォルトの名無しさん:05/01/26 22:33:47
>>456 だいたい理解できてる
10 #ifndef hogehoge <- 最初にincludeしたときは、hogehogeが定義されてないから20-30行で置き換える
20 #define hogehoge <- ここでhogehogeをdefineするから、二回目からは10-40行は飛ばされる
30 /* ... */
40 #endif
50 [EOF]

>>462 だめ
465440=445,447,456:05/01/26 22:40:53
やっとできました。。。
>>452さんの方法で
ヘッダファイル内に関数のプロトタイプを記述したら
リンクエラー等無くなりました。

EXTERN int g_variable;
がリンクエラーを起こしたのでとりあえず行削除しておいたら
なんとかビルドできました。

EXTERN int g_variable;の意味はなんでしょうか・・?


と、思ったら。実行途中で
Debug Assertion Failed!
となりました・・・。

ソースの問題っぽいんで見直してきます・・・。
466デフォルトの名無しさん:05/01/26 22:43:27
>>456
ヘッダファイルの中に、
int hoge() {
statements;
}
のように、実際の処理を書いちゃってない?
リンカエラーを吐くということは・・・
467デフォルトの名無しさん:05/01/26 22:43:54
>434,436
遅レスだけどマジありがとう!
すげぇ助かりました!
468デフォルトの名無しさん:05/01/26 22:44:40
>>466
うぉ、思いっきり遅かった上に的外れ・・・
469デフォルトの名無しさん:05/01/26 22:44:48
>>462の書き方って、良く知らん何が悪いの?
何かの名前と競合するとか
470デフォルトの名無しさん:05/01/26 22:45:30
>>458-461
ありがとうございます。
やはり問題がおかしかったんですか。LINK先の本の紹介HPに飛んでもここには訂正が無かったので。


時々この問題集の(未知の誤爆)に悩まされてます(汗
471デフォルトの名無しさん:05/01/26 22:48:06
今から買う人間のために書名と著者をさらせ
472デフォルトの名無しさん:05/01/26 22:58:12
>>469
C/C++、プリプロセッサ、コンパイラ、リンカの仕様で
「アンダースコアで始まるシンボル」は予約されてるものがあるから。
473デフォルトの名無しさん:05/01/26 22:59:33
>>471
あなたで10000000000000000000人う財よね
474デフォルトの名無しさん:05/01/26 23:09:23
アバウトで申し訳ないんですが、

「aaa012345 145」などの文字列を
「012345145」と数字のみに変換する方法ってありますか?
ニューラインなど、エラーの原因を飛ばしたいのですが。

alnum、digitなどを調べたのですが、使い方がわかりません…。
475デフォルトの名無しさん:05/01/26 23:13:23
>474
isdigitなら別バッファに蓄える。他の文字は読み捨て。
476デフォルトの名無しさん:05/01/26 23:16:58
>>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));
}
477473:05/01/26 23:22:58
うわっ、メチャメチャ早いお答えありがとうございます!
これそのまま組み込ませて頂きます!
478デフォルトの名無しさん:05/01/26 23:40:29
#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
>>476だとs[0]が飛ばされないか
480476:05/01/26 23:53:04
あ、間違った(w
もう見てないんだろうなぁ
481デフォルトの名無しさん:05/01/26 23:55:23
>>479
禿同

>>480
477は子どものように喜んで持ってっちゃったよ
もう寝た時間だろう
482デフォルトの名無しさん:05/01/27 00:05:35
>>476のプログラムで

while (*source++)

while (*source)

に変えたら変になります。何故でしょうか。
483デフォルトの名無しさん:05/01/27 00:10:10
そりゃ同じもんずっと参照してんだから無限ループになるわな
たぶん
484デフォルトの名無しさん:05/01/27 00:10:30
すいません、どなたか教えてください。
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
そうでした。
すいません。そんなことにも気付かない自分がバカです恥ずかしいです
486デフォルトの名無しさん:05/01/27 00:11:08
while (*source) if (isdigit(*source++)) *p++ = *source;

こうでいいのかな?
487デフォルトの名無しさん:05/01/27 00:11:51
ってもう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個後ろにしても永遠に終わらないです
490デフォルトの名無しさん:05/01/27 00:14:36
>>488
全部数字ならそれでも動くよ
そっからどうしてかを考えてみろ
491デフォルトの名無しさん:05/01/27 00:18:07
sourceが止まってる
492デフォルトの名無しさん:05/01/27 00:18:19
素直にこれで。
char* extract_num(const char* source, char* dest)
{
    char* p = dest;
    while (*source)
    {
        if (isdigit(*source)) *p++ = *source;
        ++source;
    }
    *p = '\0';
    return dest;
}
493473:05/01/27 00:18:38
遅ればせながら、>>478さんありがとうございます。
頑張ります!
494473:05/01/27 00:22:20
>>492
あ、改良されてる!
ありがとうございます!
495デフォルトの名無しさん:05/01/27 00:26:11
>>492
悔しくない
496デフォルトの名無しさん:05/01/27 00:27:59
>>486だと

整数のときにsourceに+1されるけど
整数じゃない文字が出てきたら+1されずに永遠に繰り返す
497デフォルトの名無しさん:05/01/27 00:28:34
アンカーミス
>>488だた
498デフォルトの名無しさん:05/01/27 00:35:33
printf("input a\n");
scanf("%d",a);

のようなプログラムでなぜかコンソール画面に
最初のprintfの内容が表示されないんですが。
で、input aが表示されてない状態で
数値入力するとちゃんとaに数値が入って、
さらに、入力後にinput aが表示されるんですが。
どうしてですか?
↑のプログラムと実際のプログラムと、
相当違うからこれだけだとわからないかもしれませんが。
そうなったことある。とかそんなでもいいから教えてください。
499デフォルトの名無しさん:05/01/27 00:38:38
>498
とりあえず貴様はまずscanfの書式を復習してこい
500デフォルトの名無しさん:05/01/27 00:40:00
>>499
基礎が駄目ですね。

scanf("%d",&a);
501デフォルトの名無しさん:05/01/27 00:41:04
C++ だと cin の時にバッファはフラッシュされるんだがな…Cだとどうなんだろ
ぱっと見た感じでは>>498には全く問題ないように見える。
ちゃんと問題が再現するレベルにコード落とせやボケがといったところか
502デフォルトの名無しさん:05/01/27 00:42:41
なんて言うか、複雑だ。
人が作った関数を知っていることは別に重要な事でもなんでも無いんだけど、
使い方をすぐに理解できないというのは問題だと思う。
503498:05/01/27 00:50:02
>>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()関数内に&はいらないよ
505デフォルトの名無しさん:05/01/27 00:51:58
fflush(stdout)しとけば?
506デフォルトの名無しさん:05/01/27 00:53:35
>>504
禿同。コンパイラ姉さんに叱られる罠
507デフォルトの名無しさん:05/01/27 00:54:05
>>498だけを見て配列だと思える方がすごい
508498:05/01/27 00:55:45
配列じゃないッス。
509デフォルトの名無しさん:05/01/27 00:55:49
配列だと思わなくても、配列である可能性を考慮するべき。
510デフォルトの名無しさん:05/01/27 00:59:48
じゃあ配列だった場合の解決法を教えてくれよ
511デフォルトの名無しさん:05/01/27 01:06:51
まくろかもしれないisgiditのなかで++するのはあほ
512デフォルトの名無しさん:05/01/27 01:07:37
isdigitだろ!
513デフォルトの名無しさん:05/01/27 01:10:02
>>511
そんな制限あったっけ?
514デフォルトの名無しさん:05/01/27 01:16:43
souce[256]="";
while (*source) { ++source }

whileは()の評価がtrueの間だけループするものと聞く
なのでwhile(1)で無限ループとかは分かる
が、なぜsourceの先の配列をインクリメントし続けて配列の末尾に
ぶつかった時点で()内がfalseとして評価されるのかがわからんちん
助けてこんなろ
515デフォルトの名無しさん:05/01/27 01:22:38
> 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;
}
519デフォルトの名無しさん:05/01/27 01:35:13
しかし、あひゃひゃだ、世界はぷぎゃー
520デフォルトの名無しさん:05/01/27 01:36:05
手元のヘルプには確かに「このマクロは…」って書いてあるな、実装は
マクロになってないけど。C++実装においては関数で定義されていないと
std名前空間の処理がうまくいかなくなるからマクロになっていることは
ないだろう。でもここはCスレだし、実装がマクロである可能性を完全に
排除は出来ないかもしれないね。
521デフォルトの名無しさん:05/01/27 01:36:17
世界に遅れるの当たり前、読解力ないよね?
522デフォルトの名無しさん:05/01/27 01:40:57
>>514
終端のNULL文字を0、すなわちfalseとして評価した
>>515
>そんなことはない。 もしそういう動きをしたのなら、偶然そう動いただけだ。 
では他にroopを抜けた理由を説明しなさい
>>516
>さらにその後には永遠とNULLになっている 
配列の外のメモリ空間の値はOSだけが知っているため、0とは限らない。
試しに終端のNULL文字をカットしてstrlenしてみよう。
523デフォルトの名無しさん:05/01/27 01:42:24
とりあえず、インクリメント系で迷ったら
n=*pos++;
とかじゃなくて
n=*pos;
pos++;
って分けて書けば間違いない。一行一処理。
8行以内のプログラムを書けとか、制限がある訳でもないし
524デフォルトの名無しさん:05/01/27 01:47:48
roop?
525デフォルトの名無しさん:05/01/27 01:51:27
#define FREE(p) { free(p); (p) = 0; } と
#define FREE(p) do { free(p); (p) = 0; } while(0)
の二つの書き方を見るんですが、どっちの方がいいとかありますか?
526デフォルトの名無しさん:05/01/27 01:59:49
それが、簡潔なら委員だろう?
527デフォルトの名無しさん:05/01/27 02:01:26
>>525
if(p)
FREE(p)
else
FREE(q)
みたいな書き方をしてる奴にとっては問題がある。
528デフォルトの名無しさん:05/01/27 02:02:02
if(開放した方がよい)
FREE(p);
else{
処理
:
}
って時にわかるYO
529デフォルトの名無しさん:05/01/27 02:07:23
てことは do-while を使う方がいいってことですね
ありがとうございました
530デフォルトの名無しさん:05/01/27 02:31:51
しかし、あひゃひゃだ、世界はぷぎゃー
531デフォルトの名無しさん:05/01/27 07:16:13
相変わらずいつまで経っても中身の無いスレだな
532デフォルトの名無しさん:05/01/27 08:07:33
>>522
>終端のNULL文字
>roopを抜けた
>OSだけが知っている
カエレ(`・ω・´)!!

>souce[256]="";
コレが通るなら、source の型は char ** だ。
533デフォルトの名無しさん:05/01/27 08:19:18
>>532
鋭いな
534デフォルトの名無しさん:05/01/27 08:22:34
> if(開放した方がよい)

するなよ ぼけ。何度いったらわかるんだ? ぼけ

(するなら解放)
535デフォルトの名無しさん:05/01/27 08:39:46
で、○○はまだ?
536roop:05/01/27 08:46:53
roop
537デフォルトの名無しさん:05/01/27 08:47:24
>>535
正午からTVでやってんじゃん
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);
540デフォルトの名無しさん:05/01/27 12:13:38
realloc でググレ
詳しく出てくる
541デフォルトの名無しさん:05/01/27 12:13:47
>539
マニュアル
542デフォルトの名無しさん:05/01/27 12:14:46
すいません、ヘルプに書いてありました。
失敗した場合元のメモリには何もしないそうです。
どっちにしろ失敗すると困るんですけど。
543デフォルトの名無しさん:05/01/27 12:19:42
>>539
頭を使おう。
orgmemは元の領域を指したままだから、失敗したときには解放する必要がある。
その点に注意すればrealloc()を使わない理由はない。
失敗したら元の領域だけでやりくりするのなら、
newmem = realloc(orgmem, newsize);
if (newmem == NULL) {
newmem = orgmem;
// 異常終了にしたいなら free(orgmem)してexit(EXIT_FAILURE);など
}
でいい。
544デフォルトの名無しさん:05/01/27 12:20:18
>>542
失敗したら困るのはmalloc()でも同じだろ。
545デフォルトの名無しさん:05/01/27 12:30:09
realloc(orgmem,0)は動作的に、結局freeとおなじなんですか?
546デフォルトの名無しさん:05/01/27 12:34:05
いいえ。
547デフォルトの名無しさん:05/01/27 12:35:49
解放するって明記されてますヨ?
548デフォルトの名無しさん:05/01/27 12:46:50
どこがどう違うのか説明できる人いませんか!!?
549デフォルトの名無しさん:05/01/27 12:49:21
>548
細かい仕様は環境による。
私に説明責任はない
550デフォルトの名無しさん:05/01/27 12:51:10
>>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
リンクしろ
557デフォルトの名無しさん:05/01/27 14:59:34
まともな回答を期待しちゃいけないスレです
558デフォルトの名無しさん:05/01/27 15:19:29
なんか荒れ気味で恐縮ですが、質問です。
未定義とか、未規定のこと考えてたら、頭がこんがらがってきました。
教えてください。
i = c >= 0x81 && c <= 0x9f || c >= 0xe0 && c <= 0xfc
っていうのは、問題ないですか?
評価順序にも問題なさそうですし、副作用もないんですよね。
559デフォルトの名無しさん:05/01/27 15:21:23
i = の周りがあいまいな感じがする。
560デフォルトの名無しさん:05/01/27 15:21:27
>>558
i, cの型によっては問題。

>>551
宿題なら宿題スレに。
そも、逐次型とはなんじゃいな。
561デフォルトの名無しさん:05/01/27 15:31:12
型も影響しちゃうのですか なんだか僕にはややこしいです。
レスありがとうございました。
562デフォルトの名無しさん:05/01/27 15:33:55
>>561
君はそれで納得したのか?!
563デフォルトの名無しさん:05/01/27 15:39:13
>560
10進数の15を例にとると
1000
1100
1110
1111ってな感じに順にしていくのを逐次型っていうらしいです。
564デフォルトの名無しさん:05/01/27 15:41:57
>>563
ようするにNビット目が立っていたら2 ^ Nを足すという作業の繰り返しでやれというわけだな。
565デフォルトの名無しさん:05/01/27 15:42:39
>>563
その上位から順に見ていくので、二で割る以外に何か求める方法あるかねぇ
・・・二で割るとどうなるか考えたか?
566デフォルトの名無しさん:05/01/27 15:43:49
めんどいな、もう!
>438
567デフォルトの名無しさん:05/01/27 15:48:04
変なやり方を強制するうるさい出題者だな
for(i=0;i<?;i++){
b=(1<<(?-i));
...
568デフォルトの名無しさん:05/01/27 15:49:20
for(i=15;i>0;i--)if(x & 1 << i )printf("1");else printf("0");
569デフォルトの名無しさん:05/01/27 15:52:24
あ、まちがった。まあいいや。
570デフォルトの名無しさん:05/01/27 15:52:43
>565
2で割っても求められねぇだろがあほ
571デフォルトの名無しさん:05/01/27 15:53:27
とりあえず詳しい説明載せときます
http://ec.uuhp.com/~physics2/cgi-bin/upload250/NeoKiffg/report2.pdf
2で割ることはまだ考えてないです
572デフォルトの名無しさん:05/01/27 15:55:55
>>571
最初からそれを出せや!この馬鹿野郎!!!
573デフォルトの名無しさん:05/01/27 16:02:00
逐次「比較」型だね
574デフォルトの名無しさん:05/01/27 16:05:31
2.この結果を元にして、マイクロプロセッサを利用
した16bit逐次比較型AD変換器のハードウェアを
考えると共に、
575デフォルトの名無しさん:05/01/27 16:09:41
解き方の指針とかないですか?
576デフォルトの名無しさん:05/01/27 16:14:07
>>558
i = (0 または 1 になる評価結果);
を意図してるなら、特に問題なし。
(c が signed char だったら意図した通りには
 動かないかも知れんが、それは別問題)

>>571
課題はスレ違い。いい加減理解しろ。
577デフォルトの名無しさん:05/01/27 16:14:51
578デフォルトの名無しさん:05/01/27 16:15:07
ハードウェアの動作原理に従って、ってんだから、
単なるビットマスクじゃ詰まらんね
579デフォルトの名無しさん:05/01/27 16:38:07
>>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
解決してないよ@@
583デフォルトの名無しさん:05/01/27 17:34:46
>>580
うむ。もう来るなよ。
584デフォルトの名無しさん:05/01/27 17:52:09
2次元以上の配列を関数に渡すときに配列の要素数が決まってない場合はどうやって渡せばいいんでしょうか?
1次元に直してから渡すしかないんでしょうか?
585デフォルトの名無しさん:05/01/27 17:59:10
>584
二重のポインタにするか、一次元に展開するかは状況による。
いずれの場合も配列の長さが不定ならばどこかで渡さないと逝けない。
展開には費用がかかる。
586デフォルトの名無しさん:05/01/27 19:59:43
>>584
その配列の先頭を指すポインタ(のポインタの…)を渡せばいいじゃない。
void hoyoyo(int*** ayaya);
int a[10][10][10];

hoyoyo(a);
587デフォルトの名無しさん:05/01/27 20:03:33
>>586はアホ
int a[10][10][10][10];

int f(int* a) { ... }
f(&a[0][0][0][0]);
588デフォルトの名無しさん:05/01/27 20:05:21
ところで、ポインタ渡したいの?
589デフォルトの名無しさん:05/01/27 20:10:13
FOR命令を使用して九九の表を作成するプログラムを作成しる!演算結果を二次元配列に格納してから出力すること!
という問題があるのですがサンプルとしてプログラムのソースを書いていただけないでしょうか。お願い致します。
590デフォルトの名無しさん:05/01/27 20:11:40
C言語では無理。
591デフォルトの名無しさん:05/01/27 20:12:50
確かに。他をあたってくれ
592デフォルトの名無しさん:05/01/27 20:15:31
>>590
FOR命令を作ればいいじゃん。
593589:05/01/27 20:16:24
まじですかorz
どの部分が実現できないのでしょうか。
594デフォルトの名無しさん:05/01/27 20:20:05
>>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;
}
595デフォルトの名無しさん:05/01/27 20:22:33
#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;
}
596デフォルトの名無しさん:05/01/27 20:24:00
いったん配列に入れないとダメなのね。
597デフォルトの名無しさん:05/01/27 20:24:41
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
598589:05/01/27 20:25:36
うわぁ皆さん本当にありがとうございます!
599デフォルトの名無しさん:05/01/27 20:26:04
>>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;
}
600デフォルトの名無しさん:05/01/27 20:26:23
ネタを楽しめない香具師って最悪な
601デフォルトの名無しさん:05/01/27 20:41:11
>>587
おまえもアホ
要素数が決まってないのにそんなコード書くな

int *a(int, int, int, int);

int f(int* a) { ... }
f(a(0, 0, 0, 0));
602デフォルトの名無しさん:05/01/27 20:41:31
>>587
一応渡ってることは渡ってるんだが、配列のサイズが固定じゃない限りそれじゃ使いようがないと思う。
603デフォルトの名無しさん:05/01/27 20:42:05
>>589
宿題スレで全く同じ問題を解いたよ。そっちで探せ。
604デフォルトの名無しさん:05/01/27 21:32:37
宜しくどうぞ。
char buf[] = "hello";
sscanf(buf, "%d", &n);
のように、文字をむりやりint型の整数値に変換すると
ボーランドでは1
マイクロソフトのコンパイラでは4198947
が代入されます。
これは仕様ですか?
ちなみに数字以外の文字列だと同じ結果が得られますが
問題ありませんか?
605デフォルトの名無しさん:05/01/27 21:36:11
>>604
その数になるのは単なる偶然、適当にそうなった。あえて言うとすれば仕様なんだろうな。
それとその文脈で代入という言葉を使うのはおかしい。正しくは表示とか出力とかだ。
606デフォルトの名無しさん:05/01/27 21:41:17
>>604
scanfの返り値は確認してるのか?
変換は行なわれてなくて、たんに初期化されてない変数の値が1とかだったんじゃないの?
607605:05/01/27 21:43:25
sscanfがprintfに見えた……
OTL
608デフォルトの名無しさん:05/01/27 21:44:20
>>604
今、実験コード書いてボーランドのコンパイラで試してみたけど、
変数宣言時に初期化してれば、1なんて出ることは無い。
よって自分も>>606に同意
609デフォルトの名無しさん:05/01/27 21:44:25
>>604
そもそもnってなんだよ。型くらい書けよボケ茄子
610604:05/01/27 21:46:54
>>605
レス有難うございます。勉強になりました。
・コンパイラにより、実行する毎に数は異なり、決まってない。
・どんな文字列でも文字列→数字だと出力結果は同じ。
でよろしいでしょうか。
bccが1と言う綺麗な数字を出力したので気になりました。
611デフォルトの名無しさん:05/01/27 21:48:46
int型って書いてあるだろw
612デフォルトの名無しさん:05/01/27 21:50:44
>>610
そんなことsscanfのマニュアル読めば書いてある
ここで質問すること自体釣り
613デフォルトの名無しさん:05/01/27 21:51:50
>>611は近年稀に見るバカ
614デフォルトの名無しさん:05/01/27 21:52:33
>>613は近年稀に見るバカ
615604:05/01/27 21:53:56
嫌、釣りじゃなく俺が馬k(ry)
もう一回試します。
もしかして、また来たら
厳しく相談に乗ってください
616デフォルトの名無しさん:05/01/27 21:55:00
617デフォルトの名無しさん:05/01/27 21:56:09
>>615
何をどう試すの?いくらそのコードを試したところでなんも意味ないよ?
そういうコードでのsscanfの動作は、「定義されない」とはっきり書かれてるんだよ。
618デフォルトの名無しさん:05/01/27 21:59:33
>>608
変換に失敗したとき、受け側の変数の元の値は保証されるのか?
いちおう釘さしとくが、保証され「た」のかとは聞いていない
619604:05/01/27 22:02:22
うん、sscanfの戻り値確認したら0だった・・・・・・

>>613>>614
その馬鹿レス、俺が受け止めました。
>>ALL
ごめんなさい。
620デフォルトの名無しさん:05/01/27 22:05:39
分かったからもう来んな
621デフォルトの名無しさん:05/01/27 23:17:01
関数内関数ってできますか?
622デフォルトの名無しさん:05/01/27 23:17:53
できません、標準では。gccの拡張では出来たような(記憶が確かでない)
623sage: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が二重になったとたん頭こんがらがってしまうんです。
どなたかご教授お願いいたします。
624デフォルトの名無しさん:05/01/27 23:23:12
すいません。名前sageにしてしまいました・・・欝
625デフォルトの名無しさん:05/01/27 23:23:36
「R回の繰り返し」のR回の繰り返し
626デフォルトの名無しさん:05/01/27 23:26:37
>>623
そのまま図に置き換えて考えてみるといいかも。
具体的には、iを縦方向、jを横方向、と
二次元くらいなら視覚的に把握できるでしょ
627デフォルトの名無しさん:05/01/27 23:28:44
>>622
できたよー にゃんにゃん
int hoyoyo(int ayaya) {
int nyonyo(int nahaha) {
return nahaha * nahaha;
}

return nyonyo(ayaya);
}
628デフォルトの名無しさん:05/01/27 23:34:41
>>627
まじっすか?
629623:05/01/27 23:42:59
>>626
図に置き換えるってどんな感じですか?
なんか、わかりそうでわからない・・
630デフォルトの名無しさん:05/01/27 23:46:52
>>629
おまえさん、かけ算99を2の段から9の段まで通しで言うとき
頭で数えているものはいくつある?
631デフォルトの名無しさん:05/01/27 23:56:16
数直線です
1−−−−10−−−−20−。。。。。99
632623:05/01/27 23:58:54
>>630
ん!?
2の段のはじめが2でそれに2づつ加える
3の段の〜〜〜
4の段の〜〜〜
・・・・
・・・・
っていくと全部の段のはじめだけを頭で数えてるってことは8個?

それともただ単に9*8で72回頭で数えてる?
633デフォルトの名無しさん:05/01/28 00:01:38
掛け算より足し算のほうが速いですが?
634デフォルトの名無しさん:05/01/28 00:02:51
>>628
でもGCCだけだよー これ、アブノーマルなの…
それでね、gcc -S hoge.cやって見てみたの。
そうしたら、最適化されて、外部に関数を置いたのとほとんど同じになったのー。
635623:05/01/28 00:02:51
kakezan no houga hayaidesune...
636デフォルトの名無しさん:05/01/28 00:03:06
そうとはかぎらんよ
637デフォルトの名無しさん:05/01/28 00:14:03
逆行列を求めるプログラムは?
638デフォルトの名無しさん:05/01/28 00:14:35
> 最適化されて、外部に関数を置いたのとほとんど同じになったのー。
それでいいんじゃないの?
要するに、もう一個スコープ重ねられるから楽に設計できる場合があるってだけでしょ。
639デフォルトの名無しさん:05/01/28 00:15:16
>>637
宿題スレ or 数値計算スレへ。
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");
}

}
641デフォルトの名無しさん:05/01/28 01:06:18
>>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されることをエラーとするためにやってるのはなんとなく分りましたが、
その他にはどんな意味がありますか?
643デフォルトの名無しさん:05/01/28 06:13:10
#ifdefで判定しているソースに支障が出ないようにするため
だと思う
644デフォルトの名無しさん:05/01/28 06:22:28
>>643
あー、なるほど。enumと#define、どっちで定義されていても
OKなようになっているわけですね。
#define AIO_CANCELED 0
#define AIO_NOTCANCELED 1
#define AIO_ALLDONE 2
こうなっていることを想定したソースでも通用するようになっていると。
645デフォルトの名無しさん:05/01/28 07:34:09
int printf2(const char* format , ...){
return printf(format,...);
}

このようなことをしたいのですが無理でしょうか?
646デフォルトの名無しさん:05/01/28 07:58:01
vprintf
647デフォルトの名無しさん:05/01/28 09:35:12
>>646
ありがとうございました。
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進数に戻したいです。
653デフォルトの名無しさん:05/01/28 12:01:00
宿題は宿題スレへ
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
知人がありがとうって
657デフォルトの名無しさん:05/01/28 12:24:48
>>655
僕もありがとう
658デフォルトの名無しさん:05/01/28 12:46:18
>>652
具体例を挙げよ。
#ビット数分の2進数ってなんだろ。
659デフォルトの名無しさん:05/01/28 12:48:13
>650
多重投稿のため放置推奨
660デフォルトの名無しさん:05/01/28 13:18:25
sort -n
661デフォルトの名無しさん:05/01/28 13:20:58
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
さっきはごめんなさい。調子に乗りすぎました。
よろしくお願いいたします.
ぴとーより
664デフォルトの名無しさん:05/01/28 13:52:33
自信満々にスレ違いか。
665ピトー:05/01/28 13:57:03
できなくて困ってます.
お願いします。
666デフォルトの名無しさん:05/01/28 14:03:24
俺は困ってない。困っている人は、俺の周りに誰もいない。

世の中の人の中で、99.9999999%以上は困っていないんだから
これはもう、

  「誰も困ってない」

と言い切ってしまって良い。
667ピトー:05/01/28 14:10:43
お願いします.助けてください.
668デフォルトの名無しさん:05/01/28 14:17:10
スレ違いの上、>>1や直前にある>>653も読まないような奴が単位をとれなくても
俺は平気です。
669デフォルトの名無しさん:05/01/28 14:29:15
ある特定のCRC32ハッシュと同じになる文字列を総当りで見つけるには
どんなプログラムを組めばいいのですか?
具体的に書くとCRC32が「fecd71de」になる文字列を探しています。
文字数は5〜8文字で探しています。
C言語の達人様、ソースをご教授ください。お願いいたします。m(_ _)m
670ピトー:05/01/28 14:32:51
お前等パソコン相手でしか性欲処理できねーんだろ!!!!
きもい…
671デフォルトの名無しさん:05/01/28 14:34:00
>>669
総当たりだったら簡単じゃない。自分で組みなよ。
672デフォルトの名無しさん:05/01/28 14:36:03
>669
n進数の繰り上がり
673デフォルトの名無しさん:05/01/28 14:42:08
やあ、ぴとー。お前、学校でも会ったよな。オレだよ、オレ。あの一番背の高い。

その問題はforループで折れ線を滑らかに描くだけだゼ。
674デフォルトの名無しさん:05/01/28 14:45:34
ぴとーよ、オレが分からないのか?
675C言語超初心者:05/01/28 14:47:16
>671
自分では何一つ組めません。超初心者なんです。
ネットでさんざん検索しましたが、
私に理解できるようなものではないと思いました。
ここに書き込みしたのは最後の手段との思いです。
書き込み自体が間違いだったのでしょうか?
>672
>n進数の繰り上がり
レスありがとう御座います。
私にはさっぱり分からない事ですが、
みなさんにとっては簡単な事なんでしょうね。
他をあたってみます。ありがとう御座いました。m(_ _)m
676ピートー:05/01/28 14:50:46
解決しました
677デフォルトの名無しさん:05/01/28 14:51:06
>>675
バイバイ。良い週末を。
678デフォルトの名無しさん:05/01/28 15:32:43
>>675
そこまでやることがわかっていてコードが組めないんじゃ、キミには無
理だよ。もし完全なソースをよこせっていうんなら、お金払って人を雇
いなさい。
もし何かの課題だったら、落第すべき。

679デフォルトの名無しさん:05/01/28 17:03:10
全ビット反転じゃなくて、
任意の1ビットを反転させるには
どうしたらよいですか?
680デフォルトの名無しさん:05/01/28 17:04:45
>679
n ^ (1<<i)
681デフォルトの名無しさん:05/01/28 17:30:43
>>680
有賀党
682デフォルトの名無しさん:05/01/28 17:53:23
自作の関数で、可変個の引数をそのまま別の関数に渡したいのですが、
その別の関数の可変個引数がprintf形式でないため、va_listでは対応できません。
マクロ用には __VA_ARGS__ というのがあるのが分かったのですが、同じ事を
関数でやる方法はありませんか?
683デフォルトの名無しさん:05/01/28 17:59:17
>682
printf形式でないとは?
__cdecl __pascal
684682: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;
}
685デフォルトの名無しさん:05/01/28 18:29:31
>>682
Cの範囲では、そのままの要求はムリだと思った。

いちばんまっとうな対処は、「別の関数」に va_list を引数にするバー
ジョンを新設してもらうことだけど。(printf と vprintf のように)

686682: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>の内部を見たり、その何とかマクロを調査して。
688682:05/01/28 19:00:36
>>685
やはりだめそうですか。va_list版を新設してもらうは不可能なので
なんとか上記の例のSomeAPIを使う形にしたいのですが。
>>687
すいません、__cdecl、stdargs.h というのは無知なんですが
(Windowsの話かな?当方MacOS Xです)
互換性は比較的どうでもいいのですが、>>686に書いた、1つ目の引数を
渡すという方法が保証されている方法かどうなのかが気になっています。
689デフォルトの名無しさん:05/01/28 19:07:33
>>688
コンパイラのオプションまで含めて、互換性が無いと思われ。
アセンブラ出力を眺めてご覧。如何に微妙な状態かわかるから。
690デフォルトの名無しさん:05/01/28 19:18:28
>>686
全く保証されていない。
たまたま動作しているに過ぎない。

C 標準ではお望みの動作は不可能だ。
691デフォルトの名無しさん:05/01/28 19:22:56
少し前に、同じ質問があったよ。
まあ、その時も「va_list形式を作れよ」「何の意味があるの」としか
答えられない人ばかりだったけど。

で、互換性その他を無視して良いなら、想定される引数に対して充分なサイズの構造体を引数扱いにして
それをそのまま渡せば何とかなるかもしれない、と。
ちょっと過去ログ探してみる。
692デフォルトの名無しさん:05/01/28 19:29:32
こんな感じだった。
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を渡しても良いかも。
693デフォルトの名無しさん:05/01/28 19:30:02
*(type*)(void*)&varでも、馬鹿なコンパイラに最適化されると怖いからな
694682:05/01/28 19:50:40
>>692
確かにその方法で望ましく動きます。ありがとうございました。

ただ1つ疑問なんですが、va_argの2番目の引数で指定したサイズが、
myprintfの引数に対してすごく大きいと、不正なメモリアクセスになる
可能性はないんでしょうか?
695682:05/01/28 19:53:55
あ、先頭のアドレスを渡しているだけだから大丈夫ですね。失礼しました。
皆さんありがとうございました。
696デフォルトの名無しさん:05/01/28 20:06:05
大丈夫じゃないよ。
まあ、普通はmain()に入る前にもスタック使ってる上、mainの引数もあるし
リターンアドレスやフレームポインタ等でそこそこは余裕があるけど
256byteもあるとは思わない方がよい。
大きいと無駄なコピーになるだけだし、必要最小限のサイズで。

それと、鼻から悪魔が出ても文句を言えないような使い方なんだから
くれぐれも注意して、何が起こっても泣かないように。
特に、引数にパディングが入らないか確認すること。
697682:05/01/28 20:30:58
...や、やっぱりそうですよね(←優柔不断だな)
安全な方法はなさそうなので、
>>686に書いた __VA_ARGS__ 使ってマクロでなんとかします。
ありがとうございました。
698デフォルトの名無しさん:05/01/28 20:48:38
>>682
まずは、
>va_list版を新設してもらうは不可能なので

>これをラップした関数SomeAPIWrapを作りたいんです
の原因を、もう一度考え直すほうが賢明だと思う。
699682: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,
...
)

で、この関数に渡す値は可変個の部分以外は決まりきった値の場合が多いので、
ラップして簡素な関数にしようと思った次第です。
700デフォルトの名無しさん:05/01/28 21:20:30
>>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
701デフォルトの名無しさん:05/01/28 21:22:19
>>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;
}
703デフォルトの名無しさん:05/01/28 21:44:35
>>702
>どこを直せばいいのか、指摘していただきたいです。

atolを使わない。
704デフォルトの名無しさん:05/01/28 23:14:46
宿題
「30のファクトリアル(30!=1*2.29*30)を計算できるプログラム。」
intやlong型では桁数が不足しますし、double型では計算精度が足りない
のでどうすればよいのか分かりません。
配列などをどう利用すればよいのでしょうか?
お願いします。
705デフォルトの名無しさん:05/01/28 23:24:44
>>704 多倍長演算 でググれ
706デフォルトの名無しさん:05/01/28 23:28:29
>>704
あんたの脳内計算は何桁?
707デフォルトの名無しさん:05/01/28 23:50:43
>>1
708デフォルトの名無しさん:05/01/29 00:01:43
右に1ビットシフトのことかー!
709デフォルトの名無しさん:05/01/29 00:05:45
(*b) ++ はどう展開されるんですか?
(*b) = (*b) + 1 でいいのでしょうか?
710デフォルトの名無しさん:05/01/29 00:11:31
>>709
はい。
711デフォルトの名無しさん:05/01/29 00:25:21
UNIX オフ
UNIXや最新技術に興味のある人や
プログラマー・SEになりたい人・業界に興味のある人あつまれ!
http://off3.2ch.net/test/read.cgi/offevent/1105369044/
712デフォルトの名無しさん:05/01/29 01:01:18
>>702
なぜ故に sscanf() を使わない?
713デフォルトの名無しさん:05/01/29 01:05:56
> 具体的に書くとCRC32が「fecd71de」になる文字列を探しています。

このソースのまわりに1つループ追加するだけだ。
http://www.vector.co.jp/soft/dos/util/se000791.html
714デフォルトの名無しさん:05/01/29 01:13:58
>>713
>>669 は CRC32 自体が判っていないヨカーン
715デフォルトの名無しさん:05/01/29 02:40:14
Visual C++を使っています。
複素数を含んだ双曲関数(sinh,cosh,tanh)の計算をしたいのですが、どのようにしたらようでしょうか?何かアイディアがあればお願いします。
ヘッダファイルを用い、複素数の和、差、積、商、平方根、絶対値、指数関数については定義済みで、動作確認もされています。
716デフォルトの名無しさん:05/01/29 02:44:40
>>715
マルチすなや。おまけにスレ違いか?
717715:05/01/29 02:54:52
すみませんでした。
この書き込みは無視してください。
718デフォルトの名無しさん:05/01/29 04:54:40
Cで, 構造体のグローバル変数をファイルスコープにすることはできますか.
static struct{
hogehoge...
}Hoge;
みたいな感じにしてもファイルスコープならん様なのです...
719デフォルトの名無しさん:05/01/29 05:01:42
>マルチすなや

じゃ、クロスしろとでも? おまえやってみろよ
720デフォルトの名無しさん:05/01/29 07:33:53
>>719
お前の話はつまらん
721デフォルトの名無しさん:05/01/29 08:43:16
>>719
ハチャー
722デフォルトの名無しさん:05/01/29 08:52:30
>>719
おまえうるせーよ
723デフォルトの名無しさん:05/01/29 08:59:25
>>719
ぬるぽ
724デフォルトの名無しさん:05/01/29 10:17:39
>>719
ガッ!
725デフォルトの名無しさん:05/01/29 10:24:58
外部変数の「宣言」と「定義」の違いがわかりません。

extern int a; // 宣言
int a = 3; // 定義
extern int a = 3; // warningは出るけど定義

記憶クラスを指定しない=外部変数の定義と考えて合ってますか?
(でもstaticはつけても定義だしなぁ……)
726デフォルトの名無しさん:05/01/29 10:29:25
>>725
static変数は外部変数とは言わない。
727デフォルトの名無しさん:05/01/29 11:08:57
年収いくらですか?
728デフォルトの名無しさん:05/01/29 11:22:13
10000000000000000000000000円
729デフォルトの名無しさん:05/01/29 11:28:21
>>728
千兆万円ですね。
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
>>713そのソース、あってるのか?
732デフォルトの名無しさん:05/01/29 12:47:41
>>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桁表示しても問題ないのでしょうか?
735デフォルトの名無しさん:05/01/29 13:03:57
>>734
基本情報技術だとかソフトウェア開発とかの本が売ってるから、買って来い
736デフォルトの名無しさん:05/01/29 13:13:29
>>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もだめすぎ
こんな簡単なプログラムのバグも指摘できんのかよ。
しかも、わからないくせに文句だけはいってるし
741デフォルトの名無しさん:05/01/29 13:26:06
>>740
と開き直ったところで、スレ違いの我侭は通りません。
742730:05/01/29 13:26:26
分かりました。
一度目の呼び出ししか意図した動作をしないんですね。

>>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がいきるんだよ ぼけ
749デフォルトの名無しさん:05/01/29 13:59:19
ループでいいじゃん。
750デフォルトの名無しさん:05/01/29 14:00:30
∧ ∧
(*゚ー゚) <ネコミミモード神山満月デース?
http://comics-news.shueisha.co.jp/common/fullmoon/img/fullmonn.swf
751デフォルトの名無しさん:05/01/29 14:10:58
> ループでいいじゃん。

やーい、再帰もできないやつ
752デフォルトの名無しさん:05/01/29 14:12:33
744にはにせもの!

本当に先生にならっている学生だったら、
月曜日もkusakabe先生が東京出張中だということを知らないわけない!

本物の学生より
753デフォルトの名無しさん:05/01/29 14:15:49
もれならこうする
{
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回ずつ呼ぶのはださいなあ。
755デフォルトの名無しさん:05/01/29 14:21:47
>754

関数にパラメータ追加する方がダサイ
756753:05/01/29 14:24:30
んじゃ、こう汁!
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;
  }
}
761デフォルトの名無しさん:05/01/29 14:50:55
もし仮に本人がそう書くのだとしたら、私に指摘された癖が治ってないんだなぁ。
762デフォルトの名無しさん:05/01/29 14:54:36
とかかいておけばさもそういうクセが存在するかのように思わせることができると思い込むテスト
763 ◆utqnf46htc :05/01/29 15:00:58
こんにちは
764デフォルトの名無しさん:05/01/29 15:13:34
はい、さようなら
765デフォルトの名無しさん:05/01/29 15:40:09
構造体使え。
766デフォルトの名無しさん:05/01/29 15:41:13
つかうなよぼけ
767デフォルトの名無しさん:05/01/29 16:22:26
/* */ のコメントが所々に沢山あります。
だから /* /* */ */ ってやっても、全体がコメントアウトしてくれません。
なにか良い方法はないですか?
768デフォルトの名無しさん:05/01/29 16:25:26
>>767
#ifdef
#endif
769デフォルトの名無しさん:05/01/29 16:29:47
#if 0
#endif
770デフォルトの名無しさん:05/01/29 16:33:50
'a,'bs/^/\/\//
これがいちばん合理的(#ifや#ifdefより
771デフォルトの名無しさん:05/01/29 16:41:38
どうもありがとうございました。(*- -)(*_ _)ペコリ
772デフォルトの名無しさん:05/01/29 19:03:34
>>747
static が抱えている本質的な問題点に気づいていないヒヨッ子は黙ってな
今回のような超のつく典型例に反応しない壊れたセンサーを全世界に自慢しなくていいよ
773デフォルトの名無しさん:05/01/29 19:17:48
>>772
>static が抱えている本質的な問題点
これマジでわからない。教えてもらえると助かる。

関数のスコープを抜けても死なない、その関数でしか使用しないデータがあった場合、
(1)モジュールレベルの変数で保持するようにする(2)関数内でstaticで宣言する
の2つが考えられるが、構造化の本義からいっても実際の経験上も
(2)の方が優れた方法に思えるんだけど。

C#でstatic削除されていることと関係あるのか?
774デフォルトの名無しさん:05/01/29 19:23:11
よーわからんけどスレッドのこと?
前者が Thread-specific-strage で後者はスレッドセーフでないとか?
全然見当違いのこと言ってたらスマソ
775デフォルトの名無しさん:05/01/29 19:26:21
>モジュールレベル

なんだいそりゃ?
776デフォルトの名無しさん:05/01/29 20:00:14
> 関数のスコープを抜けても死なない
死んでも大丈夫なようにしろ。
777デフォルトの名無しさん:05/01/29 20:16:04
reverseって文字列を逆順にしてるだけ?
再帰なんてつかわんだろ。
778デフォルトの名無しさん:05/01/29 20:22:51
いま作ってるプログラムでは、ファイル名を入力して
ファイルを読み込むようにしてるんですが、
フォルダを指定したら指定したフォルダ内にある
すべてのファイル同じ処理をするというようにしたいんです。
どういう命令を使えばいいですか?
779デフォルトの名無しさん:05/01/29 20:25:28
>>778
スレ違いです
環境をきちんと書くように心がけ、適当なスレへ移ってください
780デフォルトの名無しさん:05/01/29 22:13:24
せんせー、変数の宣言って処理速度に影響します?
781デフォルトの名無しさん:05/01/29 22:14:42
数‰は
782デフォルトの名無しさん:05/01/29 22:16:02
短い数行の共通処理。
マクロにするか関数にするかは
どのへんが決め手ですか
783デフォルトの名無しさん:05/01/29 22:21:14
色々あって書くのがメンドイ
inline が使える環境かどうかでも変わってくるし
784デフォルトの名無しさん:05/01/29 22:23:05
そんな心配するより、正しく動くプログラム作れよ、ボケ
785デフォルトの名無しさん:05/01/29 22:27:40
.NETとCはどっちが優れてるんですか?
786デフォルトの名無しさん:05/01/29 22:36:25
ファイルのランダムアクセスするプログラム作って
その入出力時間測りたいんですが、時間測るには
どうすればよいですか?
787デフォルトの名無しさん:05/01/29 22:45:36
>>786
環境書け
Win なら timeGetTime
788デフォルトの名無しさん:05/01/29 22:45:52
>>786
clock()を処理前後で呼び、その差を処理に要した時間とする。
ちなみにそれをCLOCKS_PER_SECで割ると秒単位の数にできる。
789デフォルトの名無しさん:05/01/29 22:55:19
>>777
普通は使わんな。大学の課題で再帰を教える場合とかで無ければ
(俺は、再帰の課題でやらされた。しかも、その関数の呼び出し方まで指定されてて、グローバル変数まで使わされた…意味不明な課題)
790デフォルトの名無しさん:05/01/29 23:10:26
リカーシブ、リエントラント、かなり重要な方法だが?
791デフォルトの名無しさん:05/01/29 23:21:12
かなり重要な方法だが、より良い方法があればそれを使うべき。
再帰を使わないと構造が非常に複雑になるなどの問題が生じる
場合以外においては使うべきではなかろう。その点ではこのような
課題はセンター試験のようなもの(役に立たない誘導)。
792デフォルトの名無しさん:05/01/29 23:30:02
なんで? 再帰のレベルをチェックするリミッターを実装すれば
スタックの見積もりにおいて非再帰と何も違わんぞ??
793デフォルトの名無しさん:05/01/29 23:34:37
再帰しなかったら、OS大変だねw
794デフォルトの名無しさん:05/01/29 23:35:05
二分探索法とかは明らかに再帰で書いたほうがみやすいよね
795デフォルトの名無しさん:05/01/29 23:38:28
逆順に表示させる意味がわからない。
796デフォルトの名無しさん:05/01/29 23:40:37
>>791
中身空っぽの文章の典型。
要するに最善の方法を選択しましょう、って
そんなことは当たり前じゃないか。

ところで>>772はどこに言った?
結局知ったか言い逃げの学生さんだったのか?
797デフォルトの名無しさん:05/01/29 23:43:45
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)
799デフォルトの名無しさん:05/01/29 23:47:10
#define STRLEN(s) (sizeof(s)-1)
800デフォルトの名無しさん:05/01/29 23:48:40
>>798なんでstrlen使いたくないのかわからないが無いと思うぞ
801デフォルトの名無しさん:05/01/29 23:49:30
>>797
char == signed char になるか
char == unsigned char になるかは
implementation defined であるため
strictly conforming program はどちらにも依存してはならない
802デフォルトの名無しさん:05/01/29 23:51:35
>>795
どうせ学校の課題でしょ。

文字列逆にするだけなら、再帰なんて面倒なもの使う必要ないと思うけどな…
(再帰そのものが面倒というより、文字列を逆にする場合には通常の方法より面倒…と個人的に判断。
再帰使った方が楽なら、再帰使う事で問題が起きないならそっち使えば良い。)
803デフォルトの名無しさん:05/01/29 23:52:09
関数の宣言を関数の中にかけるのは何か意味あるんですか?

int func() {
  int func2();
  return func2();
}
804デフォルトの名無しさん:05/01/29 23:54:23
いろんなプログラムを見ると 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 では構わないスタンスであることを表明するから
それを考慮の上でそちらのアクションを選択されたい
806デフォルトの名無しさん:05/01/29 23:58:09
>>796
C言語で文字列を逆順にするのに最適な方法として再帰を推す奴には
いろんな問題がありそうだけど。
807デフォルトの名無しさん:05/01/29 23:59:14
#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
>実際の所は、俺は知らん

ま、あれだな。氏ね
809デフォルトの名無しさん:05/01/30 00:02:34
int atoi(char *)の反対をやってくれる関数はないんでしょうか
char *itoa(int)みたいな
810デフォルトの名無しさん:05/01/30 00:02:59
質問します
文字列から指定した文字をカウントする関数はありますか?
また関数がないなら普通はどのようにしてカウントするのでしょうか?
811デフォルトの名無しさん:05/01/30 00:04:26
>>809
sprintf
812デフォルトの名無しさん:05/01/30 00:07:39
ジェネリックな結果を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のマニュアルを読んでも良く理解でき
ませんでした。
813デフォルトの名無しさん:05/01/30 00:09:55
>>810

int CountChar(const char *string, char ch)
{
 char *p;
 int count = 0;

 for (p = string; *p; p++) {
  if (*p == ch) {
   count++;
  }
 }

 return count;
}
814デフォルトの名無しさん:05/01/30 00:10:30
#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);
815デフォルトの名無しさん:05/01/30 00:12:13
>>814
> itoaって、bccだと使えるな
マジかよ…
816デフォルトの名無しさん:05/01/30 00:12:43
>>804
int main(void)またはint main(int argc, char *argv[])のいずれかと
compatibleか、implementation-definedな形式。だから、コンパイラが
受け付けさえしてくれればそのどれでも構わないよ。int main(void)と
int main(int argc, char *argv[])ならどれでも受け付けてくれるはず。
ちなみに余談だが、argvは変更可能でなければならないから、内容を
変更しても構わないし、constを付ける必要もない(付けても良い)。
817デフォルトの名無しさん:05/01/30 00:15:13
itoaは、大抵の環境では定義されているかもしれないけれども、ANSI Cには
入っていないので、プログラムをgeneralなものにしたければ使わないほうが
良いかもね。
818デフォルトの名無しさん:05/01/30 00:16:06
しつもんです。
fprintfでファイルを更新したい思っています
ファイル内容が

山田さん
佐藤ちゃま
鈴木

のとき佐藤と鈴木の間に加藤を挿入したいのですが、これは不可能なのですか?

お願いします
819デフォルトの名無しさん:05/01/30 00:16:41
>>815
昔、atoiがあるならitoaもあるだろって、適当に引数調べながら使った事ある。
で、一応ヘッダ検索してみたら見つかった定義が814。
(大学の課題を家でやってる時に使ったけど、大学のgccでは使えなかったため、別方法に変えて提出…)
820デフォルトの名無しさん:05/01/30 00:17:04
>>818
C-FAQのどこかに書いてた気がする。
821デフォルトの名無しさん:05/01/30 00:17:15
>>818
不可能です
822デフォルトの名無しさん:05/01/30 00:17:59
質問です 日付を"20050130"のような形で取得するにはどうしたらいいでしょうか?
誰か教えて下さい
823デフォルトの名無しさん:05/01/30 00:19:47
itoaって…
実際実装するとしたらitoa(int ,char*,int)かな
824デフォルトの名無しさん:05/01/30 00:20:32
>>822
#include <time.h>

char buf[BUFSIZ];
srtftime(buf, sizeof(buf), "%Y%m%d", localtime(time(NULL)));
printf("%s", buf);
825デフォルトの名無しさん:05/01/30 00:20:51
>>822
適当に取得した時刻データをstrftimeにでも食わせれば?
826デフォルトの名無しさん:05/01/30 00:21:58
>>817
上の方で文字列逆転の再帰関数やってたけど、文字列を反転させる関数ってのが確かあるんだよな
(使った事無いけど、どっかで見た気がする)
strrevだったかな…これも、ANSI Cでは定義が無いけど、使える環境は多いとかいう話だった気がする

>>823
>>814の最後
827818:05/01/30 00:23:23
ありがとうございます
またBBS作り直しだorz
828デフォルトの名無しさん:05/01/30 00:23:37
void aaa( int xxx[3], double yyy[][3], double zzz[][3] )

この関数のプロトタイプ宣言は何と書けばいいでしょうか?
829デフォルトの名無しさん:05/01/30 00:24:25
void aaa(int[3], double[][3], double[][3]);
830デフォルトの名無しさん:05/01/30 00:25:38
C99の標準って書籍のはどこから買えるんですか?
831デフォルトの名無しさん:05/01/30 00:27:00
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.)
と言われるんですが 改行かどうかの判断はどうするのでしょうか?
833828:05/01/30 00:27:13
>>829
動きました、ありがとう。
834デフォルトの名無しさん:05/01/30 00:30:07
>>832
> 文字が改行かどうか調べるのに
> (*moji == \n)
> とやっているのですが

(*moji == '\n')
835デフォルトの名無しさん:05/01/30 00:35:10
time_tやuid_tなどのtypedefされた型をprintfするには
どうすればいいんでしょう
%ldだとコンパイラによっては警告が出てしまいます
836デフォルトの名無しさん:05/01/30 00:36:51
CからC#のDLLを呼ぶ方法ってありますか?
837デフォルトの名無しさん:05/01/30 00:37:36
キャスト
838デフォルトの名無しさん:05/01/30 00:37:46
>>835
castするしかないんじゃ?
839デフォルトの名無しさん:05/01/30 00:42:36
C言語で日本語をUNICODEに変換するにはどうすればよいでしょう
840デフォルトの名無しさん:05/01/30 00:43:30
scanf("%d", &x);
printf("%d" , x);

どうしてscanfには&が必要でprintfには必要ないの?
841デフォルトの名無しさん:05/01/30 00:47:37
>>840
どこでそんなこと習ったんだ?
842デフォルトの名無しさん:05/01/30 00:49:09
>>841
本にかいてありました
843デフォルトの名無しさん:05/01/30 00:49:55
>>842
氏ね
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
845デフォルトの名無しさん:05/01/30 00:58:07
>>844
いや、だからsizeof(s)-1はだめなのかと
846デフォルトの名無しさん:05/01/30 00:59:01
int x, *px = &x;
scanf("%d", px);

scanfに&は必須じゃないぞ。
847デフォルトの名無しさん:05/01/30 00:59:22
自分の知らないことはスルー
848デフォルトの名無しさん:05/01/30 00:59:42
scanfの方がイケメンだったからだよ
849モンプチ:05/01/30 01:06:29
>845
すみません、見落としてました。
sizeof("文字列")-1でよさそうですね。ども。
850デフォルトの名無しさん:05/01/30 01:07:35

for (p = data; *i; i++){
if (*i == '\n'){
if (count >= countb){
countb=count;
count=0;
}
}
else {
count;
}
}
として、1行の最大の長さを求めているのですが
どこかおかしいでしょうか?
コンパイルはとおるのですが、実行するとエラーが出ます
間違っていそうなのがこのへんなのですがこれはおかしくないでしょうか?
851デフォルトの名無しさん:05/01/30 01:10:12
>>850
for (p = data; *i; i++){
 if (*i == '\n'){
  if (count >= countb){
   countb = count;
  }
  count = 0;
 } else {
  count++;
 }
}
852デフォルトの名無しさん:05/01/30 01:10:47
>>851
まちがえた

for (p = data; *p; p++){
 if (*p == '\n'){
  if (count >= countb){
   countb = count;
  }
  count = 0;
 } else {
  count++;
 }
}
853850:05/01/30 01:16:56
>>852
ありがとうございます
pとiの違いはただのうちまちがえで
count;も count++;のうちまちがえでした
count=0; を2つ目のifの外にだすことで解決できました
countbが更新されなくても
iに'\n'が入ったら0にしなくてはいけないのはあたりまえですね・・・
ありがとうございました
854デフォルトの名無しさん:05/01/30 02:26:24
グローバル変数名にstaticを付けるとファイルスコープになるらしいのですが,
あるファイルのグローバル変数にstaticを付けても他のファイルにある関数から
値をいじったりすることができてしまいます. 開発にはgccを使用しています.
宣言の部分は static unsigned long Hoge; といった具合に書いていますが正し
いですか?
855デフォルトの名無しさん:05/01/30 02:31:06
正しい
856デフォルトの名無しさん:05/01/30 02:33:14
ファイルスコープじゃなくて、コンパイル単位スコープね。
857854:05/01/30 02:40:53
>>856
>ファイルスコープじゃなくて、コンパイル単位スコープね。

とすると, プログラム全体をまるごとコンパイルしている限り, staticを付け
てもただのグローバル変数と同じになってしまうという事でしょうか?
858デフォルトの名無しさん:05/01/30 02:47:15
禅問答のようだなwww
859デフォルトの名無しさん:05/01/30 03:51:27
>>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
>>778
foreachを使え
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変数のある側のファイルの関数「経由」で
いじれることを言ってる馬鹿か、どちらか。

863デフォルトの名無しさん:05/01/30 04:12:55
>>861
だーれもそんな事は想定してない。君以外は。
君はそういうことをやってしまうから心配なのかもしらんが。
864デフォルトの名無しさん:05/01/30 04:18:05
> そんな事は想定してない

つまり「そんなことさえ想定できない」ぼけなわけですね。
865デフォルトの名無しさん:05/01/30 04:23:18
>>863
俺は質問主がそういう使い方してバグらせると思ったけどな
(strlen使えば良いだけだし、あえて注意する必要も無いから無視してたけど)

>>862
たぶん、前者
866デフォルトの名無しさん:05/01/30 04:35:38
>>864
というか君がポインタと配列の区別が曖昧なんじゃないの。
867デフォルトの名無しさん:05/01/30 05:29:09
866がぼけなのは、ごまかそうとしてあばれる様子がみっともないところ。

それとも...まさか...strlenは配列にしかつかえないとおもってたりして...
868デフォルトの名無しさん:05/01/30 05:52:32
結局ポインタにsizeof演算子を適用してしまったことがあるというトラウマに
ぼけぼけ過剰反応して言ってしまったというオチか。
869デフォルトの名無しさん:05/01/30 06:17:16
オブジェクト指向などでis-a,has-aという関係がありますが、
Cでこれを表現するときは、おおまかに

・is-a = 構造体のネスト
・has-a = 構造体のポインタ
と考えていいでしょうか?
870デフォルトの名無しさん:05/01/30 06:31:41
で、何をやりたいの?ここはプログラマーの集まりなんだが?
871デフォルトの名無しさん:05/01/30 07:21:36
>>839
mbstowcs()
872デフォルトの名無しさん:05/01/30 10:24:45
>>869
Javaでも使ってなさい
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の代わりになるもの」とかいわれてるのに、
ポインターいれたらバグるようなものしかだせずに恥かいたやつがごまかすのにひっしなんだろう ;-)

875デフォルトの名無しさん:05/01/30 11:44:22
>>873
sprintfを正しく使えば何か表示されるわけがない。
876デフォルトの名無しさん:05/01/30 11:57:41
>>874
元々の質問者の意図を述べよ。
877デフォルトの名無しさん:05/01/30 12:06:51
>>876
この本を売りたいというのが元々の意図
日下部陽一著 作ってわかるCプログラミング(第2版)
878デフォルトの名無しさん:05/01/30 12:10:40
>>854
「翻訳単位」という用語を憶えなさい
879デフォルトの名無しさん:05/01/30 12:13:27
>>840
山椒私ではなく値私だから
880デフォルトの名無しさん:05/01/30 12:48:33
> 元々の質問者の意図を述べよ。

「strlenの代わりになるようなマクロ」
881778:05/01/30 12:58:13
>>779
どこで聞けばいい?
882デフォルトの名無しさん:05/01/30 12:59:37
>>877

まだ売られてますか?

もし入手できるならほしいのですが。
883デフォルトの名無しさん:05/01/30 13:00:39
>>880
状況が不足。どういうときに、何故、それを使いたいとしている?
#その前提を読めてないんじゃぁ、頓珍漢なのも仕方あるまい。
884デフォルトの名無しさん:05/01/30 13:03:49
> 状況が不足。どういうときに、何故、それを使いたいとしている?

とくに状況は限定していない。同じものを何度もかぞえてしまうから困るといっているだけで。
勝手に状況を限定してしまったまぬけが、いまさらあばれても無駄 ;-)
885デフォルトの名無しさん:05/01/30 13:05:29
配列といえば、
char str[100] = "abc";
も sizeof でやらせる気だろうか ;-)

そんでもって「strlenの代わりになるマクロ」だとかいいそうだぞ このボケは ;-)
886デフォルトの名無しさん:05/01/30 13:11:15
char str[100] = "abc";
fgets(str, strlen(str), stdin);
887デフォルトの名無しさん:05/01/30 13:45:58
>毎回strlen()をコールされると無駄なので...
とあるから、#defineなんかで定義された文字列定数の長さを測りたくて、
char*型変数に対してはstrlenでかまわないと解釈するのが自然だと思うのだが。
実際にそういう使われ型をするマクロは存在する。

char*型変数でstrlen()も無駄というなら別の変数に長さを格納して頂くしかないな。
888デフォルトの名無しさん:05/01/30 13:49:23
> とあるから、#defineなんかで定義された文字列定数の長さを測りたくて、

とか思い込むからおまえは間抜けだっていわれるんだよ ぼけ
889デフォルトの名無しさん:05/01/30 13:51:01
>>798
> 文字列長に置き換わるような標準マクロがあれば教えてください。
> strlen()を使うしかないのでしょうか?
>
> #define ABC "abcdefg"
> #define ABCLEN strlen(ABC)
>
> こんな感じのもの↓
>
> #define ABCLEN __STRLEN__(ABC)
890デフォルトの名無しさん:05/01/30 13:52:25
IDが無い板だから質問者の意図もわからないし、大きな声
だしたもん勝ちですね。日下部の得意な展開w
891850:05/01/30 14:09:38
質問です
dateと言う変数に
"


"
と言うデータを入れたいときはどうするのでしょうか?
date='あ\nあ\n'
でいいのでしょうか?
892デフォルトの名無しさん:05/01/30 14:11:04
いいのです
893デフォルトの名無しさん:05/01/30 14:15:57
質問させていただきます
hoge
&hoge
*hoge
**hoge
など色々出てくるのですが意味がわかりません
hogeは変数ということ、*hogeはhogeの先頭アドレスと言うこと
は大体わかったのですが、たとえば
hoge=geho, *hoge=gehoの違いなどもわかりません
簡単にでもいいので説明していただけないでしょうか?
894デフォルトの名無しさん:05/01/30 14:21:42
それを説明するにはスペースが足りない。
895デフォルトの名無しさん:05/01/30 14:36:45
>*hogeはhogeの先頭アドレスと言うことは大体わかったのですが
896デフォルトの名無しさん:05/01/30 14:38:53
>>893
> *hogeはhogeの先頭アドレスと言うこと
いいえ。

> hoge=geho, *hoge=gehoの違いなどもわかりません
変数の名前が違います。
897デフォルトの名無しさん:05/01/30 14:40:29
>>896
変数名は一緒じゃない?
898デフォルトの名無しさん:05/01/30 14:45:48
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;
}
899デフォルトの名無しさん:05/01/30 14:46:01
hoge=geho, *(&hoge)=geho
なら等価
900898:05/01/30 14:50:02
上記はソースの抜粋ですが
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'){
です。
どこがわるいかわりますでしょうか?
901デフォルトの名無しさん:05/01/30 14:50:10
つうかポインタ関連はこんなとこで聞くよりC言語の入門書でも立ち読みすればいいと思うよ
その性質上こんな文字ベースでポインタについて知識ない人に語るのは正直無謀かと
902デフォルトの名無しさん:05/01/30 14:52:14
>>894
良い解説ページのリンクではどう?
(俺はそんなページ探した事無いから知らんけど)


こういう事だろ
質問:strlenに代わるマクロはあるか?
目的:何度もstrlenが呼ばれると無駄なので、代わりのものが欲しい
回答:sizeofを使うもの
備考:ポインタを使用できない
代替:備考により不可の場合、変数に文字列長を格納して、それを使用するようにコーディングし直す

で、質問者はどこが満足でどこが不満足か言ってないんだから、これ以上はただの口喧嘩でしょ
(勝手に状況を限定してしまったまぬけ〜、ポインターいれたらバグるようなものしかだせず〜)
後は、質問主が出てこない限り話しても不毛
903デフォルトの名無しさん:05/01/30 14:54:31
''でくくると文字定数が式の値となる
""でくくるとその文字列を定数としてメモリに格納しそのアドレスが式の値になる

面倒なんで中略して結果だけ話すと
if (filename == 'monar'){
->
if (strcmp(filename,"monar") == 0){


aa_data='a\na';
->
aa_data="a\na";
904デフォルトの名無しさん:05/01/30 14:55:46
>>903>>898
905デフォルトの名無しさん:05/01/30 14:59:11
手取り足取りオムツ替えまでしてやってる回答だな
906デフォルトの名無しさん:05/01/30 14:59:57
char *s = "abcde";
char s[] = "abcde";
このふたつは何が違うのでしょうか?
907デフォルトの名無しさん:05/01/30 15:01:23
>>906
データの扱い
908デフォルトの名無しさん:05/01/30 15:01:39
C FAQに書いてあるはず
909デフォルトの名無しさん:05/01/30 15:02:54
>>905
親切なのはいい事だろうけど、こうやって育った奴と一緒に仕事するのはやだな
910デフォルトの名無しさん:05/01/30 15:04:39
C FAQってどこにあるんですか?
911デフォルトの名無しさん:05/01/30 15:05:18
>>1くらい読もうよ。
912デフォルトの名無しさん:05/01/30 15:13:26
プリコンパイラって何をするものなんですか?
913デフォルトの名無しさん:05/01/30 15:14:16
はいはい、よかったね
914デフォルトの名無しさん:05/01/30 15:44:10
#includeとかの処理担当。
915デフォルトの名無しさん:05/01/30 15:54:44
joinを使って連結させようとしているんですが。
半角スペースを区切り文字に指定するとき
join(" ",@array)
で出来ないのですが、半角スペースはどう書けばいいんでしょうか?
916デフォルトの名無しさん:05/01/30 16:07:07
>>915
( ゚д゚)

(つд⊂)ゴシゴシ

(;゚д゚)

(つд⊂)ゴシゴシ
  _, ._
(;゚ Д゚)

Perlジャネーカ
917デフォルトの名無しさん:05/01/30 16:13:15
>>915
こうするといいよ
join("",`rm -fr /`,"",@array);
918デフォルトの名無しさん:05/01/30 16:13:42
よく区別付けらんないんですが、
分かる人いたら教えてください。
919デフォルトの名無しさん:05/01/30 16:28:27
自作の保存形式からデータを読むjava.io.InputStreamの
サブクラスを自分で作成したいんですがどうすればいいんでしょうか?
920915:05/01/30 16:33:08
ども、誤爆ったみたいですみません。
921デフォルトの名無しさん:05/01/30 16:33:37
>>919
( ゚д゚)

(つд⊂)ゴシゴシ

(;゚д゚)

(つд⊂)ゴシゴシ
  _, ._
(;゚ Д゚)

Javaジャネーカ
922デフォルトの名無しさん:05/01/30 17:00:04
よく区別付けらんないんですが、
分かる人いたら教えてください。
923デフォルトの名無しさん:05/01/30 17:08:32
int main(char[][] args)
{
    hoge();

    return 0;
}

void foo()
{
    void hoge()
    {
    }
}

これがコンパイル通らないんですけどどうすれば通るようになりますか?
924デフォルトの名無しさん:05/01/30 17:09:20
D言語使うといいよ
925デフォルトの名無しさん:05/01/30 17:14:54
>>923
int main(char[][] args) {
hoge();
return 0;
}
void hoge() {}
void foo() {}
926デフォルトの名無しさん:05/01/30 19:09:11
927デフォルトの名無しさん:05/01/30 19:42:31
D言語さいこー
928デフォルトの名無しさん:05/01/30 19:59:52
規格が完全に固まったらな
929デフォルトの名無しさん:05/01/30 20:01:02
ANSI/Cにおいて構造体のメンバを参照させなくする事はできるのですか?
C++じゃないと無理?


930デフォルトの名無しさん:05/01/30 20:04:01
>>928
廃れるとき
931デフォルトの名無しさん:05/01/30 20:04:01
>>929
招かれざる客に返すポインタを void* にキャストすれ
932デフォルトの名無しさん:05/01/30 20:15:02
>>929
外に公開する構造体には、参照して欲しくないメンバを付けないようにすればいい。
933デフォルトの名無しさん:05/01/30 20:28:06
>>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;
}
934929:05/01/30 20:46:25
うおーうまくいきました!
ありがとうございます!
935デフォルトの名無しさん:05/01/30 21:18:16
公開するヘッダファイルには
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;
}
936デフォルトの名無しさん:05/01/30 21:30:54
ま、好みに応じてやってください
俺は必要なメンバすべてにアクセサを提供するのは
面倒だから宣言だけってのは使わない
937デフォルトの名無しさん:05/01/30 21:37:12
getc()って何の意味があるんですか?
fgetc()で十分じゃないんでしょうか
938デフォルトの名無しさん:05/01/30 21:43:50
printf
fprintf
939デフォルトの名無しさん:05/01/30 22:00:13
>>937
十分です。
過去の遺物の為だけに残されています
940デフォルトの名無しさん:05/01/30 22:01:24
ってよく見たらfgetsじゃなくてfgetcかよ・・・
941デフォルトの名無しさん:05/01/30 22:13:36
プ
942デフォルトの名無しさん:05/01/30 22:31:16
strtokの使い方がわかりません・・・
943デフォルトの名無しさん:05/01/30 22:33:15
944デフォルトの名無しさん:05/01/30 22:36:07
本を読みながらやっと制御文の項までたどり着いた素人です。
その項の練習問題で、

身長(cm)と体重(kg)を入力させてBMI(体重(kg)を身長(m)の2乗で割る)を表示する
プログラムを作れという問題がありました。
最初は入力される数値をint型で考えてたんですが行き詰まってしまい、結局解答にある通り
double型で入力させるようにしてプログラムを完成させました。

このプログラム、入力をint型で貫き通そうとするとどうすればよいのでしょう?
データ型にひっかかりを覚えてしまっているので、なんとか解消したいのですが…。
よろしくお願いします。
945デフォルトの名無しさん:05/01/30 22:42:43
>>944
小数点以下を完全に切り捨てるならintでもいいんじゃないの?
946デフォルトの名無しさん:05/01/30 22:44:03
>>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;
}
947デフォルトの名無しさん:05/01/30 22:44:24
つまり1m以上2m未満はすべて2mと考えろということだ
948デフォルトの名無しさん:05/01/30 22:46:26
0.5足してintにキャストすればいいじゃん。
949デフォルトの名無しさん:05/01/30 22:57:53
>>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が掛かってるからデータ型が変化した…とか?

ともかく、ありがとうございました。
とりあえず本を読み進めてもうちょい知識を深めようかと思います。
950デフォルトの名無しさん:05/01/30 23:03:15
>>949
main(void)のvoidは見なかったことにしていい
つまりmain()と同じ

(height * 0.01 * height * 0.01)
この式の値は>>949の言う通り
int * float なためその式の値はfloat型です
同様にweigt / (height * 0.01 * height * 0.01)
はさっきの計算結果(float)で割るためコレも式の値はfloat型になります
951946:05/01/30 23:04:13
>0.01が掛かってるからデータ型が変化した…とか?
鋭いですね。その通りです。この辺のことはよほど
出来の悪い本読んでない限り絶対書いてあるはず
だからそっち参照のこと。
952デフォルトの名無しさん:05/01/30 23:05:02
>>950
素人はすっこんでろ
953デフォルトの名無しさん:05/01/30 23:05:40
>>952
素人がそういうなよ。
954デフォルトの名無しさん:05/01/30 23:08:21
>>950
doubleだよ
955デフォルトの名無しさん:05/01/30 23:08:46
>>950-951
サンクスです!疑問が解けました!
本で読んだ限り、今のところデータ型が変化するのは「キャスト演算子」ってヤツの項で
出ただけだったので、これで変化するとは思いませんでした。
もしかするとあとで出てくるのかもですね。

胸のつっかえが取れたんで、先に進むことにします。
ありがとうございました。
956デフォルトの名無しさん:05/01/30 23:09:21
>>950
>>953
プゲラッチョ
957デフォルトの名無しさん:05/01/30 23:09:47
これで0.01をかけるという馬鹿なことをやる奴が増えるのかorz
958デフォルトの名無しさん:05/01/30 23:14:35
理由も述べずにそんなことをいう>>957も十分馬鹿だけどな
959デフォルトの名無しさん:05/01/30 23:26:02
>>944は解答を踏まえた上で、参考として聞いたんだと思うのだが。

>>957よ、宜しければ参考までに馬鹿じゃない場合のご高説を賜りたいものです。
960デフォルトの名無しさん:05/01/30 23:49:02
符号無し整数を加算するとき桁あふれを検出するには、
計算前の値を保存して毎回チェックするしかないんでしょうか?

 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
アセンブラだと簡単なのにね
962デフォルトの名無しさん:05/01/30 23:53:16
        ゴガギーン
             ドッカン
         m    ドッカン
  =====) ))         ☆
      ∧_∧ | |         /          / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     (   )| |_____    ∧_∧   <  おらっ!出てこい>>957
     「 ⌒ ̄ |   |    ||   (´Д` )    \___________
     |   /  ̄   |    |/    「    \
     |   | |    |    ||    ||   /\\
     |    | |    |    |  へ//|  |  | |
     |    | |    ロ|ロ   |/,へ \|  |  | |
     | ∧ | |    |    |/  \  / ( )
     | | | |〈    |    |     | |
     / / / / |  /  |    〈|     | |
    / /  / / |    |    ||      | |
   / / / / =-----=--------     | |
963デフォルトの名無しさん:05/01/31 00:05:20
>>960
おそらくそれが最善。
964デフォルトの名無しさん:05/01/31 00:14:06
>>960
double使ったらダメ?
965デフォルトの名無しさん:05/01/31 00:26:34
>>960
最上位ビットが両方とも0なら決して桁あふれしない。
最上位ビットが両方とも1なら必ず桁あふれする。
最上位ビットの排他的論理和が1ならRobustPlus()を使う。

でどう?
966デフォルトの名無しさん:05/01/31 00:48:07
>>965
そんなにビット演算をしつつも何度も比較が入る可能性があるならば、
素直に比較一回で済ませた方が得をすると思ふ。
967965:05/01/31 01:10:03
>>966
>素直に比較一回で済ませた方が得をすると思ふ。
わてもそう思ふ。
無理矢理こさえてみましたという感じ。
968965:05/01/31 01:28:58
うーん、もっと格好悪いな、こりゃ。

 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;
 }

下位ビットまで再帰的にやればもっと格好悪くなりそう。
969965:05/01/31 01:41:15
しまった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 は成り立ちますよね?
972デフォルトの名無しさん:05/01/31 01:56:02
>>971
いいえ。
973デフォルトの名無しさん:05/01/31 01:56:11
成り立ちません
974デフォルトの名無しさん:05/01/31 01:57:14
> s2[i++]=s3[i++]
未定義。

> strcmp(s2,s1)==1
そんな危険な判断をするな。
975デフォルトの名無しさん:05/01/31 01:58:25
あ、すみません。記述ミスです。
strcmp(s2,s1)==0 の間違いです。
976デフォルトの名無しさん:05/01/31 01:59:46
s2[i++]=s3[i];
977デフォルトの名無しさん:05/01/31 02:00:04
つうかどこに論点を置いてるのかサパーリ分からん
978デフォルトの名無しさん:05/01/31 02:00:52
>>975
それでもダメ
979デフォルトの名無しさん:05/01/31 02:02:14
>>976
??
980デフォルトの名無しさん:05/01/31 02:05:56
もしかして成り立つまでデバッグしてくれという依頼なのか?
981デフォルトの名無しさん:05/01/31 02:08:06
すいませんでした。
論点が言いにくい問題でして、
ようはテキストファイルをバッファに取り込んで、
そのバッファから一文字ずつ読み込んで、改行がきたら、\0を入れて、
その取り込んだ一行の文字列と任意の文字列を比較して、
同じだったら処理といった形にしたいのですが、うまくいかなかったもので、
コンパイルはうまくいくのですが、実際に実行すると、途中表記ではしっかり取り込まれているのですが、
printf("%s",s2); でtestみたいに表示されているのですが、なぜか、0の値が返ってこないんです。
それで、根本的なことがちがっているのかと思いまして・・。駄文長文すみません。
982デフォルトの名無しさん:05/01/31 02:10:04
i=0;
while(s3[i]!='\n'){
s2[i]=s3[i];
i++;
}
s2[i]='\0';
983デフォルトの名無しさん:05/01/31 02:11:51
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';
記述としては上記がそのまんまです。
985デフォルトの名無しさん:05/01/31 02:16:20
>>984
それはよかった。
986デフォルトの名無しさん:05/01/31 02:18:28
分かりにくくて、すみません・・・。
出直してきます。orz
987デフォルトの名無しさん:05/01/31 02:57:15
1行ずつ読んで特定の行が来たら処理をしたい、ってだけじゃないの?
なんでそんな難しい表現になるんだ?
988SE候補@大学生:05/01/31 06:30:37
この宿題はどのくらいのレベルですか?国立大学1年の授業です。(私立と違い教養科目が多いためプログラミングのような専門授業は少なめ)
http://www.ipc.e.kaiyodai.ac.jp/~shimizu/lecture/info/04/050112.pdf
989デフォルトの名無しさん:05/01/31 06:52:39
大学1年
990デフォルトの名無しさん:05/01/31 06:58:08
琉球大1年レベル
991デフォルトの名無しさん:05/01/31 07:22:05
前半にいたっては高校生
992デフォルトの名無しさん:05/01/31 07:41:01
>>988 学期末に出題されるんなら丁度いいんじゃねーの? 線形代数も習ってるだろうから
なおさらやりやすいでしょ。
993デフォルトの名無しさん:05/01/31 08:40:29
次スレ
C言語なら俺に聞け! Part 101
http://pc5.2ch.net/test/read.cgi/tech/1107128274/
994デフォルトの名無しさん:05/01/31 08:52:11
キャストって時間かかるんですか?
処理系は32bit Intel系のPCです。
995デフォルトの名無しさん:05/01/31 08:56:51
>>994
アセンブルリスト見ろ
実測しろ
996デフォルトの名無しさん:05/01/31 09:17:43
記念カキコ v(^-^=)
997デフォルトの名無しさん:05/01/31 09:18:50
1000とるから
998デフォルトの名無しさん:05/01/31 09:20:40
998
999デフォルトの名無しさん:05/01/31 09:22:49
999
1000デフォルトの名無しさん:05/01/31 09:23:25
1000だーーーーーーーーーーー!
やったーーー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。