1 :
デフォルトの名無しさん :
02/11/07 21:55
2 :
デフォルトの名無しさん :02/11/07 21:56
3 :
デフォルトの名無しさん :02/11/07 21:56
まもなくここは 乂1000取り合戦場乂 となります。
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
http://big.freett.com/scheme_a/num1000.swf
1 乙カレー
<ヨンジュー> とするのが礼儀であろう・・・。
どうでもいいけどさ、 mallocとかreallocとかの allocってどういう意味? 辞書にものってない・・・
10 :
デフォルトの名無しさん :02/11/07 22:02
allocate
memory allocate reallocate
12 :
デフォルトの名無しさん :02/11/07 22:03
割り付けか!! ありあとう
all OK
creat
>>1 おつかれ
でもスレッドタイトルもうちょっとひねれなかったの?
スレタイをひねる必要はない。
どうせ3日で終わるんだから、どうでもいいよ。
さて、3日ももつかな?
あ。「マルチ禁止」 入れるの忘れたよ・・・。
20 :
デフォルトの名無しさん :02/11/07 22:26
あげ
21 :
デフォルトの名無しさん :02/11/07 22:29
C言語とは関係ないんだけど、SHIFT-JISの内字っていったい何文字あるんですか?
なんでCと関係ない話するんですか?
23 :
デフォルトの名無しさん :02/11/07 22:35
>>22 すんません。
CでSJIS⇔UNICODEの変換ツールを作る予定だったもんで。
「内字」ってはじめて聞いた。
25 :
デフォルトの名無しさん :02/11/07 22:36
int a = 38; int i; for(i = 0;i < 32;i++) { if(a & (1 << i)) printf("1"); else printf("0"); } どうもうまくいきません。何がわるいんでしょうか?
>>25 数字を2進で表示するつもりです、とか何をするつもりで、
どううまく行かないかくらいかけよ。
27 :
デフォルトの名無しさん :02/11/07 22:38
int a = 38; int i=32; for(;i--;) { if(a & (1 << i)) putchar('1'); else putchar('0'); }
29 :
デフォルトの名無しさん :02/11/07 22:38
>>24 外字領域じゃないんで、「内字」でもいいんじゃないですか?
内地人
内地って本州の事だろ
>>21 こういうレベルから全部、人にいちいち聞いて、
sjis、unicodeの変換ツールを作るつもりなのかい。
すげーな。
前スレでヘッダファイルについて質問した香具師だけど こんなもんが出てきちゃったYO! ■C:\Documents and Settings\C\Pointer> bcc32 list4-8.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland list4-8.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_read_line' が未解決(C:\DOCUMENTS AND SETTINGS\C\POINTER\LIST4-8.OBJ が参照) 間違いなく、同じフォルダにあるYO! read_line.cも.hもあるYO! WHY???
bcc32 list4-8.c read_line.c
>>25 ビットが逆順で出るって事か。
if(a & (1 << (31 - i)))
だろ。
37 :
デフォルトの名無しさん :02/11/07 22:44
>>33 やらなきゃいけないんで。
参考になるサイトとかあったら教えてください。
read_line関数がないだけだろ・・・・ ヘッダーファイルの問題じゃない。
39 :
デフォルトの名無しさん :02/11/07 22:45
int a = 38; int i=1<<31; for(;i;i>>=1) { if(a & i) putchar('1'); else putchar('0'); }
>>37 WideCharToMultiByte と MultiByteToWideChar で検索しろ。
>>35 サンクス
もしかしていちいちこれやんなきゃだめ?
>>34 read_line.c も同時にコンパイルしる。
44 :
デフォルトの名無しさん :02/11/07 22:55
46 :
デフォルトの名無しさん :02/11/07 23:13
ブヒッ?
47 :
デフォルトの名無しさん :02/11/07 23:17
クワッパ
48 :
デフォルトの名無しさん :02/11/07 23:21
害厨に毒されて程度が著しく下がってしまった哀れなスレはここですか?
49 :
デフォルトの名無しさん :02/11/07 23:21
t ww /na h t p:/ / w.i-chubu e. -h/marion .n vi jp/~tom o mi / na gi?lin vi.c ks=20 彡 311 (,,ノ゚д゚)ノ
最近ようやくポインタが理解できてうれしい今日この頃ですが、 よくポインタを理解したら中級レベルと言いますが、 特定の分野に依存しないところで、 上級レベル、って言うとどんなものがあるのでしょうか? 最近いい気になってる俺を打ちのめしてください。
while文はループの制御を制御する文で判定に使う式が真である間、ブロック・文・空文を繰り返し 実行する。無限ループを作りたい場合は条件式に0を入れれば良い。 これって正しい?
#define kazu(x) kazu(x)*(x) main(){ int i , j ; i=kazu(3); j=kazu(1+4); printf("%d\n",i); printf("%d\n",j); } されにこのマクロ終わんなくない?
前橋本に文句がつけられるようになる。
56 :
デフォルトの名無しさん :02/11/07 23:32
条件式に1
とりあえず、7行プログラミング板いってみ オレはぶちのめされた 7行でオセロできてたYO!
あれは特定の分野に依存してる・・・かな?
常に真のループはwhile(1)よりfor(;;)がいいと思うのであります。
>>51 void (*signal(int signum, void (*sighandler)(int)))(int);この文で宣言されている変数とその型は?
>>61 whileだと少なくとも"1"を意識する必要がありますが、
for(;;)だと何も意識しないことが期待される動作につながるからであります。
>>58 問3(2)、0 でも 1 でも正解で、2以上の数値 と -1 で不正解なのは意味不明。
>>60 最適化がかかれば 2 つに違いは無い。
最適化されない場合、for(;;) が無条件でループするのに対して while(1) は
毎回 1 を評価する。
>>62 えーと、
signalは、返却値なしで引数intの関数へのポインタを返す関数で、
引数はintと、返却値なしで引数intの関数へのポインタの二つある!
キタ━(・∀・)━!
>>64 0正解?
間違いだろw
Cの真と偽の定義知ってる?
>>64 すまそ。問題の方ね。
ただの写し間違いとは思えないから
あのサイトの管理人がまちがってんだろ
>>65 返り値の型がvoidなのは、返却値なしとゆーより、
返却値はどう使ってもい〜よ〜だと思っていたが、違うかな?
void *とごっちゃになってるかな?俺。
>>69 でもvoid kansu(void)とかでreturnすると
警告でない?使えないんでない?
てかvoid*ってなんだ?
71 :
デフォルトの名無しさん :02/11/07 23:51
return; は使える。
>>69 間違い。voidを返す関数というのは何も返さない。
使おうと思っても何も返ってこないのだから使いようがない。
>>72 レスTHX。やっぱ勘違いしてました。
>>70 void *は何にでもキャストできる汎用型。
オブジェクト指向〜とかポリモーフィズム〜なんてので使った記憶あり。
>>65 char array[5][5];
上記のarrayの型を引数としてarrayの型を返すような関数ポインタfuncpを定義したい。
どうすれば良いか?
char (*funcp)(char array[5][5])[5][5];
>>62 A: int 型の signum
B: int 型の引数を 1 つ取る void* 型関数へのポインタ型の sighandler
C: int 型の引数を 1 つ取る void* 型関数へのポインタ
引数 A、B を取り、C を返す関数 signal のプロトタイプ
変数なんか宣言されてる?
77 :
デフォルトの名無しさん :02/11/08 00:03
void (*sighandler)(int); ってわかる?
>>64 俺もそう思った。0以外はみんな正解じゃん。
〜以外を入れるという問題かと思って見直しちゃったよ。もしそうなら0が正解だから。
80 :
デフォルトの名無しさん :02/11/08 00:09
void *(*sighandler)(int);
>>78 仮引数の間違いじゃないのか?
教えてくれ。
変数が定義されているなら、62 のユーザー定義識別子のどれかから sizeof が
取れるはずだが、コンパイルエラーになるのは何故だ?
C++ だが、76 の則って
void (*signal(int signum, void (*sighandler)(int)))(int);
typedef int A;
typedef void (*B)(int);
typedef void (*C)(int);
C signal2(A, B);
とした場合、
cout << "signal : " << typeid(signal ).name() << endl;
cout << "signal2: " << typeid(signal2).name() << endl;
この 2 行は全く同じ結果になる。
>>77 76 の B。
解答ページより > while文はループの制御を制御する文で判定に使う式が真である間、ブロック・文・空文を繰り返し > 実行する。無限ループを作りたい場合は条件式に"0を入れれば良い"。 ハァ?
>>77 intをひとつ取り、値を返さない関数へのポインタsighandlerじゃないの?
int *(*pf)(int); 上のポインタ型を返す関数(引数はint) int *(*(*ppf)(int))(int); 上のポインタ型を返す関数(引数はint) int *(*(*(*pppf)(int))(int))(int); 上のポインタ型を返す関数(引数は上のポインタ)の配列(サイズは10) int *(*(*(*(ppppf[10])(int))(int))(int))(int *(*(*(*)(int))(int))(int));
漏れ 77 じゃなくて 76 だよ・・・鬱
ごめん、プロトタイプだった。 こう書けばよかったね。 void (*(*signal)(int signum, void(*sighandler(int))))(int);
>>85 二番目は関数ポインタ(?)を返す関数へのポインタと考えればいいのか?
最後間違った! int *(*(*(*(*ppppf)(int *(*(*(*)(int))(int))(int)))(int))(int))(int);
>>88 内側から 1 コずつ typedef していけば、なんとなく分かるよ。
s/ppppf/ppppf[10]/
>>92 char array[][5]でいいと思う。
しかし、関数ポインタのネストって普通しないんじゃないか? するにしても、難読になってくる前に typedef すると思うんだけど。 85-89 みたいなコードを生で書いてる(書く方針の) 人っている?
>>93 74 を見る限り、引数は char array[5][5] でいいだろう。
関数へのポインタを返す関数の使い道が経験の浅い僕にはわかりません。
なんだか説明が変だな。
正しくは、「上のポインタ型を返す関数(引数はint)へのポインタ」だな。
しかも間違ってるし。
>>91 thanks
>>94 ふつうはせいぜい関数ポインタを返す関数までだな。
それでもtypedefする。
まあ、パズルというか言葉遊びということで。
>>96 関数テーブル
int Hoge(int a) { return a + 1; }
int Huge(int a) { return a + 2; }
int Hage(int a) { return a + 3; }
int (*funcs(const char *funcname))(int)
{
if(!strcmp(funcname, "Hoge")) return Hoge;
if(!strcmp(funcname, "Huge")) return Huge;
return Hage;
}
必要な精度にすればいい。 0.00000001でよかったらそれでいい。
>>99 <float.h> の DBL_EPSILON や FLT_EPSILON でも使ったら?
漏れもよくわからない。
<float.h> はいろんな定数が定義されてるよ。
102 :
デフォルトの名無しさん :02/11/08 00:44
int func(const char *funcname, int a) { if(!strcmp(funcname, "Hoge")) return Hoge(a); if(!strcmp(funcname, "Huge")) return Huge(a); return Hage(a); }
103 :
デフォルトの名無しさん :02/11/08 00:44
>>98 精度は型によって違うから。(固定or浮動小数,バイト数)
ep_dash=(double)a/b-1.0 if(abs(ep_dash))... とかは?
>if(abs(ep_dash))... if(abs(ep_dash)<0.0001)... 「104の訂正」 めちゃ解り辛いな
関係無しって言うのは 751という数字がという事だ。悪いな何度も
max(a,b){(abs(a-b)+abs(a+b))/2}なんてあったな、そういえば。
あったあった、で、なんでいきなりmax?
多分このコードより三項演算子の方が速いな。
>>99 関数テーブルって言うなら
funclist[]={Hoge,Hage,Huga};じゃね?
俺ならenum,switch使うな。
文字列比較なんてたるくてやってられね〜。
ふむふむ 3時間で100か・・・ このペースだと3日もたない・・・
>>109 あっ、a,bが負の場合違うでしょ、それ。
足し算の方は絶対値取らなくていいべさ。
reallocって重いの?
>>115 軽いとは言えないが不要な処理はしないはず。
ところで、何かと比較して言ってるの?
重い、重くないの基準は?
前スレでCbarなるものを教えてもらったんだけど、 コンパイル不能!こんなエラーが Microsoft (R) KKCFUNC バージョン 1.10 Copyright (C) Microsoft Corp. 1991,1993. All rights reserved. KKCFUNC が組み込まれました. マイクロソフトかな漢字変換 バージョン 2.51 (C)Copyright Microsoft Corp. 1992-1993 かな漢字変換は組み込まれませんでした. MSIMEK.SYSが登録されていません. コマンドまたはファイル名が違います. C:\DOCUME~1\C\PROJECTS\> 意味が不明・・・
free して malloc しなおす のに比べて
120 :
デフォルトの名無しさん :02/11/08 02:09
>>119 mallocしてコピーして元の領域をfreeの間違いか?
敷居(w
元の英語はthreshold(閾値、しきい値)だね。
「これ以下なら近い」等と判断する境界値の事。
>>98 わかんなかったらとりあえず#include <float.h>して
FLT_EPSILON使ってれば?
新たに別の場所に再確保すると言う事はreallocも元の領域はfreeしてる訳だから 関数呼び出しのオーバーヘッド位しか差は無いんじゃない?
>>123 reallocは通常、元の領域をいじるだけだと思うんだがどうだろう?
あくまでも通常ね。
VC++でやってみた。
VC++ではreallocは他の領域に取るみたいだね。他のも大抵はそうなのかな?
だとすると
>>123 の言うとおりだね
実装によると思ふ。 VCではHeapReAlloc使ってるね。 ヒープのサイズ変更ができないOSでも、CRTが一気に確保して管理してる 処理系だと速い場合もあるかな。
127 :
デフォルトの名無しさん :02/11/08 03:20
>>118 > コマンドまたはファイル名が違います.
という事は、環境設定で何か間違ってないか?
あと
> Microsoft (R) KKCFUNC バージョン 1.10
> Copyright (C) Microsoft Corp. 1991,1993. All rights reserved.
>
> KKCFUNC が組み込まれました.
>
> マイクロソフトかな漢字変換 バージョン 2.51
> (C)Copyright Microsoft Corp. 1992-1993
は 16ビットコンソールアプリ蹴った時にいつもでるからいいんだけど、
> MSIMEK.SYSが登録されていません.
初めて見た。
何か Windows そのものがおかしくないか?
age ちゃった・・・。 追加。 16 ビットコンソールアプリが走ってるのも何かおかしい。 利用 OS は NT 系に設定してある?
130 :
困ったさん :02/11/08 04:14
標準入力から数行のテキストファイル(ただし2バイト文字を含まない)を 読み込んで、それに行番号をつけて標準出力の出力するプログラム、誰かお 願い!!
それだけなら2バイト文字があっても問題ないと思うんだが。
132 :
困ったさん :02/11/08 04:18
今アスキーコードならった所なんです、たぶんその関係で書かれてると 思うんですが。。。難しいことはわかりません。。
134 :
困ったさん :02/11/08 04:21
??すいません。。。わかりません
つか宿題なら宿題スレにいく
#include <stdio.h> #define LBUFLEN 1025 /* 一行の最大長+1 */ int main(){ int line; char buf[LBUFLEN]; for(line=0;;line++){ printf("%06d ",line); if(!fgets(buf,sizeof buf,stdin)) break; printf("%s",buf); } printf("%s",buf); return 0; } テストしていない。
137 :
困ったさん :02/11/08 04:24
すいません。。失礼なことはわかってたんですけどこんな時間に書き込んで もらえそうになかったんで。。
こたえちゃまずかったな・・ スマソ
ん? fgetsの仕様を勘違いしたかも。 forを抜けたあとのprintfはいらないな。
教えて君が一向に減らないな。
141 :
困ったさん :02/11/08 04:27
ほんとすいません。。こんな時間に。。ほんとありがとうございますm(_ _)m
行番号って0からじゃないよな・・・・ なにやってんだろ俺。
#include <stdio.h> int main() { int c, line=1, newline=1; while ((c=getchar()) != EOF) { if (newline) {printf("%06d", line++); newline=0}; putchar(c); if (c == '\n') newline=1; } return 0; }
do_something:好き DoSomething:好きだったが教えて君でこの記法を使ってくる奴が目につき嫌いになった。 doSomething:使わないが嫌いでは無い。 prefix_do_something_preposition_something_sufix
#include<stdio.h> int main(void) { int t[]={5,9,18}; int *ptr; ptr = t; printf("adress=%p\n",ptr); printf("adress=%p value=%d",ptr,*ptr++); return 0; } これの実行結果が adress=0012FF80 adress=0012FF84 value=5 こうなったんですが、 なぜadressがインクリメントされてvalueはそのままなんでしょうか? 教えてくださいTT
146 :
デフォルトの名無しさん :02/11/08 06:11
printf("adress=%p value=%d",ptr,*ptr++);は printf("adress=%p value=%d",ptr,*ptr); ptr++; と同じ。 printf("adress=%p value=%d",ptr,*++ptr); printf("adress=%p value=%d",ptr,++*ptr); の違いはわかるかな。
147 :
デフォルトの名無しさん :02/11/08 06:15
アドレスはなんで増えてるんだ?
>>146 printf("adress=%p value=%d",ptr,*++ptr);だと
ptrをインクリメントしてから値参照、よってaddress=0012ff80 value=9
printf("adress=%p value=%d",ptr,++*ptr);だと
*ptrをインクリメントするからaddress=0012ff80 value=6
になると思う。
printf("adress=%p value=%d",ptr,*ptr);
ptr++;
だと実行結果の2行目adress=0012ff84にならないと思うんですが?
括弧を付けた方がわかりやすいですね。 *++ptrこういう書き方はあまり好きじゃない。。^^;
150 :
デフォルトの名無しさん :02/11/08 06:45
printf("adress=%p value=%d",ptr,*ptr++);は printf("adress=%p value=%d",ptr,*ptr); ptr++; ではない。 関数の評価順は規格で決まっていない。 ptr++は評価した後に増やす。
最初ptrの値は0012ff80で printf("adress=%p value=%d",ptr,*ptr++);実行時に adress=%pのところはptr つまり0012ff80が表示されると 思うんですがなぜ0012ff84になってるんでしょうか?
>>151 だから
>>150 が書いてるじゃん。
printf()を呼ぶ際に3つの引数を評価するわけだが、その順番は規格では
決まってない。
printf("adress=%p value=%d",ptr,*ptr++);
は、内部的には
a = "adress=%p value=%d";
b = ptr;
c = *ptr++;
printf(a, b, c);
でも
c = *ptr++;
b = ptr;
a = "adress=%p value=%d";
printf(a, b, c);
でも、どちらの処理でもいいことになってる。
後者だったとしたら、なぜ
>>151 のような結果になるか理解できるでしょ?
実際、引数をスタック渡しするCPUでは逆順に積むのが普通なので、多くの
環境で後者のような処理になる。もちろん前者でやるのも規格上問題ないので、
「引数は後ろから順に評価される」という仮定もやっちゃだめ。
お願いします。Cで微分をするにはどうしたらいいのでしょうか?
>>126 遅レスだが・・・。
VC++のmalloc()系はHeapAlloc()系APIも使ってはいるが、
それは要求されたサイズが一定以上大きい場合だけだったはず。
通常はVirtualAlloc()系で確保したものを細切れにして返してくる。
malloc()系の方がHeapAlloc()系より遥かに高速だよ。
ごめん。昨日の
>>118 だけど
MSIMEK.SYSってたぶん、CONFIGなんとかってファイルに書く奴でない?
前に猫を見てた時に、エスケープシーケンスが出来なかったから
なんか付け足した気がする・・・。ちなみにXPだす。
システムそのものがおかしいって言われたから不安になったんだけど、
誰かこのエラーの意味わかる?
分からんかったらどの板行ったらいいかな?
C++のMFCで、既に作られてるアプリケーションに新規にダイアログ(モードレス) を作って表示させるにはどうしたらいいですか? 例えば、 ファイル→プロパティー でモードレスダイアログが出てくる感じにしたいんですけど。。
>>156 はい、そうです。正確には偏微分です。
こんな感じです。
fx= ∂f / ∂x
160 :
デフォルトの名無しさん :02/11/08 12:44
・dF(x)/dxのルーチンを使いまわす設計にする。 ・精度を考える。(精度次第で数値の扱い、ひいては速さを必要とする場合の アルゴリズムに影響される。)
>>122 うお、これで完璧に判りました。誤訳だったとは…。
通りで検索しても出ないし、意味も不明だし。
ありがとうございました。
>>161 誤訳じゃなくて誤変換だろ。
そういえばぼーよー.comには定義城(定義域の間違い)ってのがあったな。OCRでも使っているのかな。
163 :
デフォルトの名無しさん :02/11/08 17:15
ファイルオープンしてから、fscanf文でファイルの最後まで読みこんだあと、 もう一回ファイルの先頭から読み直すのはどうやるんですか?
164 :
デフォルトの名無しさん :02/11/08 17:20
クローズしてもう一回ファイルオープンする。
165 :
デフォルトの名無しさん :02/11/08 17:23
すみません。初心者ながら疑問があるのですが、 Visual C++でビルドしたプログラムはWin9X上で動かないって事ですか? あと、スレの最初にかかれてる問題って何なのでしょうか?
これらのプラットフォームは、デザイン時についてはサポートされない予定です。 この決定理由は、Microsoft Visual Studio 環境で利用できる 最先端のプラットフォーム機能の恩恵を開発者が 確実に受けられるようにするためです。 コードの実行については、Windows 98 以降の 上位オペレーティング システムでサポートされる予定です。 というところまでは探せたのですが・・・、 他の問題というのがいまいちわからずじまいで・・・。
>>165 ありがとうございます。無事ファイルが読み込まれました!!
これでレポートがはかどります
>>167 C/C++ の前に日本語は大丈夫?
> スレの最初にかかれてる問題
あなたの抱えている疑問、質問などの事。この場合は ↓
> Visual C++でビルドしたプログラムはWin9X上で動かないって事ですか?
で、これは C の話だと思う? 思わない?
170 :
デフォルトの名無しさん :02/11/08 18:49
buf[0]-buf[3] をintの変数に代入する場合はどのようにしたらいいのでしょうか? int cnt = (int)buf; と無理やりしてみたのですが、だめなようでした・・
>>170 まず buf の宣言を見せれ。
あと、「buf[0]-buf[3]」 は buf[0] から buf[3] を減算した結果と解釈して
よろしいか?
172 :
デフォルトの名無しさん :02/11/08 19:08
最近、C言語に本腰を入れてやって見ようとやり始めた者です。 とある本を参照しながら勉強してるんですが、 いままで関数は main関数内で宣言してたんですが,なぜか違う演習だとヘッダ部分で関数を宣言してるんです。 この違いはいったい何なんですか?
>>172 main関数内ではなく、main関数と同じcソースの中で、だよね?
staticな関数ならそれを使用するコンパイル単位のcソースの中で宣言するけど、
そこら中から参照できる関数は、共通のヘッダファイルで宣言するのがセオリー。
コンパイルの精度を上げるためにね。
>>172 > 関数は main関数内で宣言
main() の中でプロトタイプ書いてるって?
それ C++ じゃないとできないぞ。
正確には main() 関数が書いてあるのと同じファイル内、じゃないの?
175 :
デフォルトの名無しさん :02/11/08 19:17
こういうのか? #include <stdio.h> int main() { int hoge(int x); printf("%d\n", hoge(3)); return 0; } int hoge(int x) { return x * x; }
>>175 普通はしないよね。そんなこと。
172 はどこでそんなこと習ったんだ?
177 :
デフォルトの名無しさん :02/11/08 19:20
はい!前橋の本に、「malloc()に皮をかぶせて・・・」 とか書いてあったんだけど、どういう意味ですか? ま、まさか・・・
178 :
デフォルトの名無しさん :02/11/08 19:21
>>175 そうです、それと
#include <stdio.h>
int hoge(int x);
int main() {
printf("%d\n", hoge(3));
return 0;
}
int hoge(int x) {
return x * x;
}
の違いを知りたいんです。
>コンパイルの精度 って具体的に何?
精度は違うだろ。速度だろ。 ・・・角度かも知れないけど。
>178 C++なら、 #include <stdio.h> int main() { int hoge(int x); printf("%d\n", hoge(3)); //合法 return 0; } int hage() { return hoge(3)*hoge(3);// えらー } int hoge(int x) { return x * x; } の違いがある。Cでは、そもそも「非標準の拡張機能」らしいので知らん
ま、とりあえず人に物教えるときに脳内言語は使うなと
>>178 175 のソースは C じゃできない。C++。
(もしかしたら実際にコンパイル通るかも知れないけどそれはコンパイラ独自の拡張機能)
C では 178 の書き方しかあり得ない。
>>179 宣言なしの時に戻り値や引数がint扱いになっちゃうとかじゃない?
想像だけど・・・。
>>179 >>180 ん?共通で使用する関数をヘッダファイルで宣言しておけば、
複数のコンパイル単位(cソース)をまとめてコンパイルしたときに
コンパイラが人間側の関数使用時のミスを捕捉しエラーにしてくれるよね?
すなわち「コンパイルが通ったときのPGの完成度」が上がるわけで、
これを「コンパイルの精度」と言ったのだが?
187 :
デフォルトの名無しさん :02/11/08 19:34
K&Rでもやっている。
188 :
デフォルトの名無しさん :02/11/08 19:36
>>183 #include <stdio.h>
main()
{
int test();
printf("%d\n",test(3));
}
int test(x)
int x;
{
return x*x;
}
これってCではダメなんですか?
LCIC-86試食版ではコンパイルできたんですが。
>>188 関数へのポインタの簡易記述のような気がしてきた今日この頃。
191 :
デフォルトの名無しさん :02/11/08 19:41
#include <stdio.h> main(){ printf("%d\n",test(3)); } int test(x) int x;{ return x*x; } }
>>188 > (もしかしたら実際にコンパイル通るかも知れないけどそれはコンパイラ独自の拡張機能)
>185 まぁそれをコンパイルの精度と呼ぶのかどうかは別として〜だ。 たしかにそれを追求していったのが最近の言語の流れだろうな。 でもそれって精度って言うのか?よく分からん。俺が馬鹿なだけか?
>>191 インナー関数は C++ でも書けない。
>>185 「コンパイルの精度」 なんて言われたら普通コンパイラの挙動が正確かどうか
という事を思い浮かべるぞ。
オレ語は使うな。
173 の文脈じゃあ 185 の内容は普通考えつかない。
>>183 うーん、ほんとにCではだめで独自拡張にあたるんだろうか。
関数宣言も変数宣言も宣言の一種であって、ブロックの先頭ではそのブロック内
スコープとなる宣言ができるから、Cでも問題ないような気がするんだけど、
私が規格を読みきれていない可能性もあるので、今一つ自信がない。
>>183 では断言してるから、 きっと根拠があるんだろうけど…。
>>191 括弧の対応が取れていないが、一番最後の括弧が余計だとすると、これは
ANSI以前の古いプロトタイプ宣言なのでは?
>>193 オレはなんとなくはわかった。
というか、共通ヘッダファイルの役割から、
推測しちゃったのかもしれんけど。
少なくとも
>>172 に対して使う言葉じゃねーな。
もしかして、僕が使ってる本ってダメダメ?w
k&rでもやってるからなあ。
C++では宣言と文の混在が許されてるけど、Cでは { 宣言… 文… } の
順しか許されてないから、例えば
int main() {
printf("start\n");
int hoge(int x);
printf("%d\n", hoge(3));
return 0;
}
こんなのがC++では通ってCではダメ、というのは分かるんですよ。
でも
>>175 のケースなら、Cでも文法的な問題はないと思うんだけど…。
204 :
デフォルトの名無しさん :02/11/08 20:06
前橋本もってないんであれだが、 mallocのエラーチェックをする関数を作って使えとか、そんなんじゃない?
>>204 Cの場合結局エラーチェックをする関数からのエラーも見なきゃならんわけで……
(いきなりassertとかじゃないね?)
どっちかって言うとcallocの簡易版みたいな奴とかmallocとreallocを統合した版かなぁ
とか思いました。違うかな?
エラーだしてexitして終わる。
つか、どういうのを「皮をかぶせて」と呼ぶのかを知りたいんじゃない? malloc()を元にして、例えば void *d_malloc(size_t size) { void *p; if ((p = malloc(size)) == NULL) { printf("もうダメぽ\n"); exit(1); } return p; } こんなのを作ったりすること、でいいのかな? ここで、d_malloc()はmalloc()のラッパー関数だとか言うよね?
>197 cl -W4をつけると、 >warning C4210: 非標準の拡張機能が使用されています : 関数にはファイル スコー >プが与えられています。 ってちゃんと指摘してくれる。
void *d_malloc(size_t size) { #include <stdio.h> #include <stdlib.h> void *p= malloc(size); if (!p) { fputs("皮かぶせますた\n", stderr); exit(1); } return p; }
>>208 なるほど。実際に警告がでるんですな。
gccだと-Wall -pedanticでも何も出ないけど、まあgccも絶対ってわけじゃないしな。
サンクス。
>>209 関数の中で#include使ったらマズーではない?
漏れが必死に関数ないプロトタイプの可否を C99 規格書で検索中。 でももしかしたら可かも知れない。 ANSI 規格書持ってる人居ない? ちなみに 209 は可。 プリプロセッサはテキストマクロだから C/++ の 文意に関わらずどこに出現 してもいい。
1.足し算関数を作成しなさい int hoge( short* a, short b ) 引数 short* a 加算先 short b 加算数 戻値0 正常 1 加算でオーバーフロー …という問題が出されたんですけど、わかりません。
#include<stdio.h> #include<stdlib.h> short *wk; int hoge( short *a, short b ); int hoge( short *a, short b ) { int c=0; printf("%d",wk); if(abs((long)a+ (long)b)>0x7fffL)return(1); elsereturn(0); } void main(void) { short b; while(!(hoge(wk,b))) { rewind(stdin); printf("input num... >"); scanf("%d",&b); printf("%d\n",hoge(wk,b)); } } なんとかここまでできたんですけど、どなたか助けていただけませんか?
ていうか、できる・できないは別としてなるべく分かりやすく書くスタンスは 堅持してくださいお願いします。
>>214 いや、#include自体はソースのどこにあっても問題はないんだけど、
そのヘッダファイルの中身が問題で。
もしヘッダでinline関数の定義とかがあったらアウトですよ。
(Linuxなんかじゃ実際多用してるし)
>>214 ANSIじゃなくてJIS X3010の文面だけど、見つけたよ!
やっぱり規格の読みが足りなかったか。
6.5.1 記憶域クラス指定子 で、
「関数を表す識別子がブロック有効範囲をもって宣言される場合、extern以外の
明示的な記憶域クラス指定子をもってはならない。」
という文があった。ということで、
>>175 は文法違反だったのか。
関数内でexternでプロトタイプ宣言をやることはあるから、文法的にいけると
思ってたんだけど、こんなところに例外があったとはね。勉強になった。
ん、まてよ。
『明示的な』記憶域クラス指定子をもってはならない、ということは、
たとえば関数の中でstatic関数のプロトタイプ宣言をやるのはだめだが、
>>175 は記憶域クラスは指定されてないから、可ということにならないか?
こうなるとANSIの原文を参照したくなるが…(持ってないけど)。
やべー大発見! a=a/2と a/=2って同じだよね!?
>>225 字面が違います。
やってることは同じです。
ちなみに
a>>=1
も(ある条件を満たせば)同じ意味になりますが、こういう書き方はやめましょう。
void foo( int *a, int *b ) { int tmp=*a;*a=*a/*b;*b=tmp; }
Cを始めて間もないのですが、コンパイラのLSI-C試食版てのを 使ってあるソースコードをコンパイルしようとしたら 「ファイル windows.h がオープンできない (No such file or directory)」 と出てコンパイルできないのですがどうすればよいですか?
>>226 字面は違う?あたりまえじゃん
やってることは同じだべ?
じゃあさ、a=a/2ってとこをa/=2って変えたら
バグ起きる場合ってある?
>>230 つうか、ふつうに C の文法なんだが...
知らなかったのか?
>>230 コンパイラにも拠るが、出力されるアセンブラコードが違うことはあるよ。
どっちも結果的な動作は同じなのでバグは発生しないはずだが。
基本的に a /= 2 と書いたほうが速いまたは変わらないはず、
なのだが俺は分かりやすいほうがいいと思うので a = a / 2 派。
c=a=a/2; は c=a/=2; にはできなったとおもいます。
>>なのだが俺は分かりやすいほうがいいと思うので a = a / 2 派。 プ(w
7゚{vv
>>233 だよね!やべーよ!このソース!
#include <stdio.h>
int main(void)
{
unsigned long a,k,k_max=0,y,y_max=0;
unsigned long data[99];
for(y=1;y<=100;y++){
a=y;
k=0;
while(a>1){
if(a%2==0){
a=a/2;
k++;
}
else{
a=a*3+1;
k++;
}
}
data[y-1]=k;
}
for(y=101;y<1000000;y++){ a=y; k=0; while(a>1){ if(a<=100){ k+=data[a-1]; break; } if(a%2==0) { a=a/2; k++; } else { a=a*3+1; k++; } } if(k>k_max) { k_max=k; y_max=y; } } printf("対象値が%dのとき計算回数の最大値は%dです。\n",y_max,k_max); return(0); }
ある正数yが1になるまで、『奇数なら3倍し、1をたす』、『偶数なら、半分にする』 繰り返した回数をkとして1〜1000000までのkの最大値とそのときのyをだすプログラムで 『1〜100までの結果を配列に蓄え、以降の計算に利用する』ってやつ a=a/2をa/=2に変えると、おかしな結果になる! なんで!!!すごくない!?
>なのだが俺は分かりやすいほうがいいと思うので a = a / 2 派。 こいつは ++i と書かずに i = i + 1 とか書いてるのか?
( ̄□ ̄;)!! オレはなるぞおおお なんでだああああ
>>243 ほんとに a = a / 2 を a /= 2 に変えただけ?
a = a * 3 + 1 を a *= 3 + 1 にしちゃったりしてないよね?
245 :
デフォルトの名無しさん :02/11/08 21:38
#define a (*foo()) int *foo() { static int bar, *p=&bar; return p++; }
i = i + 1 と対比されるのは i += 1 であって、++i ではないような・・・・・・。
>>244 マジでそれだけ変えた!まじまじ!
XPでBCCで、CPad使ってるYO!
しょーもないネタだったな
次はもっと面白いのにしてね
>>248
まずは、具体的な結果の比較を出すのが先であろう。
gcc on x86 だと最適化の有無によって結果が変わるね
253 :
デフォルトの名無しさん :02/11/08 22:31
char str[] = "ahoahoahoahoaho";この中から、すべての a を削除するルーチンを教えてください。ちなみに、2時間前にC言語の勉強はじめたとこです。
>>253 char *foo (void) {
static char s[] = "hohohohoho";
return s;
}
>>253 とりあえず、入門書を一冊読んで、理解してから質問してください。
そんなひどい……
257 :
デフォルトの名無しさん :02/11/08 22:37
void foo(char *s, char a) { while (s = strchr(s, a)) memmove(s, s+1, strlen(s)); }
char *delete_a ( char *str ) { char *s = str, *d = str, *l; while ( (l = strchr(s, 'a')) != NULL ) { *l = '\0'; while ( *s ) *d++ = *s++; s++; } return d; }
じゃあ結果だ! これがa=a/2のとき 対象値が837799のとき計算回数の最大値は524です。 -- Press any key to exit (Input "c" to continue) -- これがa/=2の時 対象値が992425のとき計算回数の最大値は992600です。 -- Press any key to exit (Input "c" to continue) -- ちなみにマジレスだから!みんな変わんないって事はオレだけ!? だれか変わった人いねーーがーー
260 :
デフォルトの名無しさん :02/11/08 22:41
void foo(char *s, char a) { char *t = s; while (*s) { while (*t == a) t++; *s++ = *t++; } }
261 :
デフォルトの名無しさん :02/11/08 22:43
同じだった。 #include <stdio.h> int main(void){ unsigned long a, k, k_max=0, y, y_max=0, data[100]; for (y=1; y<=100; y++) for (a = y, data[y] = 0; a > 1; data[y]++) if (a % 2 == 0) a /= 2; else a = a * 3 + 1; for (y = 101; y < 1000000; y++) { for (a = y, k = 0; a > 100; k++) if (a % 2 == 0) a /= 2; else a = a * 3 + 1; k += data[a]; if (k > k_max) { k_max = k; y_max = y;} } printf("対象値が%dのとき計算回数の最大値は%dです。\n",y_max,k_max); return 0; }
263 :
デフォルトの名無しさん :02/11/08 22:48
void foo(char *s, char a) { char *t = s; do { while (*t == a) t++; } while (*s++ = *t++); }
ありがとうございます。なんとかできそうです。
265 :
デフォルトの名無しさん :02/11/08 22:50
VRMLの質問はどのスレに行けばいいですか? もしや板違い?
266 :
匿名希望 :02/11/08 22:56
#include<stdio.h> int scan_uint(void){ int tmp; do{ printf("非負の整数を入力して下さい:"); scanf("%d",&tmp); }while(tmp<0); return (tmp); } int rev_int(int){ int tmp=0; if(num>0){ do{ tmp=tmp*10+num%10; num/=10; }while(num>0); } return (tmp); } int main(void) { int nx=scan_unit(); printf("反転した値は%dです\n",rev_int(nx); return (0); } 上記のプログラムは「読み込んだ非負の整数値を逆順に表示」するプログラムなのですが、13行目の式の意味が分かりません。どうか御教授ください。
267 :
デフォルトの名無しさん :02/11/08 22:58
tmp=tmp*10+num%10; tmp*10 + numの一桁目。 tmp=123, num=456だったら tmpは1236になる。
268 :
デフォルトの名無しさん :02/11/08 23:04
>259 Compilerはなんですか.Overflowとかが起こってんのかなあ.
270 :
デフォルトの名無しさん :02/11/08 23:07
>269 なるほど.
>266 123→321とするプログラムですよね。 (1)tmp=0,num=123 tmp=0*10+123%10=3 <num/10=12> (2)tmp=3,num=12 tmp=3*10+12%10=32 <num/10=1> (3)tmp=32,num=1 tmp=32*10+1%10=321 ってことでいいのかな。
273 :
デフォルトの名無しさん :02/11/08 23:25
>238 よく見たら,data配列のsizeの宣言がおかしいような.data[99]の値はちゃんと保存されてるのか?
>238 アハハハ、やっちゃったね。
275 :
デフォルトの名無しさん :02/11/08 23:31
どばーっと。
一匹でいいや
>>273 どういう事?
sizeの宣言ってdata[99]の99のこと?
でも1から100までだから、配列のサイズは99でしょ?
てか実際変えてるのはa=a/2のとこだけだから、
そこは関係ないと思う。
最もプログラムの本質に関わることだったらあれだけど・・・
>>278 何を言っているのか要領を得ないが、data[99] と宣言したら、使えるのは
data[0] 〜 data[98] だぞ。
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 サイズは10。
281 :
デフォルトの名無しさん :02/11/08 23:58
>>279 何言っているのか要領を得ないが、わかるようにはっきり言ったらどうだ?
記憶クラス(staticとかexternとか)について誰かわかりやすく教えてくれませんか? 手元の本を読んでもチンプン・カンプンなんで… ページでもいいからお願いします。(あつかましくてすみません) 勉強し始めて一週間とちょいぐらいのレベルです。
>>281 何言っているのか要領を得ないが、何がわからないのかはっきり言ったらどうだ?
>>283 まず、static の何がわからないか、extern の何がわからないか書いてくれ。
287 :
デフォルトの名無しさん :02/11/09 00:05
このスレ、なんで週末になるとレベルが低くなるの? int *p = data-1;
288 :
デフォルトの名無しさん :02/11/09 00:05
290 :
デフォルトの名無しさん :02/11/09 00:09
>>285 何がわからないのか…う〜ん
いままで(といっても一週間程度だけど) static とか使わないでソース書いてきたんで、
どうしてそんなものを宣言する必要があるのか? とか
だったら最初から外部関数でいいんじゃないの? とか
考えちゃうわけでして…
こんなんじゃだめですか?(抽象的でごめんなさいマジで…)
よくいるよ。強い口調で言ってみたものの自分が間違っていることに気づいたが
後に引けない
>>279 みたいなやつ。
>>291 外部関数 → 外部変数
です、間違えた
>>291 じゃ、何も知らないという前提でいいな。
まず extern だけど、これは関数や変数の実体を定義していないが、直ちに
使いたいという場合に用いる。
例えば、プログラムの規模が大きくなってくると整理の為にソースを分割して
コンパイルするけど、その際に file_a.c で実装されている関数 func1() を
file_b.c から呼び出したい時に 「extern int func1(int value);」 とか書く。
ただし変数でなく関数の場合、extern は通常つける必要が無く、単に
「int func1(int value);」 と書くだけでよい。
つまり、ファイルを複数に分割するつもりがないなら、覚える必要は無い。
static だけど、これはグローバル (関数外) で書くのとローカル (関数内) で
書くのとでは意味が違う。
グローバル (関数外) で書く static は、他のファイルのソースから extern
できないようにする。
static に指定するとそれは外側から見えなくなるので、file_a.c と file_b.c
で共に同名の変数や関数が定義されてても、ぶつかる事がない。
ローカル (関数内) で書く static は、これは変数にしか付けられないわけだが、
普通に宣言した変数と違って前回に呼び出された時の値をそのまま保存するよう
になる。
これは、例えば前回に関数が呼ばれた時間を覚えておいて、そこからの経過時間
を返したい場合などに使える。
・・・難しいかな?
298 :
デフォルトの名無しさん :02/11/09 00:28
>>293 static → 外部モジュールで参照不可
extern → 外部モジュールで参照可
>>293 static 変数とグローバル変数の大きな違いは、static 変数は関数の外側から
見えない事。
だから、別の場所で間違って値を変更してしまう危険を防ぐ事ができる。
さらに、その変数が他の関数では直接使われない事がすぐわかり、ソースを
読むのが簡単になる。
グローバル変数だらけのソースは一般に嫌われる。
(何がどこで使われてるかわかったものじゃないから)
300
Σ(゚д゚lll)ガーン
>>298 > extern → 外部モジュールで参照可
それは微妙に違くないか?
extern → 外部モジュールのを参照可に?
>>297-299 ありがとうございます!
extern は大体(思い込みかもしれないけど)わかりました。
要するにソースの規模が大きくなるならextern にしとけってことで(いいのかな?)
static はかなり疑問符をつけながら読んでますw
大まかな認識として値を保持し続けるってことでいいのかな?
ほんとありがとうございます。勉強しはじめなんで一気に飲み込むのは僕には無理があるようで、これから徐々に消化していきたいと思います。
でも、おかげさまでアバウトな面での認識はできました。
>>304 extern についてはちょっと違う。
extern は、関数を使いたいファイル側で使うの。
[file_a.c]
#include <stdio.h>
extern int square(int i);
int main(void)
{
printf("%d\n", square(2));
return 0;
}
[file_b.c]
int square(int i)
{
return i * i;
}
こんな感じ。
>>303 それが妥当な説明だね。簡単に言うなら。
>>273 1から100までなのに配列のサイズが99っておかしくねぇ?
おまえの理論は、1〜N個のデータはN-1個の配列に格納できるっつーことだぞ。
つまり、N=2とすると、1個の配列に格納できるって話になっちまうぞ。
もう一度よく考えれ。
>>304 staticは関数の宣言に使用した場合と変数の宣言に使用した場合で
意味が異なる。
static func() と使った場合はそのファイル内ローカルの関数になる。
また関数内で static int a;と変数を宣言した場合はauto変数でなく
静的に(スタック上でなくメモリ上に)確保される。
つまり関数外でstaticなしで宣言したことと同じになる。
extern func();と
func():は同じことだ。
どうだい、これでますますよくわかっただろう(w
>つまり関数外でstaticなしで宣言したことと同じになる。 リンケージは?
>>308 罠張るなよ。
グローバルの static 変数はどうなるんだ。
あと大抵の入門者は auto なんてキーワード知らんから持ち出すな。
>>307 何故それを 273 に向かって言う?
つーか、多分 「1 〜 100」 はループカウンタを言っていると思われ。
実際には N - 1 でアクセスしてる。
・・・それでも後ろに 1 つはみ出るけどナー。
(^^; もちっと勉強してから、でなおしてきますぜぃ! あ、でも使用用途が判らなかったから悩んでたんでそこらへんは解決しました! あとは勉強して自然と身につけるのみですよね
>>312 どうでもいいが、新たに質問したら、名前はそこの番号に変えた方がいいぞ。
知識ひけらかしたいのかもしらんが、無駄にレスが多くなるような回答はやめようべ。 ただでさえ流れるの早いんだから。
>>315 309 や 310 や 311 みたいな突っ込みもいかんのか?
1から100までって99個でないのか?
>>317 だから配列のインデックスは98が最高なんだから99にアクセスしたらまずいだろって。
もうこの話引っ張るのやめてくれよ。
死んできます。 探さないでください。
321 :
デフォルトの名無しさん :02/11/09 02:32
CでRS232Cに入出力するためにはどうしたらいいですか? 開発環境:Windows コンパイラ:VC++かCygwin
from
>>1 C 標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
323 :
デフォルトの名無しさん :02/11/09 02:46
>>322 開発環境依存ですか。ありがとうございます。
キーボードから入力とかディスプレイに出力ってのも環境依存だな。 大抵は標準入出力を使ってやりとりすれば出来ると思うけど。
週末にこの寂れ様・・・
>> 325 厨がわいてた方がいいと言うのか?
しかしこのスレ回転速いな・・・。
>>327 ス ス
レ
レ
ス レ ..┌→─→─→─→─→─┐ ス
│ ↓ レ
↑ │
│ ↓
↑ │
レ .└─←─[. 0.001 秒 ]─←┘ レ ス
ス レ レ
ス
ス
という事でよろしいか?
1kHz じゃ、まだまだだな。
|| ∧||∧ ( ⌒ ヽ トゥトゥトゥマシェーリー ∪ 。ノ トゥトゥトゥマシェーリー ∪∪
||
∧||∧
( ⌒ ヽ
>>328 ∪ ノ
∩∪∩
(・∀・| | クヨクヨスンナ
| |
⊂⊂____ノ
彡
________
首絞めてる首絞めてる
>>329 おまいは回転速度をHzで数えるのか。
普通rpmだろう。
周波数≠回転速度
328 は 60,000 rpm か? 並みの HDD よりは速そうだな
gMyLovelyHoge mMyLovelyHoge などの変数名で、g や m についてだけd、g はglobalでわかるけど、mはなに?
strncpyとmemcpyってどうちがうの? 規格見たらほとんどいっしょだよ。 でもmemcpyは仮引数が*void型だけど。 結局何が違うの? strはstringだよね? memってもしかしてmemory? てことはmalloc系? よくわからん・・・ 質問責めでごめん
おい!void main(void)はなにがいけないんだ。 俺は昔っからこう書いてるんだが 最近はみんな返り値intにしてるらしいじゃねか。
>>338 別にいけなくはないだろ
コンパイラのワー人グがうざけりゃintかえしとけ
>>338 だってint型を返すんだもん。
ちゃんとreturn EXIT_SUCCESとかすれば?
混乱してきました。 charへのポインタ型のstrがあって、 *str++ってしたら、str[i+1]って事だから、 次の文字を指しますよね? str++ってのは、どういうことなんですか?
342 :
デフォルトの名無しさん :02/11/09 12:21
>>341 ちがうよ。
*str;
str++;
の2つを一文で書いてるだけ。
343 :
デフォルトの名無しさん :02/11/09 12:23
>>337 途中に'\0'があるときの動作が違う。
>>341 後置された++は参照されたあとに変数の値を増加させる演算子
str++ならstrが参照されたあとにstrが増加する
つか、これくらい本買って嫁
345 :
デフォルトの名無しさん :02/11/09 13:31
memcpyはこう使える。 #include <stdio.h> int s[5], t[]={1, 2, 3, 4, 5}; int main() { int i; memcpy(s, t, 5*sizeof(int)); for (i=0; i < 5; i++) printf("%d\n", s[i]); }
>>344 だから、strが増加するってどういうこと?
347 :
デフォルトの名無しさん :02/11/09 14:39
str++はstrが次の要素を指すようにする。
*str++ってさす先のものを1増やすんだ? でstr++が次の要素をさすんだ?
>>348 違うよ。
*str++ は *(str++) と同じ。 (*str)++ ではない。
そうだった! *より増分演算子の方が優先度たかいんだったね。 三区す
#include <stdio.h> int main(void) { int vc[]={0,1,2,3,4}; int vd[]={0,1,2,3,4}; printf("vc=%d\nvd=%d\n",*vc,*vd); *vc++; printf("vc=%d\nvd=%d\n",*vc,*vd); return(0); } で、このソースなぜダメ?
352 :
デフォルトの名無しさん :02/11/09 15:03
*vc++; 配列名は演算不可
*vc++; アドレスを変えられるのはポインタだけ
そうなのか・・・。 オレの認識だと、配列はポインタにすぐ読み替えられるって書いてあったから、 こんなのもありだと思ってたんだけど
355 :
デフォルトの名無しさん :02/11/09 15:05
*(vc + 1); なら可
>>348 具体例を挙げて説明すると
char s[] = "ABC";
char *str;
int ch;
str = s; /* strが 'A'の位置を指す */
ch = *str++; /* chに 'A'が入り、strは次へ進んで 'B'の位置を指す */
#include <stdio.h> int main(void) { int vc[]={0,1,2,3,4}; int vd[]={0,1,2,3,4}; int *v=vc; printf("vc=%d\nvd=%d\n",*v,*vd); *v++; printf("vc=%d\nvd=%d\n",*v,*vd); return(0); } これにしたら警告が出るんだけども・・・ 警告 W8019 test7.c 9: コードは効果を持たない(関数 main )
360 :
デフォルトの名無しさん :02/11/09 15:10
(*v)++; では?
>>358 サンクス!宣言の時は違うってことかな・・・
362 :
デフォルトの名無しさん :02/11/09 15:10
>>357 *v の値は参照する必要ないでしょ。
アドレスを加算させるだけだから、v++; でおk
>>359 ほんとだ・・
ちょっと待ってよ。
*v++は*(v++)と等価だから、「vをインクリメントした先にあるもの」だよね?
v++は「vをインクリメント」で、vってのはつまり配列?
あーわかんねー。*v++はなんでだめなの?
v++;アドレス演算という言葉を出せば良い
vはアドレスか!そうだね。v=&vc[0]で宣言してるってこと? vをインクリメントすると、アドレスが増える。 たしかT型へのポインタだとして、T型のサイズ分だけ増えるんだよね?
369 :
デフォルトの名無しさん :02/11/09 15:19
こんな昼間から飛んでしもたやんけ
vはintのポインタ型の変数。 v++はvと言う値をインクリメントすると言う事。 *(v++)は*v++と同じ。 *v++は評価結果として*vを返し、v++を行う。 この文脈では*vを返す必要は無いのでv++でok.
>>368 読んだよ!でもいまいち分かってないかな?
配列とポインタが別物ってのは分かった。3つの場合を除いてね。
>>371 返すってことは例えばchar buf[256]があって
bufにvcの文字列をコピルときとかbuf[i]=*vc++;
ってやんのはおk?
要するに、*vc++でも問題はないんだ? でもこの場合は別に*vを返す必要なんてないから vc++にしろってコンパイラが言ってるってこと?
>>373 ok.
俺は分かり易さを考えるとあんまり使わないが。
そんな文が必要になる時は大概for文中でインクリメントする。
みんなありがとう!ちょっと分かった気がするYO!
379 :
デフォルトの名無しさん :02/11/09 17:59
380 :
デフォルトの名無しさん :02/11/09 18:10
>>350 *と++(後置)は優先順位は同じはず。
ただ右から結合するから++が先に実行される。
math.hのexpの実装ってどこを見ればわかりますか?
だから環境書けって。
すいません。solaris7のgcc 2.95.1です。
>>380 それはK&Rでない?
規格だと*と++(後置)は++の方が優先順位は高い。
ただし++(前置)は*と優先順位が等しい
glibはアセンブラだな<expe^x = 2^(x * log2(e))なんて変換して計算してる。
>>380 >>384 優先順位が同じだろうが、後置の方が高かろうが、
単項演算子の結合規則は右から左なので同じ結果になる。
つーか必要ないなら式の中で副作用を伴うものを使うなよ。 buf[i]=*vc++; みたいに。
388 :
デフォルトの名無しさん :02/11/09 18:57
初心者ですが、質問です。 1.dat 2.dat ・ ・ とデータファイルがあって、2番目のデータを読み込みたいとき n=2; "n.dat" とすると、エラーが出るのですが 一般的にはどんな方法がありますか?
>>388 具体的なエラーとかでもちゃんと書いてみたら(w
390 :
デフォルトの名無しさん :02/11/09 19:04
>>389 こたえる気がないくせに茶化さないでください。
あなたみたいなのがいるから2チャンネルはだめだといわれるんです。
ほかの方、よろしくお願いします。
392 :
デフォルトの名無しさん :02/11/09 19:06
>>386 > 単項演算子の結合規則は右から左なので
ハァ?
まともに答える気が出なくなるような質問の仕方をする方がどうかと思うが。
>>392 ∧∧
/⌒ヽ) 右から左は前置だけだね・・・。
i三 ∪ すまん。逝ってくる
○三 |
(/~∪
三三
三三
三三
>>388 一般的にはファイルをオープンして一行目のデータを読み飛ばして二行目を読んでファイルをクローズします。
コードはプログラミング言語を勉強して自分で努力して書いてください。
>>385 なるほど。
そうなるとlogはどうなってるのかとか2^xはどうなってるのか、と気になってしまいます。
標準ライブラリのソースコードはないのでしょうか?
397 :
デフォルトの名無しさん :02/11/09 19:17
++a; ←これが前置で、 a++; ←これが後置だよね?
sprintf(buf, "%d.dat", n); fopen(buf, "r");
388は何がしたいのかよくわからんぞ。 391は釣り師のような気がするが。
>>396 2^xが2のx乗ということなら、powを呼んでいるだけだと思うけど。。。
>>388 こんな質問で、どこでどんなエラーが出るか分かるの思うのか?
で、多分sprintfすりゃあ解決ってことかと推理。
推理させるなヴォケ
あ、ネタか?
402 :
知りたい人 :02/11/09 19:20
文字のAを10進数の1、Bを2とCを3といった感じになおしたいのですが、 文字コードを使って上手くできませんかね。ちょっとした例文を求む。
>>396 ソースコード拾ってくれば?
おいらはいつも見れるように主要ソースコードは展開させて置いてる。
文字 - 'A' + 1
405 :
デフォルトの名無しさん :02/11/09 19:23
LPARAMのポインタを引数に持つ関数に対してlongの変数を使用していました。 こんな感じ。 long abc; func((LPARAM *)abc); わざわざキャストする必要ありませんか? 将来性を考慮するとキャストする必要ありますか? どっちがいい?
char c; int i; i = c-'A';
>>405 整数をポインタにキャストするのって0以外は怖いんですけど・・・
キャスト以前にどうしてlong変数を使用しているのか聞きたい。
(LPARAM)&abcの間違い?
じゃなくて、 (LPARAM *)&abc
LPARAM *abc; func(abc);
void *abc;
413 :
デフォルトの名無しさん :02/11/09 19:48
>>405 キャストして動いてるんならそれでいいんじゃないかと。
将来性(と移植性)を考えると、longを使用するのを止めた方がいい。
>>410 すんません。その通りです。
>>408 元々のデータ構造がlongを使用しているんでしが、リストビューに割り振れる値がLPARAMでしょ。
だからこうなりますた。
>>413 データ構造的にはlongを使いたいんですよね。
リストビューに割り当てるのを考え直した方がいいんでしょうか?
データを格納したポインタを割り当てるとか。
でも、ポインタも4byteだし、あまり意味は無いかも知れない。
ソースを検索してみたら、short値をリストビューに割り当ててることもありました。
func((LPARAM *)&shortparam);
ま、問題なく動いてはいますが。
自分の考えとしては、元々のlong,short値の範囲内で関数に渡しているし、同じ
変数を使っている限りはデータ落ちはないかと。
今後sizeof(LPARAM) >= sizeof(long)の条件が崩れた場合恐いんですが。
415 :
デフォルトの名無しさん :02/11/09 20:33
391は釣り師のようです。 例えば、「65.dat」という名前のデータファイルを読み込みたいときに n=65, "n.dat" と記述すると、"n.dat"という名前のファイルは見つかりません。って エラーが出るのですが(当たり前?) 65.datを呼び出すにはどう記述すればよいのですか?
>415 あんた誰?
417 :
デフォルトの名無しさん :02/11/09 20:37
>>405 ウインドウメッセージの都合上いたし方ないのでは。
LPARAM abc; func(&abc);
421 :
デフォルトの名無しさん :02/11/09 20:47
>>419 C++です。
65.dat
70.dat
75.dat
と次々に読み込んでいくにはどう記述すればいいのでしょうか?
"n.dat"じゃ無理(当たり前)なのは分かりました。
>>415 n=65, "n.dat"って記述したらコンパイルエラーですが何か?
n=65; sprintf(buf, "%d.dat", n); fopen(buf, "r");
424 :
デフォルトの名無しさん :02/11/09 20:51
>423 398のVerUp版だね(笑)
428 :
初心者&rlo;者心初 :02/11/09 21:03
マイナス(符号付き)はメモリの中ではどのように 扱われているんですか? あと、ビット演算する時は変換文字を%uにしないと正しく出力されないのは なぜなんでしょうか?教えて下さい。
マイナス用のビットを持っていることもあるし 2の補数のこともある。
430 :
デフォルトの名無しさん :02/11/09 21:05
>>427 親切にnへの代入の仕方を教えている。
バカにしてるのだろうがな。
>>431 同意。
rloつかうなら「日稿投」はやめてほ&rlo;いし&lro;ね。
#何気にテストw
>432 違うよ。 既に解決策が398に載ってたのに見逃している421をあざ笑ったつもり。 スマソ。
>>417 ,all
仕方がないということで宜しいでしょうか?
437 :
デフォルトの名無しさん :02/11/09 21:52
long abc; LPARAM hoge=abc; func(&hoge); abc=hoge;
つーかリストビューと絡めるなら Windows Programing スレか Win32API スレに 逝ってくれ。 C じゃなくて C++ なら C++ スレに逝ってくれ。 あと C++ 使ってる香具師に fopen() を教えるな。
C++知らなくてな。スマン。
>>414 > 今後sizeof(LPARAM) >= sizeof(long)の条件が崩れた場合恐いんですが。
呼び出す関数がブラックボックスなら、逆( <= )だと思うが。
そうじゃなく、自前のコールバック関数を呼び出す時に一旦
LPARAM*を 経由しているだけなら、LPARAMとlongのサイズでなく、
LPARAM* と long* の違いの方が重要だと思う。
>>440 >呼び出す関数がブラックボックスなら、逆( <= )だと思うが。
あれ。逆でつか?
関数側sizeof(引数)が大きければとりあえず問題ないとオモタのですが。。
>そうじゃなく、自前のコールバック関数を呼び出す時に一旦
>LPARAM*を 経由しているだけなら、LPARAMとlongのサイズでなく、
>LPARAM* と long* の違いの方が重要だと思う。
これでハッとしますた。
確かにアドレスが渡ってるだけだから、メモリリークの可能性がありますね。
でも、
short st;
long lg;
st=(short)lg;
リトルエンディアンの場合、このようなキャストをするとlgの下位2バイトが
stに入るという「C言語仕様」?でしたが、関数の引数をキャストした場合は
仕様的にはどうなんでしょ?
先に書いた通り、メモリリークの可能性があるならば
>>437 の例でも問題あり
ますよねえ?
abc=(long)hoge;これくらいは要りそうだが。
LPARAM abc;って宣言に変えた方がいいんでは?
皆さん、ひとつ質問をさせてください。 C FAQによると「配列は簡単にポインタに成り下がる」のとおり、 関数の引数としてcharの配列を渡すとポインタとなってしまい、 sizeofなどで長さが取れなくなってしまいますよね? で、自分が使用している環境ですと、構造体にcharの配列を持たせて、 この構造体ごと関数の引数として渡すと、関数の中でも問題なく配列として扱えるのですが、 これってどこでも使える汎用的な手段なのでしょうか?
>>441 > 関数側sizeof(引数)が大きければとりあえず問題ないとオモタのですが。。
たとえば仮に sizeof(long)==4, sizeof(LPARAM)==8 だったとすると、
こちらが渡した4バイトのデータを、
関数側は8バイトあると見なして読み書きするわけだけど。
それと、上では忘れてたけど、関数が要求してるのが配列の場合は
(ポインタでなく)値自体のサイズも重要になるね。
> 確かにアドレスが渡ってるだけだから、メモリリークの可能性がありますね。
なんでメモリリークなんかが出てくるの?
俺が言ってるのは、例えばポインタのサイズが
sizeof(long*) > sizeof(LPARAM*) の時にまずいという話。
といっても将来そうなることは無い気がするけど。
> stに入るという「C言語仕様」?でしたが、
C言語の仕様ではなく、CPU依存の話だね。
俺も皆の意見と同じく、気になるなら値を一旦LPARAM型変数に
キャストした方が安全な気がする。
445で書いた > 俺も皆の意見と同じく、気になるなら値を一旦LPARAM型変数に > キャストした方が安全な気がする。 これは、コールバック関数用でなく、 ブラックボックスの関数に単なるパラメータとして渡す場合ね。
>>444 それで問題無いなら問題無いです。
ただし、配列が丸ごと値渡しされるので、サイズによってはとんでもなく遅くなります。
あと、ポインタではなく値で int とかを渡した時と同様、呼び出し元の値の変更は
できません。
>>444 「どこでも使える」かどうかと言えば「使える」と言う。「どこでも使われている」かどうかと言えばちょと疑問。
>>444 規格(ANSI)では使えることが保証されてる。
sizeofで長さを計りたいからと言う理由なら、
構造体ポインタを渡すだけでもいいのでは。
でもサイズを計るためにわざわざ構造体を使うくらいなら、
配列とサイズの2つのパラメータを渡した方がいい気がする。
>>444 構造体のポインタを渡すというのが一般的。
固定長の配列なら長さを渡す必要もないわけだが
452 :
デフォルトの名無しさん :02/11/10 00:21
TRUE=非ゼロ という定義に関しての質問なのですが hoge()という関数がBOOL値を返す場合 if ( hoge() == TRUE ) よりも if ( hoge() ) と書いたほうが良いのでしょうか? もしTRUE が 1 と定義されていて、BOOL値がTRUEとして1以外を 返すと実行されないと思ったので。
皆さん、レスありがとうございます。 なるほど、構造体ごと渡すと重たいので構造体のポインタで渡すか、 または配列とサイズを両方パラメータとして渡す、のですか。 とりあえず今までいろいろ勉強のため書いたプログラムを、 ポインタで渡すよう修正してみます。 ありがとうございました。
BOOL値ってナニ?
Boolean(真偽値)のことです。 BOOLはVC独自の定義でした。端折ってすいません。
>>452 普通の発想(Javaのbooleanみたいにtrueとfalseの値しか取らない)
ならif (hoge())が当然だが(でないと
if ((...(hoge() == TRUE) == TRUE) == TRUE)...) と書くはめになる)
WinのAPIは戻り値がBOOLなのに1と0と-1を返したりするからなあ…
>>452 そう。だから、C++/C99でboolが組み込み型に導入された。
>>456 ます、なぜこんな質問したかというと、コードに
if (hoge() == TRUE)
と書けばhogeがBOOL値を返す関数だとひと目でわかるのですが
if (hoge())
だと、hogeは有効なハンドルを返すのか、何かの計算結果を返すのか
もしくは真偽値をかえすのか、パッと見てわからないですよね。
なので、できれば ”==”を使った表現をしたかったのですが
TRUEの値が一定でないと危ないコードになるかなぁと。
>if ((...(hoge() == TRUE) == TRUE) == TRUE)...) と書くはめになる)
if ( (hoge() == TRUE) == true )
とは違う意味なのですか?(TRUEが自分で定義したものでtrueが言語定義)
>>457 待った、デマは流すな。
C99 で定義されたのは、<stdbool.h> の _Bool だ。
C には結局 bool は無い。
>>445 >> 関数側sizeof(引数)が大きければとりあえず問題ないとオモタのですが。。
>
>たとえば仮に sizeof(long)==4, sizeof(LPARAM)==8 だったとすると、
>こちらが渡した4バイトのデータを、
>関数側は8バイトあると見なして読み書きするわけだけど。
>
>それと、上では忘れてたけど、関数が要求してるのが配列の場合は
>(ポインタでなく)値自体のサイズも重要になるね。
>
>> 確かにアドレスが渡ってるだけだから、メモリリークの可能性がありますね。
>なんでメモリリークなんかが出てくるの?
値自体のサイズが異なるんで・・・ちと実験例。
void func(WORD * wd)
{
*wd = 0xffff;
}
void main()
{
BYTE buf1,buf2;
buf1 = buf2 = 0;
func((WORD *)&buf2);
}
(続く)
>>456 なんか矛盾してない?
> WinのAPIは戻り値がBOOLなのに1と0と-1を返したりするからなあ
だから
if (hoge()) とか
if(hoge()!=FALSE)
と書くべきなのだが。
(続き) この場合、buf2に書き込みが行われる際にbuf1まで影響されないかと思ったんです。 (もしくはその逆のbuf1に書き込もうとしたらbuf2にも影響が・・・) 実験結果からいうと&buf1=0x0012f778,&buf2=0x0012f774とその差4byteだったので、 相互に影響は出ませんでちた。 なんで4byteの差があるのかわからないけど、これなら引数がDWORD *でも問題ない みたい・・・てか、実験して確認したらやはり問題なかった。 buf1とbuf2のアドレスが1バイト間隔だと思ってたんです。 私の考えていたメモリリークの可能性ってのは分かって戴けたかしら? ていうか、メモリリークの危険は無いと思って良いのかな?たまたまかな? 4byte以上の変数型ってあったっけ? >俺が言ってるのは、例えばポインタのサイズが >sizeof(long*) > sizeof(LPARAM*) の時にまずいという話。 >といっても将来そうなることは無い気がするけど。 これは私も無いと思いますね。 >俺も皆の意見と同じく、気になるなら値を一旦LPARAM型変数に >キャストした方が安全な気がする。 確かに皆様の言われることはよく分かりましたが、 ・・というか、上記実験結果の信用性次第なんでしょか?
463 :
デフォルトの名無しさん :02/11/10 00:44
これだ! if (hoge() != FALSE)
ごめん、今確認したら、 #define bool _Bool だって。 マクロだけどあることはあるみたいだ。
>>457 456氏が書いているように
>WinのAPIは戻り値がBOOLなのに1と0と-1を返したりするからなあ…
WinAPIのような関数を使わないといけない状態だと
一貫したコードがかけないんですよね。
# GetMessageなんてのが、まさにそうですよね。
>>463 そりゃまずいって(w
-1が返ったときはエラーなのにTRUEだと思っちゃう。
>>459 スマソ。C99ではboolはマクロだった・・・
ごめん。465を見て意味がわかった。
469 :
デフォルトの名無しさん :02/11/10 00:49
#include <stdio.h> void func(long * wd) { *wd = 0xffffffff; } void main() { int i; char buf[]={0,0,0,0}; func((long *)&buf[1]); for (i=0; i<4; i++) printf("%d\n", buf[i]); }
>>462 いったい何をやりたいんだか…
どうせ環境に思いっきり依存したことをやってるんだから、
自分の環境で動くなら良いのでは?
ちなみに、最近のCPUでは、1バイトの変数でも4バイト境界や
8バイト境界に整列させて割り付けるのはあたりまえだし、
doubleやlong longなど、一般的な環境で4バイトを超えるサイズの
データ型は色々ある。(構造体とか配列とかも…)
>>469 さっきは書かなかったけど、そのケースでは漏れる事が分かってます。
てか、最初それを例に書いてて、漏れて当たり前だと気がついて書き直した。w
つか元々真偽値の類いでは無い値も返す関数で真偽値の比較をする事が間違いでは?返り値-1とかは別の形で補足すべきだろ。
まあ「元々」といいだしたらBOOLと言って置きながら 3通り以上の区別しなきゃならん値を返すほうが間違いなんだが。
>>472 間違いだろうけど、存在するんだから仕方ない。
>>462 > この場合、buf2に書き込みが行われる際にbuf1まで影響されないかと思ったんです。
> (もしくはその逆のbuf1に書き込もうとしたらbuf2にも影響が・・・)
だから俺が書いた話がそれなんだが。
あんたはその逆(WORD*をBYTE*に渡す)を書いてたんだが。
> > 今後sizeof(LPARAM) >= sizeof(long)の条件が崩れた場合恐いんですが。
> 呼び出す関数がブラックボックスなら、逆( <= )だと思うが。
こう書いたはずだが。
> 私の考えていたメモリリークの可能性ってのは分かって戴けたかしら?
> ていうか、メモリリークの危険は無いと思って良いのかな?たまたまかな?
それはメモリリークとは呼ばない。
バッファオーバーランなら分かるが。
>>471 なにをいってるか分からんのだが。
コンパイラが空けて配置するからいいと思ってるのか?
こういう風に消してしまうことがあると思うのだが。
#include <stdio.h>
void func(long * wd)
{
*wd = 10;
}
void main()
{
int i;
char buf[]={0,0,1,0};
func((long *)&buf[1]);
for (i=0; i<4; i++)
printf("%d\n", buf[i]);
}
>>458 それは逆だろう。
ハンドルとかポインタ返す関数の時はINVALID_HANDLEとかNULLと比較すればヨイ。
if(hoge())ならhoge()はBOOLを返すと思え。
>>470 > ちなみに、最近のCPUでは、1バイトの変数でも4バイト境界や
> 8バイト境界に整列させて割り付けるのはあたりまえだし、
> doubleやlong longなど、一般的な環境で4バイトを超えるサイズの
> データ型は色々ある。(構造体とか配列とかも…)
どもです。了解しました。
つまり、メモリリーク(言葉の意味違う?)の可能性があるんですね。
>>441 で書いたキャストして代入(short変数=(short)long変数)の例では
キャストで動作が保証(CPU依存?コンパイラ依存な気がする)される
ので、関数引数でキャストした場合も問題なく動くのかと期待してました。
>>414 メモリ リークってfreeのし忘れだが
こうしる。
BOOL bRet = hoge();
if(bRet){
}
>>452 =
>>458 の主旨は返り値の内容の意味がわかりやすいかどうかだから
↑みたくするなりコメントつけるなり好きにしる。
> ていうか、メモリリークの危険は無いと思って良いのかな?たまたまかな? 多分変数を確保する時にBYTEも32ビット分確保されてるだけ。 つまり結果オーライになってるだけ。 呼び出し側を配列にして試してみるといい。
>>475 すんません。>478書いてる間に色々レスを頂いてましたね。
完全に理解出来ました&何度も指摘して頂いてるのに勘違いしっぱなして
申し訳なかったっす。
キャストするのは止めます。
どもありがとうございました。
>>458 そうか?
if(hoge())
が真だと、とにかくfalse/FALSE/NULL/0ではないことがひとめで分かる。
ちなみに、「リーク=漏れる」という解釈で「メモリ漏れ」という意味で 発言してたのでつよ。。 バッファオーバーラン・・たしかにそうですね。 バッファオーバーフローは? オーバーランと同じかな。
>>458 はそもそも真偽値に他の情報を求めるからまずいんでねぇか。
main(){int n,m,i,j;mat a,b,x; a=matrix(n,n);b=matrix(n,m);x=matrix(n,m); printf("Aはn×n行列、B,Xはn×m行列です。\n"); printf("n,mを入力して下さい\n"); scanf("%d,%d",&n,&m); printf("A,Bの要素を入力してください。\n"); for(i=0;i<n;i++) {for(j=0;j<n;j++) {printf("a[%d+1][%d+1]は?\n",i,j); scanf("%lf,&a[i][j]"); } } for(i=0;i<n;i++) {for(j=0;j<m;j++) {printf("b[%d+1][%d+1]は?\n",i,j); scanf("%lf,&b[i][j]"); } }x = gauss(a,b,n,m); freemat(a); freemat(b); freemat(x); } がコンパイルできても、実行できません。 mainの中が間違えてるっぽいんやけど。 誰か教えてください。ほんきわかんないんで。 配列とか、関数の定義は、できてる友達のと交換しても動くんで、このなかなんですけど
>>バッファオーバーフローは? オーバーランと同じかな。 違う
>>483 わかってないじゃん。
真だとfalse/FALSE/NULL/0以外の何であるか一目で分かってないし、
偽だとfalse/FALSE/NULL/0のどれであるかも一目で分かってない。
>>477 >ハンドルとかポインタ返す関数の時はINVALID_HANDLEとかNULLと比較すればヨイ。
たしかにそうですね。すいません。
RegisterClassの場合はどのような記述がいいのでしょうか?
(returnはATOM型になっています)
猫でもわかるプログラミングでは
if (!RegisterClass(&myProg))
return FALSE;
このように記述されていますが。
>>480 参考にさせていただきます。
>>483 >が真だと、とにかくfalse/FALSE/NULL/0ではないことがひとめで分かる。
そういうことではなく、関数がどういうタイプの戻り値を返すのかが
わかりやすいコーディングがしたいだけです。
真であるか偽であるかは、別の話なわけで。
>>483 同意。
漏れは
if(hoge())
という書き方して
if(strcmp(hoge, sage) != 0)
という書き方でこっちのほうを明示的視覚的に分かるようにしてる
バッファオーバーラン=バッファオーバーフロー
真偽値を返す関数は関数名を is... とか has... とかにすればよい
>>488 if(hoge())はそんなこと知らなくてもいい。
IsTrue/IsFalse関数(マクロ)を作ればいい。
すこし頭がごっちゃになってきましたが 1.ポインタやハンドルのときはNULLやINVALID〜などで比較する 2.bool値の場合は省略 3.矛盾している関数(GetMessage等)は個別に対応する。 ってのが、シンプルで確実なんでしょうか。
>>489 > if (!RegisterClass(&myProg))
> return FALSE;
RegisterClassの戻り値自体が必要なのではなくて、戻り値が真か偽かがわかればよいのだから
他の情報を求めなくていいじゃないか。
>2.bool値の場合は省略 trueかfalseしか返ってこないのであれば、0であることが確定している falseと比較する。ってものありましたね。
>>499 調べますた!
同じってことで理解しますた!
@IT用語辞典にて
関数が適当な名前だと省略すると定義を調べるまでbool値だと分からない罠。
たいてい成功したら非ゼロ、失敗ならゼロを返すんだから if ( hoge() ) ... if ( !hoge() )... で十分。そうでない場合だけ個別に対応すればいい わざわざ if ( hoge() != NULL )... if ( hoge() == NULL )... なんてやるやつはDQN
でも!=FALSEは否定の否定だから何もつけない方が却って読み易いと思う。 プログラミング作法か何かに載ってたが。
>>506 NULLと比較している時点で、こいつのレベルが分かってしまうんだが。
INVALID_HANDLE_VALUE だけは特殊だが、 false、FALSE、NULL は 0 である事が保証されている。 488 は何でこれらを区別したいのかわからん。
!=FALSE を付けるかどうかは、完全にプログラミングスタイルに拠る。 あってもなくても、コンパイラは同じコードを吐く。 例え最適化オプションが ON になっていなくても。
512 :
デフォルトの名無しさん :02/11/10 01:34
結論としてはbool型が無かったC言語が糞ということでよろしいですね。
つまり、どっちでもいい。 どっちかでならなければならないというのは間違っている。
>506 「ポインタやハンドルを返す」なら、返ってきた値捨てるなよ
他人が見ても分かりやすいようにする方針なら!=FALSEを付けるというだけだろ。
if((fp = fopen("hoge", "r")) == NULL)perror("test.c");
スタイルの話ならもうやめようぜ。 元質問はTRUEと比較するとまずいのでは?って質問なんだから。 A. はい、まずいです。どうしても比較したいならFALSEとしてください。 これで終わりなはず。
>>514 おまえは fgets() を使ったことがないのかと
おれとしては #define TRUE !FALSE とかして if(hoge() == TRUE)とかの方が良いな。 とにかく二重否定は避けたい。
なんだよ、うまい具合にNULL論争にチェンジさせる気かよ。
521 :
デフォルトの名無しさん :02/11/10 01:39
今のコンパイラじゃ どっちも変わんないよ。 if( hoge ){} ってやると ぱっと見 変数が ポインタか実数かわかんないじゃん。 んなことで if( NULL != hoge ){} 支持。
オレの意見はそんなに馬鹿らしいか...
>>514 お前はstrchrの結果も必ず保存するのかと
>>522 アホ
$ grep glib.h -e "TRUE.*FALSE"
#define TRUE (!FALSE)
>>519 hoge() が !FALSE を返してくれる保証があるならそれでもいいが。
>>523 面倒なだけだと思う。
>>527 お前がアホ。
ネタと書かれた意味がわかってない。
506を受けて書いているので、引数はないことを前提にしているのだが
>>527 あふぉはおまえ
if ( hoge() == TRUE )
がネタだっつってんの
>>529 いや、おまえの方がアホ。
俺の書いた意味が分かっていない。
早くも 514 が負け惜しみを言い初めました
はっきり言ってこんな事は仕事でプロジェクト組んで やっていれば、いやでも読みやすいようにし向けられるので どうでも良いのです。 人はそれをコーディング規約と呼びます。
コーディングスタイルの話は心底どうでもいい。
>>535 それには語弊があるぞ。
読みにくいように仕向けられるのコーディング規約なんか山のようにある。
スタイルの問題だと重々承知しているのだが、 if(hoge) で、 ifの仕様からしてhoge自体が真偽値/ポインタなら、さらに明示的に比較するのは 俺は抵抗がある。
コーディング規約の規約を作れ。
541 :
デフォルトの名無しさん :02/11/10 01:50
BOOLについて考えてみる。 ∧_∧ ∧_∧ ( ´Д`) ∧_∧ ( ´Д`) ∧_∧ / \ (´Д` ) / \ (´Д` ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ ||. . ( ) ~\_____ノ| ∧_∧. ||. .( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___( ) ~\_____ノ| ∧_∧ ___( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
ハンガリアンとかな
スタイルの話を「そうだねー。それもいいねー。」くらいに軽く流すならいいが 決まって熱くなる奴がいるから続けたくないんだよなぁ
>>539 C言語のifの仕様からして抵抗がある。
ifの中身は本来は真のbool型(true/falseのみ)でなければならないはずだ。
ついでにそんな所で代入できちゃいかん。
546 :
デフォルトの名無しさん :02/11/10 01:52
TRUEとは比較せずにFALSEと比較することで満場一致の様子 ∧_∧ ∧_∧ ( ´Д`) ∧_∧ ( ´Д`) ∧_∧ / \ (´Д` ) / \ (´Д` ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ ||. . ( ) ~\_____ノ| ∧_∧. ||. .( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___( ) ~\_____ノ| ∧_∧ ___( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
ハンガリアンは糞
C++なら、 if(HOGE *hoge = get_hoge()) って書けるが、これは明示的に比較する形で書けない。
550 :
デフォルトの名無しさん :02/11/10 01:54
bool型が無かったC言語が糞ということでよろしい! ∧_∧ ∧_∧ ( ´Д`) ∧_∧ ( ´Д`) ∧_∧ / \ (´Д` ) / \ (´Д` ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ ||. . ( ) ~\_____ノ| ∧_∧. ||. .( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___( ) ~\_____ノ| ∧_∧ ___( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
551 :
デフォルトの名無しさん :02/11/10 01:55
しかしそれではワンパターンとの声により再び議論 ∧_∧ ∧_∧ ( ´Д`) ∧_∧ ( ´Д`) ∧_∧ / \ (´Д` ) / \ (´Д` ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ ||. . ( ) ~\_____ノ| ∧_∧. ||. .( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___( ) ~\_____ノ| ∧_∧ ___( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
週末なのに論争もなくて寂しいからって、プログラミングスタイルという伝家の宝刀を抜いちゃいかん。
C言語のifの仕様がすべての元凶 ∧_∧ ∧_∧ ( ´Д`) ∧_∧ ( ´Д`) ∧_∧ / \ (´Д` ) / \ (´Д` ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ ||. . ( ) ~\_____ノ| ∧_∧. ||. .( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___( ) ~\_____ノ| ∧_∧ ___( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
>>544 C では、非 0 が真であると明確に定義されていますが何か?
556 :
デフォルトの名無しさん :02/11/10 01:57
そのAAキモイ
>>554 そもそも0とか非0がbool型にキャストできるのがおかしい。VBじゃあるまいし。
bool型だってどうせ中身は0と非0だろ?
だから何で C++ でもないのに bool の話をするんだ? ∧_∧ ∧_∧ Σ( ;´Д`) ∧_∧ Σ(; ´Д`) ∧_∧ / \ Σ(´Д`; ) / \ Σ(´Д`; ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ || Σ( ;) ~\_____ノ| ∧_∧. ||Σ( ;) ~\_____ノ| ∧_∧ . _/ ヽ \|Σ(´Д`; ). _/ ヽ \| Σ(´Д`; ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___Σ( ;) ~\_____ノ| ∧_∧ ___Σ( ;) ~\_____ノ| ∧_∧ . _/ ヽ \|.Σ(´Д`; ). _/ ヽ \| Σ(´Д`; ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
>>531 ちゃんと文読め。
二重否定を避けたいって書いてるだろうが。
どの話を受けて俺が書いたか考えろ。
VB じゃあるまいし、ってあたりが根拠レスだよな。 何がおかしいと考えてるのかわからん。
#define CMP(s1,op,s2) strcmp(s1,s2) op 0 CMP( "afo", ==, "vaka" );
コーディング時に 気をつければいいのだが、 if文の中に関数を書くのにも多少抵抗がある。 たとえで言うのなら、 if(hoge()) では式の評価が関数一つなので問題はないが、 if((hoge() && hage()) ではhoge()の結果が偽であればhage()は実行されない。 気をつけて書けば、実行速度が良くなるのだが、 評価順序を間違えるとバグの原因になる諸刃の剣。
>>560 ナニをいまさら...(w
あわてて glib 持ち出したのはおまえだろ?
>>560 > if(hoge() == TRUE)とかの方が良いな。
と
> とにかく二重否定は避けたい。
がどう繋がってるのかちっとも読めない。
第一みんな、if(hoge() == TRUE) の弊害の事を指摘してるのであって、
二重否定うんぬんの話は誰もしていない。
さっそくスタイルについて熱くなってるわけだが
568 :
デフォルトの名無しさん :02/11/10 02:07
/\ | /|/|/| ドドドドドドドドドドドド!! | / / |// / /| | / / |_|/|/|/|/| (´⌒(´⌒`)⌒`) | / / |文|/ // / (´⌒(´祭だ!!祭だ!!`)⌒`) |/ /. _.| ̄|/|/|/ (´⌒(´∧ ∧⌒`)`)`)⌒`) /|\/ / / |/ / (´⌒(´(,゚Д゚ )つ `)`) /| / / /ヽ (´⌒(´⌒ (´⌒( つ |〕 /⌒`)⌒`) | | ̄| | |ヽ/| 遅れるな!! ( | (⌒)`)⌒`) | | |/| |__|/. ∧_∧ ⌒`).ドし'⌒^ミ `)⌒`)ォ | |/| |/ (´⌒(´( ´∀` )つ ド ∧_∧⌒`) | | |/ (´⌒(´( つ/] / ォと( ・∀・ ) 突撃――!! | |/ ( | (⌒)`) ォ ヽ[|⊂[] )`) | / (´ ´し'⌒^ミ `)`)ォ (⌒) |
>>561 じゃあVB〜は取り消すよ。
数値とbool(真偽値)は全く別の概念だろ。それを相互に変換する理由が無い。
>>558 ほう、仕様ね。
で、C++ の話だとしても、0 や非 0 が bool 型にキャストできるのがおかしい
と思う根拠は何だ?
#define TRUE 1 #define FALSE 0 #define !TRUE FALSE #define !FALSE TRUE love
組み込みのbool型とtypedefと#defineを使ったbool型はどちらも使い勝手は変わらないと思うんだけど。
>>569 言語仕様で、できるようになっている。
その方が便利だからだ。
(多くの CPU は 0 と非 0 を判定するのに便利に命令セットを持っている)
その仕様を否定したいなら、変換してはならない理由を示せ。
>>570 > で、C++ の話だとしても、0 や非 0 が bool 型にキャストできるのがおかしい
> と思う根拠は何だ?
ハァ?
俺はそんなことはひとことも言っていませんが。
==TRUEの弊害はネタもとがちゃんと推測してるし、その後の数レスで終わってる。 いまはスタイル論争だけ。
577 :
デフォルトの名無しさん :02/11/10 02:14
>>572 別の概念だとキャストできるのがおかしいのは何故だ?
真偽値だろうが数値だろうが、データはデータだ。
変換できておかしくは無い。
もう話の焦点もぼけてぐだぐだです
>>573 否。
組み込みの bool 型は、非 false を受けた時 必ず true と認識する点で
typedef / #define とは明確に違う。
>>573 たとえ、
#define TRUE !FALSE
にしたとしても、
BOOL b = TRUE;
で困る。
>>581 #define false 0
#define true (!false)
こう定義すれば非falseは必ずtrueになると思うが
>>574 0と非0を判定するのに便利な命令セットを持っていることは
キャストできるのに便利な理由になっていない。
true/falseの実装が0/非0にすれば判定が便利になる命令ってだけだ。
よって変換できる理由は無い。ちなみに無いのもの理由を出すことは不可能。
566 を指したかったの
586 :
デフォルトの名無しさん :02/11/10 02:20
わかったから、とりあえず名前付けてくれ。お前ら。誰が誰だか さっぱりだ。
>>574 人はそれを0フラグと呼びます。
そしてOSのシステムコールではえてして
0が真となる仕様となっております。
>>587 真とか偽の問題じゃなくて、-1(負?)がエラーってだけだろ。
>>583 true 以外にも非 false 値はあるだろ。
それを受けたらどうなるんだ?
>>589 なんで?
!0==!0は真にならないの?
>>578 別の概念であってもデータである以上キャストはできるが
キャストした結果意味があるとは限らない。
数値(文字コードではなく)を文字にキャストしても意味は無い。
数値を真偽値にキャストしても意味は無い。
#define TRUE 1 #define FALSE 0 #define !TRUE 0 #define !FALSE 1 名前
>>584 0 と非 0 を判定するのに便利な命令セットを持っている事に着目して、C では
0 を偽、非 0 を真として扱う仕様になった。
その偽を false、真を true にそのまま変換したいと言う要望は無視するのか?
>>590 プログラマがtrueかfalse以外を入れようとすることまで面倒見切れるかよ。
>>591 !0 は 1 になる(よね?まあ、1でなくてもなにか特定0以外の数字になる)
で 3 や 5 は非false な訳だが、
true == 3
は偽になる
>>598 非falseは!falseでしかない。
それ以外を入れようとすることまでは面倒見切れない。
596 でした。また同じ間違い・・・
591だが、これは困らなかったよ。
>>595 最初っから真偽値型を作らなかったCが糞なだけ。
もし最初っから真偽値型があったのなら数値型に変換できる理由は無い。
>>600 だから、組み込み型ならそれでもOKなんだってば
&と|もな。
607 :
デフォルトの名無しさん :02/11/10 02:28
∧ ∧ ### / ヽ ./ .∧ /#####ヽ / `、 / .∧ / ##### \ /  ̄ ̄ ̄ ヽ / ##### ヽ l::::::::: .l / ##### ヽ |:::::::::: -==・- -==・- | | ::::::::: :::::::| .|::::::::::::::::: \___/ | | -・==- -・==- :::::::::| ヽ::::::::::::::::::: \/ 丿 | \___/ :: ::::::::| ヽ::::::::::::::::: / ヽ \/ :::::::::::| ____>::::::::::::::::: <_ ヽ ::::;;;::::::::丿 /:::::::::::::::::::::::: ::::::::: /⌒ヽ⌒、⌒、⌒、 ::::::::: :<___ |::::::::::::;;;;;;;;;;;;;::::::::::::::: / /ヽノヽノヽノヽノ ::::::::::::: :::::::: :::ヽ |:::::::::::::::::::::::: / /:::::::: ::::::::::::::::::::: :::::::: bool論争しに行こうか? いいねぇ〜
1:事実に対して仮定を持ち出す 「もし最初っから真偽値型があったのなら」
∧ ∧ ### / ヽ ./ .∧ /#####ヽ / `、 / .∧ / ##### \ /  ̄ ̄ ̄ ヽ / ##### ヽ l::::::::: .l / ##### ヽ |:::::::::: -==・- -==・- | | ::::::::: :::::::| .|::::::::::::::::: \___/ | | -・==- -・==- :::::::::| ヽ::::::::::::::::::: \/ 丿 | \___/ :: ::::::::| ヽ::::::::::::::::: / ヽ \/ :::::::::::| ____>::::::::::::::::: <_ ヽ ::::;;;::::::::丿 /:::::::::::::::::::::::: ::::::::: /⌒ヽ⌒、⌒、⌒、 ::::::::: :<___ |::::::::::::;;;;;;;;;;;;;::::::::::::::: / /ヽノヽノヽノヽノ ::::::::::::: :::::::: :::ヽ |:::::::::::::::::::::::: / /:::::::: ::::::::::::::::::::: :::::::: TRUELOZVE? FALSE
発端は南蛮だっけ?
>>605 boolなのにtrueと比べられないよりいいだろ。
>>565 だからちゃんと読めって!
俺は!=FALSEと書くよりも==TRUEが良いと言っているだけ。
if(hoge()==TRUE)の弊害?
アホか。
>>609 苦しくなったからって誤魔化すのはやめろ
true,falseより非0,0の方がわかりやすくていいな・・・ そういう書き方に慣れているからだろうけどね。
>>613 その話はとうの昔に終わってんだよハグェが
==TRUE はやめろ。どうしてもやりたいなら != FALSE
過去ログ読んで回線切って師ね
「if文中の式の真偽」と 「_Bool/book変数が保持する真偽」 の区別が付かない香具師がいるな
book->boolナ
620 :
デフォルトの名無しさん :02/11/10 02:34
book変数age
C言語最高! boolだとかガキ向けの言語仕様はすっこんでろ。 大人ならば全て自分の責任で判断するのさ。
0,非0でやっているからこそ文字列の終わりが偽となって便利なんだよ。
C の組み込み型に book 型キボン
624 :
デフォルトの名無しさん :02/11/10 02:36
ああそういえばC99には_Boolなんてのがあるんだっけ?
>>609 だからね。
>>595 のように、そのような仕様になっている理由はちゃんとある。
それを糞と呼ぶのは自由だが、「もし最初っから真偽値型があったのなら」 なんて
絶対あり得ない仮定はもっとクソだって言ってるの。
603 の方が苦しい発言だろうが。
return TRUE; return !TRUE;
だらだら長く書いて結局言いたいことは「だからそんなCは糞だ」 そんなのは頼むから他スレ行ってやってくれよ。
>>625 だから数値と真偽値が変換できる必要性を示せ。
利便性ちゃうかと
>>629 俺はそもそも真偽値(bool型)なんてない方がいいと思っているんだがどうだ?
632 :
デフォルトの名無しさん :02/11/10 02:39
>>629 595 を読んでまだ分からないか?
アフォですか?
636 :
デフォルトの名無しさん :02/11/10 02:41
>>634 \0は偽ですが。
もしもfalseのみ偽となり、0と互換性がなかったら偽とならず不便だ。
>>633 >>595 は0/非0を判定する命令があっても数値と真偽値が変換できる必要性とは
関係ないと反論した。
>>635 ・・・・・・・・。
Cでプログラム書いたことある?
>>636 だからどう不便なんだYO!
おまえら不便って言いたいだけちゃうんかと(略
641 :
デフォルトの名無しさん :02/11/10 02:43
なぜ数値と真偽値が変換されうるのかという声が上がり再び議論 ∧_∧ ∧_∧ ( ´Д`) ∧_∧ ( ´Д`) ∧_∧ / \ (´Д` ) / \ (´Д` ) __| | | |_ / ヽ、 .__| | .| |_ / ヽ、 ||\  ̄ ̄ ̄ ̄ / .| | | ||\  ̄ ̄ ̄ ̄ /| | | ||\..∧_∧ (⌒\|__./ ./ .||\..∧_∧ (⌒\|__./ ./ ||. . ( ) ~\_____ノ| ∧_∧. ||. .( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ. | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | | |ヽ、二⌒) / .| | | . .| ヽ \∧_∧ (⌒\|__./ ./ . .| ヽ \∧_∧ (⌒\|__../ ./ ヽ、___( ) ~\_____ノ| ∧_∧ ___( ) ~\_____ノ| ∧_∧ . _/ ヽ \| (´Д` ). _/ ヽ \| (´Д` ) . | ヽ \ / ヽ、 | ヽ \ / ヽ、 . | |ヽ、二⌒) / .| | | . | |ヽ、二⌒) / .| | | . .| ヽ \\ (⌒\|__./ ./ . .| ヽ \\ (⌒\|__./ ./ . ヽ、____ \\ ~\_____ノ| . ヽ、____ \\ ~\_____ノ|
>>640 strlenとか自分で書いてみれば分かると思うが
>>639 ある。
ちなみにおまえは C 以外でプログラム書いたことあるのか?
>>644 Perlを少々・・・
あれは文字列をひとつのものとして扱えるから。
646 :
デフォルトの名無しさん :02/11/10 02:44
真が非0ではそんなに不満なのか?
647 :
デフォルトの名無しさん :02/11/10 02:45
>>643 strlenでは文字のポインタが\0になるカウンタを+1しながら
まで繰り返すだけだろ。
649 :
デフォルトの名無しさん :02/11/10 02:46
bool main(){ return true; } のほうがいいですか?
訂正 strlenでは文字のポインタの値が\0になるまでカウンタを+1しながら 繰り返すだけだろ。
ch != '\0' 良いじゃん、これで。
今日は論争っぽく流れ早いけどあんまりおもしろくないな。
>>646 真が非0に、偽が0に”変換できる”ことが不満。
while(<STDIN>){ print; }
>>637 反論になってないよ。単に反対しただけだろう。
>>649 mainは真偽値を返すのではなくエラーコードを返す方がなにかと便利だから
やっぱりintがいいんじゃない。
不満・愚痴は死滅スレかマ板で
660 :
デフォルトの名無しさん :02/11/10 02:50
0 == 0ってどんな値を返すの?
662 :
デフォルトの名無しさん :02/11/10 02:50
while(<>){ print; }
663 :
デフォルトの名無しさん :02/11/10 02:50
Cに真偽値が追加されても(C99には既にあるみたいだが)、実際に使うことはなさそうだなー
Perl厨はきえろ
>>661 どこが反論になってるかさっぱり分からないから、レス番号とその分を示せ。
>>663 真性のあふぉだな。ないと困るという声が強かったからこそ
わざわざ追加されたのに
668 :
デフォルトの名無しさん :02/11/10 02:52
>>665 世の中の潮流に合わせただけだと思っているんですけど。
でも使うことはなさそう。
ctype.hもあるからな。
670 :
デフォルトの名無しさん :02/11/10 02:53
>>667 おいおい。使われることはなさそうなんて言っていないぞ。
"俺は"使うことはなさそうと言っているだけ。
671 :
デフォルトの名無しさん :02/11/10 02:53
だから、お前らちゃんと名前欄に番号とかいれろ。誰が誰だか さっぱりだ。
>>666 じゃあ反論になってないと言うな。レスぐらい読め。
>>670 分かってるよ
つまりおまえは真偽値型の必要性が分かってないんだろ?
今のCのif文になにか不満でもあるの?
非0が真で0が偽でいいだろ。
676 :
デフォルトの名無しさん :02/11/10 02:55
677 :
デフォルトの名無しさん :02/11/10 02:55
678 :
デフォルトの名無しさん :02/11/10 02:55
自身の無い奴だけデフォルトで逝け。
TRUEと比べられないというアホみたいなことがなくてすむ。
string.hもあるしね
682 :
デフォルトの名無しさん :02/11/10 02:57
TRUEってのは何だ?
>>672 読んで分からなかったから訊いただけだ。
それとも、反論があることを証明できないのか?
その方法は簡単、666 の事を実行するだけだ。
そうしてくれないなら以降無視する。
やっぱFORTRAN最高!
ああそうか。 俺はtypedefdefineのboolを使ったことがないから、真偽値の必要性がわからないんだ。
>>680 ctype.hにはishoge系の関数があるだろ。
過去の資産もあるからそう簡単には変えられないだろうと言いたかった。
>>683 わからないが、617 はそう書けと主張している。
しまった・・・&#と書いたら?になっちまった。 typedef & #define
>>691 トークンはホワイトスペースで区切る癖をつけた方がいいぞ。
693 :
デフォルトの名無しさん :02/11/10 03:02
ホワイトスペースって何?
>>688 型が変わる程度でロジック弄る必要はないのでは?
>>692 はぁ・・・
プログラム書くときも開けていないや。みにくいかな。
696 :
デフォルトの名無しさん :02/11/10 03:02
Cでオブジェクト思考する方法を教えてください
>>693 isspaceが真を返すものかな?
スペースとかタブとか改行とか
>>696 勝手に思考してください
マジレスすると、GTK+ とかが参考になるかもね
γ γ ∧_∧ bool 論争終わり? γ (::::::::::: ) なんだか寂しいな・・・ ...................................... .(○::::::: ) .::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::........ ~"''"""゛"゛""''・、 ...:::::;;;'' ';;;:::::....... "”゛""''""“”゛゛""''' "j' ...::::;;;'' '';;;::::::......... :::::ヘ :::::....ヽ :::;;;ノ ::( ....::::::;; '';;;::::::::::....... :: ゝ :::::......ノ:;;../ ~~^^ ~~~~~^^^~
まあ、整数値が真偽値に変換できたほうが便利と言ってるやつらは 軒並みあふぉだったことは分かった
単項演算子と識別子の間は、空けない方が見やすいかも。
>>700 enum bool = { FALSE = 0, TRUE = 1, ERROR = -1};
これをやろう。
>>694 その形が変わるのがちょっとなぁ。
一方の自作ishogeは_Boolで既存のライブラリはintは違和感がある。
13:勝利宣言をする 「まあ、整数値が真偽値に変換できたほうが便利と言ってるやつらは 軒並みあふぉだったことは分かった」
だいたい真偽値っていってもマシン語コードにしたら整数値なんだから それらを区別する意味って何かあるの?
オマエラこんな毎晩論争してんの? お疲れさん。
709 :
デフォルトの名無しさん :02/11/10 03:11
便利というか簡潔になる。 char *s; for (s=str; *s; s++) ....; とか。
>>707 同じようなこと言ったら、仕様と実装の区別が付かない阿呆と言われますた。
712 :
デフォルトの名無しさん :02/11/10 03:15
>>709 for ( s=str; *s != '\0'; s++ )
でも十分簡潔だが?分かり安いし
まあ、おれは 709 で書くけどな
ばかばっか
>>711 慣れの問題じゃない?俺は比較してるほうが読みにくいかも。
*sより*s!='\0'の方が「'\0'になったら終了」って言う意味では分かり易い。
>>707 そんなことを言ったらすべてのデータはバイナリなんだからと区別する意味ってあるの?ってなりますよ。
高級言語になればなるほどマシン語コードから離れてより概念的なものになるもんです。
漏れの使ってるコンパイラの吐くコードは、*s でも *s! = '\0' でも変わらない。 だからどちらでもいい。 前者は C プログラマにわかりやすい。 後者は他言語プログラマにわかりやすい。
719 :
デフォルトの名無しさん :02/11/10 03:19
>>716 それならuntilとかの方が分かりやすい
*s=='\0'ってなるから。
ん? 701=714 は 685 に答えられなかった 672 なの?
>>717 個人的にはCでは区別しなくてもいいと思ってます。
>>718 他言語プログラマはそもそも文字列が文字の配列ってのがやりにくいかも。
717 は C が高級言語だと信じているのか?
724 :
デフォルトの名無しさん :02/11/10 03:21
>>722 いや、配列がコピーされて関数に渡らないことのほうが・・・
>>723 717じゃないが、+で二つの値を足せるだけでも十分高級だと思うが。
>>720 おいおい、おれは 701 だが 714 ではない。 672 も知らん。
728 :
デフォルトの名無しさん :02/11/10 03:23
725 が衝撃的事実を発表しますた
730 :
デフォルトの名無しさん :02/11/10 03:24
>>719 まぁuntilなんて予約語は無い訳だが。
>>719 そりゃそうかもしれんが、ここでは
for ( s=str; *s; s++ ) と
for ( s=str; *s != '\0'; s++ ) の場合だろ。
つうか前者ようなコードを初めて見て後者のコードと同じ意味と
すぐに分かった奴っているんだろうか?
>>724 ・・・どういう事?
引数に指定すれば配列丸ごと値渡しになるけど、そういう事ではない?
printfがあるだけでも高級だと思うが。
>>728 アセンブラだともっといろいろかかないとだめじゃん
>>729 一応高級言語は環境に依存しないという意味だってことは分かっています(^_^;)
#define until(x) while(!(x))
>>732 配列の先頭アドレスの値渡しだろ?
配列がコピーされるわけじゃない。
>>731 while (*s++ = *t++);
とかもな。
>>一応高級言語は環境に依存しないという意味だってことは分かっています(^_^;) そんな意味だったっけ?
Cが高級言語って知らない奴がいるのか? それとももっと高級な言語が出てきたからCが低級言語にでもなったとでもいうのかな。
>>738 ちがかった?
マシンに近ければ近いほど低級で、人間に近ければ近いほど高級だと思っていたけど
>>731 初めて見てそう判断するのは難しいが、そのような人は C プログラマーとは
言えないだろう。
printfはc言語の一部では無いけど。
>>734 RISCじゃないのは1命令で書けますよ
買わないといけない言語は高級言語・・・俺のリアル厨房の時の理解
C は、アセンブリ言語に比べれば間違い無くレベルが高いが、高級言語と呼んで いいかどうか迷うくらいにはそれとのレイヤーが薄い。
add $s0,$t1,$t2; $s0=$t1+$t2
747 :
デフォルトの名無しさん :02/11/10 03:30
Cは高級言語の中では低級な部類だと思っている。 でも低級言語だとはおもわないなー
昔は高級言語だったが今は高級言語ではない
今度はC言語は高級言語か論争かよ。
比較があっての高級低級であり 何と比較していたか、または何と比較しているかが本質と思われ。 そこを統一しないと永遠に論争は解決しないと思われ。
>>746 個々の環境の命令によらず+で足せるのは高級だと見ていい?
744 に則れば、ほとんどの言語が高級言語ではないな。
厨房言語==高級言語
>>747 アセンブリ言語とは明確に違う。
アセンブリ言語はコードに無い動作は絶対にしない。
C はある程度の裏処理があり、また逆に最適化によって書いてあるコードが実行
されない場合もある。
何が高級言語かって決まっているもんじゃないのか?
だれだ、このスレの最適化オプションを偽にしたのは?
Cは高水準言語だけど、文字列の扱いとかは低水準って言われるね。 だからC++ではstd::stringなんか使うわけで。
仕様です
>>758 x86命令からさらにマイクロコードに変換されて実行される
最近のIntelのCPUとかだとそうとも言えんのでは・・・・・・。
結局、752 が妥当だろうな。 ただ、アセンブリ言語が一番低級なのは間違いない。 それよりレベルを下げると、ソフトウェアではなくなる。
機械語を忘れてませんか?
768 :
デフォルトの名無しさん :02/11/10 03:41
環境は言語の高級さに関係無い。 言語仕様にのみ関係する。
高級言語で検索したらC言語が引っかかった
>>769 それが正しい根拠は。
検索エンジンの検索結果が正しいなら、いくらでも自作自演できるが。
#define 低級 アセンブリ言語 #define 高級 (!低級) (^o^)/
ひょっとして
>>4 の言うように1000取り合戦が始まっているのか?
if (C言語 == 高級) という風にしたいんですが・・・
>>775 それじゃダメだよ
!低級
とした時点である値に決まってしまうから
>>775 日本語の識別子が利用可能なコンパイラを使用してください。
778 :
デフォルトの名無しさん :02/11/10 03:47
ん? で結局C言語がboolが数値に、数値がboolに変換できるようにした必要性はどうなったの?
>>776 じゃあ if (C言語) ってすればいいんですか?
>>780 論争を引き起こした張本人はあんたか!?
>>778 それは便利だ(と思われていた)から。今となっては時代遅れだが
気付いたときには時すでに遅し。
>>776 もしくは if (C言語 != 低級)
>>781 ______
/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (6 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < 正直、すまなかった
|| | | | \ ┃ ┃/ \________
| || | |  ̄  ̄|
もともとC言語にboolなんてあったのか?
(!0):0で無いもの(であるべき)
>>784 ない。
C99には_Boolってのがあるらしいが。アンダーバーが決め手☆
>>785 コンパイラが複雑になるわけだ、それだと
(!0) -> (!偽) -> (真) -> 真
789 :
デフォルトの名無しさん :02/11/10 03:54
腹 減 っ た 。 ラ ー メ ン で も 食 う か 。
しかしあれだな。 真偽値がないと困るって言ってるヤツは Cでまともなプログラムを書いたことのない 他言語使いなんだろうな。 分かってるふりして参加してるだけ。
まともなプログラム書いてたら真偽値型が欲しいと思うんだけどな
無いと(表記がバラバラで統一されていない事により弊害が出る為)困る
>>789 ______
/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (6 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < 正直、うまい豚骨ラーメンを食ったことがない
|| | | | \ ┃ ┃/ \________
| || | |  ̄  ̄|
Cから始めた人なら使うことはあまりなさそうな気もする。
>>792 他言語使いってナニよ?
おまえはC言語しか使ったことないヒキコモリオタなんだろ?
うまくいえねーけど真偽値型ってプリミティブじゃねーよな。
> 無いと(表記がバラバラで統一されていない事により弊害が出る為)困る たとえあっても表記はバラバラになると思うが。 ゼロ/非ゼロだけで十分。
真か偽かが問題のときは if (b) か if (!b) でしか書かないからな
bool,_bool,__Bool,BOOL
>>800 ところが、わざわざ TRUE と FALSE を定義して
if ( b == FALSE )
したがるやつがいるわけですが
>>798 ______
/_ |
/. \ ̄ ̄ ̄ ̄|
/ / ― ― |
| / - - |
||| (6 > |
| | | ┏━┓| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | | ┃─┃| < 正直、intで十分。
|| | | | \ ┃ ┃/ \________
| || | |  ̄  ̄|
if (b) と if (!b) に統一する!!
> 他言語使いってナニよ? Cの基本を少しかじったてみただけのくせに その仕様の是非を語っている厨房のことだが。 つまりお前みたいな奴ね。
>>805 では次は算術シフトと論理シフトについて語ってみようか。
訂正。 × Cの基本を少しかじったてみただけのくせに ○ Cの基本を少しかじったみただけのくせに
>>805 (゚Д゚)ハァ?
おまえはひきこもって仕様書ばっか読んでて
実際にプログラム書いたことなんてないんだろ?
>>799 例え自分が使わないとしても規格として存在しているなら今後bool型を定義する奴は
少なくなるしソースを読む側の負担が減る。
>>809 あるよ。明示的に論理右シフトする方法がCにはない
引きこもりに引きこもり呼ばわりされちゃったよ。
>>810 じゃあ if (b == FALSE) と書けと言うのか?
>>811 それなら(unsigned int)ってすればいいと思うけど
>>814 あれ?それじゃダメだったんじゃ.....うる覚えスマソ
うる覚え・・・
>>813 そんな事は一言も言ってないが。
書きたくなけりゃ書かなければ良い。
>>816 大抵の処理系がsignedなら算術、unsignedなら論理になるってだけだと思った。
820 :
デフォルトの名無しさん :02/11/10 04:12
ラ ー メ ン 食 っ た 。
イ ン ス タ ン ト だ が う ま か っ た 。
>>789 博多にでも逝ったらどうだ。
しかし正直、俺様用しおりって役に立たないな。
>>813 つまり if が bool 型しかとれないようにすれば
if ( b == FALSE )
なんて書こうとするばかはいなくなるってこった
unsigned なら確実に論理シフトになると思うけど違うの?
b == FALSE が bool 型にならんのか?
なんかしらんけど、ブール値の扱いが問題なら #define isTrue(x) x==0 #define isFalse(x) x!=0 あたりにしといたら? 問題あったらココだけ置換して再コンパイル。 if(b==TRUE)だのif(b==FALSE)だのと書く人は、 C FAQ一回読んどいた方が・・・
>>824 だから大抵の処理系ではと言っているでしょ。
大体 if(hoge)と if(hoge!=FALSE) とか if(hoge!=NULL) if(!hoge)と if(hoge==FALSE) とか if(hoge==NULL) の違いって、パッと見て理解しにくいほど差があるか? ある程度ソースを読んだ経験があれば、どちらの スタイルで書かれていようが関係ないと思うんだが。
#define isTrue(x) x!=0 #define isFalse(x) x==0
>>823 だからね
if ( b == FALSE )
としたいやつらってのは b の型を
明示したいってことらしいのね
>>811 論理シフトじゃなくて算術シフトだろ。
符号付き整数型の右シフト>>が算術シフトであるか論理シフトであるかは実装依存。
論理シフトはunsignedキャストで符号無しにすればできる。
>>826 いや、だからそれが論争のネタになるわけですが
さっきラーメンを食った漏れは
>>827 に賛成。
>>829 関数の中で変数の型がすぐに分からないほどナガーイ関数
書いてる馬鹿に取っては、問題なのかもねえ。
ちょっと待て、ブーリアン
ソースが込み入ってくるとif(hoge),if(!hoge)は見づらいと思う。
ブーレアンだろ
>>829 でも型くらい上の方みればすぐわかると思うが。
if (p == NULL) は分からんでもないが
if (b == FALSE) ってのは・・・
>>834 まあ、事の発端では変数でなく関数ってことだったんですが
if ( hoge() == TRUE )
てか過去ログ読まずにレスしないで
==での型の明示にこだわってる奴はただの初心者。
>>841 それは大半の人間が分かってる
しかしプログラムを書くのは中、上級者だけではない
自分が分かりやすければそれで良いと思ってる奴は初心者。
>>840 if (hoge()) ...でいいと思うが。
hoge()の型が分からない?
返り値の型が分からないような関数使うな!!
>>836 聞きたい。
実際に込み入ったソースでそれを目にすると、どうして見づらいと思う?
型よりも意味付けの方が重要。 つまり関数が失敗か成功かなど。
>>844 型が分からんというより、見ただけで(調べないと)分からないのがいやってこと
だったと思う。本人じゃないので知らんが
>>843 Cプログラマならif(hoge==TRUE)よりもif(hoge)の方がわかりやすいだろ
BOOL型がないCで、TRUEやFALSEと必ず等価になる整数値って決められるのかな? 関数の戻り値なんて、関数仕様できまってるのは0と0以外だったりするでしょ? 別にそれはCの仕様じゃなくて、単なる約束事でしかないし。 NULLポインタをソース上で0(またはヘッダでデファインされるNULL)と書くのは、 0は整数ではなくてNULLポインタをあらわす特別なシンボルだからってのは知って る上での議論ですか?これ。
>>849 述べていることは正しいけど、何を訴えたいのかが書かれていないよ。
>>847 別にわからなくてもいいような気がするけど。
重要なのはその関数を真偽の判定につかえるかどうかだと思う。
>>843 ==があった方が分かりやすいと思ってる奴はただの初心者。
上級者ならどちらだろうが関係ない。
>>850 ごめそ。
だからBOOLをdefilneしてif(hoge==FALSE)だのというのは、閉
じてない世界で一般的につかうのはキケンでさえある用法だとオモイマス、
ということで。
外部とのコミュニケーションが全くない閉じた世界で、全てその
defineをつかうという「コーディング規定」があって、全員が
それを守る、と言う特殊な環境なら、まあいい・・・のかな?
どうも話がぐるぐる回っているようだ
>>835 既出だが、実例として glib があるのだよこれが
== があれかどうかを気にする香具師は DQN ケテーイという事でよろしいか?
>>857 おぬしの日本語の方がよっぽどDQNなわけだが
意味の通らなくなる誤字をしてしまった・・・ == があるかどうかを気にする香具師は DQN ケテーイという事でよろしいか?
いくら週末で論争に飢えているからといって一晩で同じ内容の論争を二回するな!
>>860 よろしいが、とっくの昔に分かっていたことではある
>>853 #define TRUE 1
#define FALSE 0
ってして関数の中で return FALSE; とかするのはいいのよ。
でも真偽値のつもりで返してるなら
if (!hoge())じゃない?
>>853 ここでは FALSEが0 と(マクロ等を使って)定義されている
という前提の上で話をしているんだと思うが?
それでも何かいけないのか?
これの元の発言は、「『VCを前提』にBOOLのTRUEを比較したらまずいよね?」という内容で、 それについての答えは、「まずいよ。」で、とっくの昔に終了してます。
#include <limits.h> typedef int bool #define TRUE INT_MAX #define FALSE INT_MIN
セミコロンつけわすれた
「== があれかどうかを気にする香具師」 って何か気になるな。 アレって何だろ。
>>868 どうせならこうでしょう
typedef enum {
TRUE = INT_MAX;
FALSE = INT_MIN
} bool;
>>867 (゚Д゚)ハァ?
誰が今そんな話をしてるの?
ライブラリがその閉じた世界でそういうdefineをしていて、しかも それを「仕様」として外部に公開しているなら、あとはそれをつか うクライアントの責任ですね。 ただそれはそのライブラリのローカルルールであって、一般的で あると思い込んでしまうべきではないとおもうのですが。 現在各々が担当しているプロジェクトが、それに準じるローカル ルールを明示的に決めていて、そのプロジェクトを使用する側の 人間にきちんと公開する、というルールが守られるなら、BOOL デファインしてもかまわないと思いますが。 それがCのルールだと思い込む人がいるのは危険だと思います。 あくまで(よくつかわれているけれど)ローカルルールだとい うことで。
> それがCのルールだと思い込む人がいるのは危険だと思います。 > あくまで(よくつかわれているけれど)ローカルルールだとい > うことで。 はあ?誰がそんなこと思いこんでるんだよ?
>>876 で、その「仕様」がいろいろと混在するのが問題なわけですな
>>881 そですね。他のライブラリには他のルールがあるかも。
>>876 は BOOL型がCの仕様だと思ってる奴がいると
思いこんでる一番痛いヤツ。
>>883 このスレに今いる奴にいるとは思わないけどね。
>>883 VC++初心者ならいても不思議はないが
>>879 で、どうなんだ?
「アレ」 が何なのか気になるのかならないのか?
昔のCだとgotoのラベルもintに代入できたし、 変数も(関数同様)型をつけずに宣言するとintになったそうだ。
>>887 変数を型指定無しで宣言って、どう書くの? auto?
非0が「真」だと簡潔に書けることも多いけど、間違えやすいことも確かだね。 まあ、それはCの設計者の選択ということだ。 浮動小数点でも0と非0で偽と真ってのはどうかと思うけどな〜
>>887 > 変数も(関数同様)型をつけずに宣言するとintになったそうだ。
それは関数外で?
関数内ならc;などと書くとなんの意味もない文だと解釈されるだけだと思うけど
> VC++初心者ならいても不思議はないが そんなヤツはDWORDとかLPSTRとかもそう思ってるだろ。 話の次元が違うと思う。
そうか、autoにstaticがあったか
>>888 main() { x , y = 1; ...}
BASICみたいだね。
処理系によってはintになるけど。<型無し
autoなんて予約語、ANSI以前はなかったと思うが…
今何人いるの?
ANSI以前は標準規格がなかったから予約語は処理系によってばらばらだったんじゃない?
番号! 1!
2
4
\ / \ / \ / \ / \ / \ ∧∧∧∧/ < 俺 > < 予 し > < か > ─────────< 感 い >────────── < な > < !!!! い > /∨∨∨∨\ / \ / \ / (-_-) \ / (∩∩) \ / \
903 :
デフォルトの名無しさん :02/11/10 04:59
4++;
256
コテハンになろうかな。
ふむ、3人か.......
スレのローカルルールでトリップ必須とか
907は漏れっつーことで、>899,>900,>901,>902,>903,>904 の7名ということでっか?
いちおう参加。
人が多けりゃ、ローカルコテハン付けた方が良いと思う。 トリップ付けたきゃつけてね。
はい8名
9. 質問に質問で返していくとだんだんわけがわからなくなってきますね。
本当だ・・・x; って書いてある・・・
>>913 ということは、
int a,b;
a=b;
b;
なんて書くとbが先頭で宣言されてねーぞゴルァ!と言われたわけか
では、漏れはラーメンと名乗る事にしよう。
違うな。 再定義されているぞゴルァか
今日もう400くらいいってるな。
今晩はお開き?
int x; >/DL> これはタグのミスか?
#define コテハン FALSE #define 名無し TRUE ななしでいいや…。
さて、肉饅でも食って Lisp の勉強すっか
すみません、こんな時間ですが質問させてください。 お約束の0、NULL、0x00、'\0'についてなのですが、 charやらintやらポインタやらを含む構造体を初期化するときは0x00を使い、 charの配列を初期化するときは0x00ではなく'\0'を使っていたのですが、 そもそもこの使い方は正しいでしょうか? 正しいとすると、結局この2つは等価でしょうか?
>>925 0,0x00,'\0'はみな同じ
通常は0を使い、文字の場合は'\0'を使うとみやすいと思うよ。
16進数の0x00は他の16進数と一緒に使う場合に有効かも
>>926 えっと、キャストのない素の0があると、これがNULLポインタになって・・・・・・
(すみません、よく分かってません)
なんとなくmemsetの第2パラメータとして"値"を使うには
不適のような気がするのですが・・・・・・。
それと、構造体はmemsetで0に初期化するよりも、メンバーごとに初期化した方がいいと思う。 NULLや0.0は全ビット0とは限らないし。
>>927 ポインタを要求するところやポインタにキャストすると0はNULLとなる。
ただそれだけ。
>>928 う〜む、そうなのですか。
やはり構造体ごとに初期化用の手続きを踏むのですよね?
>>929 あぁ、なんとなく分かりました。
memsetの第2パラメータはポインタを要求するところではないので、
直接0と書いても大丈夫(NULL、にはならない)、ということですよね?
キタ━━━━━(゚∀゚)━━━━━!!!
>>928 0.0は全ビット0とは限らない。
だが、NULL は全ビット 0 だ。
>>930 そう。
struct KOZO{
int i;
double d;
char *p
};
struct KOZO kozo={0,0.0,NULL};と言う感じで。
すまん、逝ってくる。
>>933 struct KOZO kozo={0,};
とかでもいいね。
おれも逝ってくる。 第二パラメータはポインタじゃなかった。
>>930 > memsetの第2パラメータはポインタを要求するところではないので、
> 直接0と書いても大丈夫(NULL、にはならない)、ということですよね?
とは言っても、memsetで0を埋める領域に
ポインタ型や浮動小数点型が含まれている時は
ダメだよ。
938 :
デフォルトの名無しさん :02/11/10 05:44
逝っちゃった人が 2 人いるスレはここですか?
memsetは文字配列や整数配列を0で初期化する時くらいしか使わないな。
まあ文字配列は大抵文字列として使うから0で初期化ってのはあまりしないか。
941 :
デフォルトの名無しさん :02/11/10 05:47
フィル値がバイト単位で無ければ、もっと使い途あったんだけどナー。
なるほど勉強になります。 たしかに今まで浮動小数点などはほとんど扱っておりませんでした。 なんとな〜く動いていたのですね。
>>941 だな。
intの配列に1与えてmemset使っても1で初期化されねーもんな。当たり前だけど。
memsetで初期化そのあとdoubleとポインタを初期化。
>>943 大抵は一番最初の要素に'\0'を入れるだけ
全要素'\0'で初期化することはあまりしないな
>>939 俺は処理系依存を承知でバリバリ使ってる。
ZeroMemory(&ofn, sizeof(ofn));
とか。(Win32)
int hoge[100] = { 1 };
void *memfil(void *dest, const void *src, size_t size, size_t count) { char *d = dest; while(count) { memcpy(d, src, size); d += size; count--; } return dest; }
>>947 0ならそれとかbzeroの方が速いんだったか?
>>948 それ、hoge[1] 以降は全部 0 だぞ。
int i; for (i=0; i<n; i++) hoge[i]=1;
953 :
デフォルトの名無しさん :02/11/10 05:53
次 ス レ の 予 感
>>950 確かVC++では ZeroMemory は memsetのマクロだったはず。
959 :
デフォルトの名無しさん :02/11/10 05:56
つーか、x86 + VC なら、ポインタも浮動小数点数も ZeroMemory() でいいじゃん。
>>948 hoge[0]だけが1になったけど、、、
>>958 なんでってCの配列の添え字は0からじゃん(笑)
>>959 うん。だから処理系依存を承知でと書いたわけだけど。
次は配列の添え字と初期化論争ですか?
大域変数 double foo; void *bar; とすると、 foo == 0.0、bar == NULL に初期化されるの?それとも全バイト 0 に初期化されるの?
memsetって高速化するためにできるだけintバイトごとに初期化していたりする?
NULLポインタが0で埋まってない処理系ってあるんだ。
>>964 =0と同じことになる。
doubleに0を入れようとすると0.0を入れようとしたことになるはず。
>>961 >>951 は
> それ、hoge[1] 以降は全部 0 だぞ。
と書いてますが?
なんでそれが
> hoge[0]だろ
になるわけ?
以降の意味知ってる?
誰か次スレ立てて。 漏れ立てられない。
>>968 あー!
ごめん、なんでそんな勘違いしたんだろ(笑)
>>968 hoge が大域変数なんて書いてあったっけ?
>>967 なるほろ。じゃあ bar も NULL になる?
>>965 intどころかもっと大きいサイズでもやってるかも。
でかい自動変数のdoubleの配列を0.0に初期化するときはループ使うのが一番てっとりばやい?
誰か次スレ頼むー!!
>>977 速さで言えば宣言の時に初期値指定した方が速い。
配列は全て初期化されるんじゃなかった?
>>978 968 は関係なかったね。hoge[1] 以降が 0 になるって話。
誰か次スレ頼むー!!
>>981 初期値が省略された要素は 0 で埋められる事が規格で決まっている。
グローバルかローカルかは関係無い。
>>984 int a[1024]={78,22,-2};とやったらa[3]以降は不定だったと思うけど、、、
>>984 アセンブラ出力させたらそんなコード吐いてなかった。
スタックを確保してただけ。おれの処理系がダメなのか。
新スレは
このスレの
>>1 のコピペでいいか?
それよければ漏れが立ててくるが。
このスレ、過去ログ情報がないね。
>>984 まてぃ。試しにやってみたらやっぱ初期化されてないぞ!
うそつけ!
>>988 訊という字を聞にしてほしい
あとはそのままでOK
C99 だったカモー・・・ で、誰も次スレ立ててくれんのか? 漏れのホストでは立てられない。
いちいち初期化していたら効率が悪くなるよ。 静的変数は一度だけ領域を確保するから初期化してもあまり問題ではないけど。
俺も無理。 たてすぎだった。
>>984 まてぃ
int hoge[100] = { 1 };
こうしたら、hoge[1] 以降は 0 に初期化されてた。
やっぱスマソ
やっぱり3日もたなかったな。
>>995 お疲れ!!
しかし、漏れのホストずっとスレ立てられないんだけど、何でだ・・・。
同じホストで乱立ヴァカがいるのか。
∧∧ /⌒ヽ) i三 ∪ ○三 | (/~∪ 三三 三三 三三
|| ∧||∧ ( ⌒ ヽ トゥトゥトゥマシェーリー ∪ 。ノ トゥトゥトゥマシェーリー ∪∪
∧∧ ミ _ ドスッ ( ,,)┌─┴┴─┐ / つ 終 了. | 〜′ /´ └─┬┬─┘ ∪ ∪ ││ _ε3
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。