C言語なら俺に聞け( ..
331:デフォルトの名無しさん
07/04/02 23:02:34
>>330
LUT
332:デフォルトの名無しさん
07/04/02 23:32:00
これでよくね?
int y = 0;
if(x & 1) y |= 128;
if(x & 2) y |= 64;
if(x & 4) y |= 32;
if(x & 8) y |= 16;
if(x & 16) y |= 8;
if(x & 32) y |= 4;
if(x & 64) y |= 2;
if(x & 128) y |= 1;
333:デフォルトの名無しさん
07/04/02 23:41:31
全然スマートじゃないけどな
334:デフォルトの名無しさん
07/04/02 23:48:09
10 進法で考えたら分かりやすくね?
int a = 1365;
int b = 0;
while (a>0) {
b *= 10;
b += a % 10;
a /= 10;
}
これを応用して
int a = 1365;
int b = 0;
while (a>0) {
b << 1;
b |= a & 1;
a >> 1;
}
335:デフォルトの名無しさん
07/04/02 23:50:36
スマートって結局主観だろ。
他人のことなんてわからん。
余計なことして気分的にスマートって思いたいだけだろ。
336:デフォルトの名無しさん
07/04/02 23:56:24
それに加え「速いのが良ければ実測しろ」だしな。
337:デフォルトの名無しさん
07/04/02 23:56:28
int test8bit(int x)
{
static BYTE table[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
int y = table[x>>4] | (table[x&15]<<4);
return y;
}
int test16bit(int x)
{
int y = test8bit(x>>8) | (test8bit(x&255)<<8);
return y;
}
intは32ビット以上前提で
338:デフォルトの名無しさん
07/04/02 23:57:12
そんな言い訳ばかり並べて逃げるやつからは何も生まれてこないと思うんだ。
339:330
07/04/02 23:57:19
LUT作りました。
皆さん、ありがとう。
340:デフォルトの名無しさん
07/04/03 00:01:40
まあ>>332をスマートだと思う奴なんていないだろうけどな
341:デフォルトの名無しさん
07/04/03 00:06:38
そんなことに時間かけるくらいなら
可読性も速度も無難なのがいい。
342:330
07/04/03 00:12:13
可読性と速度を考えてLUT。
実測はしてないですが。
343:デフォルトの名無しさん
07/04/03 00:13:58
まあ、速すぎて調べても誤差程度にしかならんけどね。
344:デフォルトの名無しさん
07/04/03 23:57:14
文字列を戻り値に指定するときに
char ch[] = " ";
return ch;
だとエラーが出て
char ch[] = " ";
return &ch[0];
だと通ったんですが、戻り値に配列を指定するときは
return ch;
のように省略して書いてはいけないのでしょうか?
345:デフォルトの名無しさん
07/04/04 00:01:54
関数内で宣言した変数は静的変数(static付けた奴)以外、
関数を抜けると同時に破棄される。
呼出元に戻ったらもうそんな変数を指すポインタは無意味と化している。
だから前者ではそのことを警告されただけだと思う。
無論後者の書き方をしたところで問題の解決にはなっていない。
346:デフォルトの名無しさん
07/04/04 00:20:51
>>344
エラーがでるでないはともかく関数内で宣言したローカル変数を戻り値にしちゃだめだよぉ
return で戻ったときにはchar ch[] はもう亡くなっているだろうから
347:デフォルトの名無しさん
07/04/04 00:32:46
結論、Cでは文字列を単純には戻り値にはできない。
348:デフォルトの名無しさん
07/04/04 00:34:15
なんでそういう結論になるのか
349:デフォルトの名無しさん
07/04/04 00:43:41
>>348
他の結論になるとでも?
350:デフォルトの名無しさん
07/04/04 00:45:26
後者は&リテラル返してるじゃん
351:デフォルトの名無しさん
07/04/04 00:50:12
呼び出し元で確保しておけと。
352:デフォルトの名無しさん
07/04/04 00:51:02
>>344
C言語で関数から文字列を返却したいときは、戻り値にしないで引数で返す
つまり、呼び側関数内で配列の領域を確保し、呼ばれる関数に渡す
353:デフォルトの名無しさん
07/04/04 00:51:35
被ったorz
354:デフォルトの名無しさん
07/04/04 01:30:59
超初心者で申し訳ないんですけど、
コンパイルしようとしたときに、cant open: stdio.hっていうエラーが出るんです。
解説お願いします。
355:デフォルトの名無しさん
07/04/04 02:15:58
すいません、自己解決しました。
356:デフォルトの名無しさん
07/04/04 03:58:31
>>347は要するにC言語では配列そのものをreturn文で返すことはできない、
ってことだろ。
自動的にポインタに変換されてしまうから。
357:デフォルトの名無しさん
07/04/04 04:33:37
BinarySearchTreeの勉強をしてるんですが
階層の数はどんな感じで出せばいいですか?
358:デフォルトの名無しさん
07/04/04 12:04:32
350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26
後者は&リテラル返してるじゃん
359:デフォルトの名無しさん
07/04/04 12:05:34
356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31
自動的にポインタに変換されてしまうから。
360:デフォルトの名無しさん
07/04/04 12:07:33
358 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:04:32
350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26
後者は&リテラル返してるじゃん
359 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:05:34
356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31
自動的にポインタに変換されてしまうから。
361:デフォルトの名無しさん
07/04/04 12:16:40
自分で考えろ
362:デフォルトの名無しさん
07/04/04 12:36:27
ソケット通信ってchar型以外のデータを送信できるのでしょうか?
構造体でデータをまとめて通信したいんですけど…
363:デフォルトの名無しさん
07/04/04 12:40:33
送信する関数のポインタの型を良く見ろ
364:デフォルトの名無しさん
07/04/04 13:28:03
>>362
「ネットワークバイトオーダー」でググるよろし。
365:344
07/04/04 16:54:10
ローカル変数だってことすっかり忘れてました…
staticにするか引数に渡すかしないといけなかったんですね。。
皆さん分かりやすい説明ありがとうございました。
366:デフォルトの名無しさん
07/04/04 17:19:44
前者がリテラルへの参照、後者がリテラルの先頭アドレスを返してる。
char* moji(){
char ch[] = "a";
return ch;//もしくはreturn &ch[0];
}
int main(){
char* b=moji();
return 0;
}
これで、各所にブレークポイント置いて、メモリとレジスタを見てみりゃわかる。
ローカル変数はベースポインタ(EBPレジスタ)からのオフセットで決まるから、
moji()からmain()に戻ってくりゃ、ベースポインタが変わるから、リテラルへの参照chは意味を成さなくなる。
ただし、戻り値(EAPレジスタ)の残骸が残っている場合、一見何事もなく済んでしまう場合もある。
ch[0]というのは、リテラルそのもの、文字がメモリにセメダインで張り付いてるようなもので、値を変えようとすると
AccessViolationでOSから怒られる。&ch[0]は参照じゃなく直接リテラルのアドレスを返している。
367:デフォルトの名無しさん
07/04/04 17:31:18
>>366
>リテラル
何か混乱しているようですが、そのコード中の文字列リテラルは "a" のみです。
ch はリテラルではなく、単なる char[2] のローカル変数です。
368:デフォルトの名無しさん
07/04/04 17:31:47
真っ赤な間違い乙
369:デフォルトの名無しさん
07/04/04 17:32:18
真っ赤な間違いは>366ね。
370:デフォルトの名無しさん
07/04/04 17:43:37
>>367
だから、chは文字リテラル"a"への参照だよ。
chは、単なるch[2]のローカル変数?
だから違うよ、ch[2]の先頭を参照するローカル変数。
参照ってなに?
371:デフォルトの名無しさん
07/04/04 17:51:02
>>367
左辺値と右辺値の区別くらいつけろや
372:デフォルトの名無しさん
07/04/04 17:56:47
>>366
Cならいついかなる場合でも配列chに対して、chと&ch[0]は同じ。
どちらも配列の先頭要素を指すポインタが式の結果として得られる。
373:デフォルトの名無しさん
07/04/04 17:57:01
安価間違ってない?
374:デフォルトの名無しさん
07/04/04 17:58:42
vipperはカエレ
375:デフォルトの名無しさん
07/04/04 18:00:17
安価とか言うのは高確率で
おっさん
376:デフォルトの名無しさん
07/04/04 18:06:40
>配列ch
だからchはアドレス参照だと
それと、結果は同じでも過程は違うとはよくいったもんで
377:デフォルトの名無しさん
07/04/04 18:06:57
なんか恥ずかしいやつが混じっているなぁ。
char ch[2] = "a";
char foo[2] = {'a', '\0'};
printf("%p, %p\n", ch, foo);
を実際にコンパイルして(アセンブル出力を見るか)実行してみれば直ぐに判ることだろうに。
378:デフォルトの名無しさん
07/04/04 18:08:43
行火
379:デフォルトの名無しさん
07/04/04 18:16:00
>>377
そのプログラムを実行して結果を見たところで何がわかるのやら
380:デフォルトの名無しさん
07/04/04 18:19:42
何も判らないならプログラミングは止めたほうがいい。
381:デフォルトの名無しさん
07/04/04 18:25:49
>>366
ちなみに文字列リテラルそのもの(の先頭要素)を指すポインタを返したければこうする
どちらも結果的には同じこと
char* moji() {
return "a";
}
char* moji() {
char* ch = "a"
return ch;
}
382:デフォルトの名無しさん
07/04/04 18:27:26
>>380
当然過ぎる結果が返ってきたということだw
上の方のレスはカオス過ぎて読んでいない。
383:デフォルトの名無しさん
07/04/04 18:27:45
どうせなら
char *p = "a";
も付け足しとけ。
384:デフォルトの名無しさん
07/04/04 18:30:53
「配列とポインタは同じ」
って罪な言葉だな…
385:344
07/04/04 18:31:09
つまり
ch → "a"の先頭アドレスを参照
ch[0] → 'a'を参照
&ch[0] → 'a'のアドレスを指す
と言うことで、これらは全部
'a' '\0'
を参照しているからアドレスは同じってことですか?
386:デフォルトの名無しさん
07/04/04 18:32:37
>>366のアホさに久々にワロタ
387:デフォルトの名無しさん
07/04/04 18:33:17
>>385
違う。
388:デフォルトの名無しさん
07/04/04 18:34:01
なんつーか、参照って言葉をむやみに使わないほうがいいと思うんだ。
389:デフォルトの名無しさん
07/04/04 18:35:43
配列の初期化子に使う場合でも文字列リテラルって言うの?
390:デフォルトの名無しさん
07/04/04 18:39:39
>>389
URLリンク(e-words.jp)
391:デフォルトの名無しさん
07/04/04 18:40:44
>>389
そう言う。
規格上、charの配列を文字列リテラルで初期化できるという規則になっているから。
392:デフォルトの名無しさん
07/04/04 18:42:09
ch → 配列の先頭を指すポインタとして見なされる
ch[0] → char型の値
&ch[0] → ch[0]のアドレス
393:デフォルトの名無しさん
07/04/04 18:44:38
>>390
いやリテラルであることに疑問の余地はないんだけど、文字列リテラルってなんか微妙に違和感あったもんで…
>>391
規格じゃあしょうがないね
394:344
07/04/04 18:56:51
>>388
少し調べたんですが、
参照ってC++だと特別な意味があったんですね。。
これから気をつけます。
>>392
ありがとうございます。
自分が考えていたことと全然違いますね…
395:デフォルトの名無しさん
07/04/04 19:00:32
URLリンク(kmaebashi.com)
より引用
" で囲まれた文字列を、文字列リテラルと呼ぶ。
通常は、文字列リテラルは、「char の配列」を意味する。 よって、式の中では「charへのポインタ」に読み換えられる。
しかし、char の配列を初期化する場合は例外である。 (こちらを参照のこと) この場合の文字列リテラルは、中括弧内に文字を区切って書く初期化子の 省略形として、コンパイラに特別に解釈される。
char str[] = "abc"; /* この宣言は、下の宣言と同義 */
char str[] = {'a', 'b', 'c', '\0'}; /* 配列の最外周なので、要素数は省略できる */
…だそうだ
396:デフォルトの名無しさん
07/04/04 19:12:16
コード上で"で囲まれてれば全部文字列リテラルなのねー
感覚としてはあたかも文字列リテラルのように書くことが許されてるって感じだった
397:デフォルトの名無しさん
07/04/04 19:15:40
でも現実的には初めそう教えておくほうがいいと俺は思う。
398:デフォルトの名無しさん
07/04/04 19:31:04
>>366
がアホなのは解った。
399:デフォルトの名無しさん
07/04/04 19:39:27
オレはC言語はきちんと理解できていないが
ゲームなんかのクラックをして変な知識だけはある
しかもアセンブラの意味も分かっているわけではなく
シンボルを見て分かった気になっているだけの
スクリプトキディみたいなもんだ
言っとくがオレは >>366 でも代弁者でもないぞ
400:デフォルトの名無しさん
07/04/04 19:44:49
>>399
どういう流れでその書き込みなのか頭の悪い俺に教えてください。
401:デフォルトの名無しさん
07/04/04 19:47:48
>>399
いったい、誰に対して何の主張をしてるんだ?
402:デフォルトの名無しさん
07/04/04 20:02:08
それをこれから書くところなんじゃないか
403:デフォルトの名無しさん
07/04/04 20:02:45
スレ違いはスルー汁
404:デフォルトの名無しさん
07/04/04 20:28:28
とりあえず>>370の
char ch[] = "a"; は文字リテラル"a"への参照だよ。
ってのはおかしいよね・・・?
405:デフォルトの名無しさん
07/04/04 20:37:08
argv[1][2]って*(p+2)みたいに表現できないの? > エロイ人(愛を込めて)
406:デフォルトの名無しさん
07/04/04 20:43:08
>>405
*(argv[1] + 2)
407:デフォルトの名無しさん
07/04/04 20:50:32
>>405
もしくは
*(*(argv+1)+2)
408:デフォルトの名無しさん
07/04/04 20:52:20
argv[ i ][ k ] = *(*(argv+i)+k)
と等価って意味ね
409:デフォルトの名無しさん
07/04/04 21:05:21
2[1[argv]]
410:デフォルトの名無しさん
07/04/04 21:13:52
argv[i][k] == *(*(argv+i)+k) == k[i[argv]]
411:デフォルトの名無しさん
07/04/04 21:22:45
>>406-410
サンクス
なるほど *を2回使うのね
412:デフォルトの名無しさん
07/04/04 21:53:54
a[b]におけるaとbの可換則だけは釈然としない
こんなの使って可読性が上がる場合なんてあんの?
413:デフォルトの名無しさん
07/04/04 21:57:04
>>412
その仕様は初期のコンパイラの都合によるものと思われる
でも、できるからといって使う必要はないじゃないか
414:デフォルトの名無しさん
07/04/04 23:35:53
char *argv[]に対して
*(argv+i)って言うのはargv[i]
*(*(argv+i))って言うのはargv[i][]
と同じと考えておk?
415:デフォルトの名無しさん
07/04/04 23:37:44
下は *(*(argv+i)) == *(*(argv+i)+0) == argv[i][0] ?
416:デフォルトの名無しさん
07/04/04 23:45:43
うん。
*p == p[0]
417:デフォルトの名無しさん
07/04/04 23:48:02
構造体ってのは最初に宣言しないといけないの?
#include <stdio.h>
int main(void){
struct person{
char *sei;
int age;
}taro;
taro.age=13;
taro.sei="山田";
struct person hanako;
printf("太郎の姓は%s、年齢は%dです\n",taro.sei,taro.age);
return 0;
}
これコンパイルできないんだけど
418:デフォルトの名無しさん
07/04/04 23:50:09
struct person hanako;
を削ってみ。
419:デフォルトの名無しさん
07/04/04 23:51:59
>>417
Cの場合宣言(struct person hanako; )は関数スコープの最初に
taro.age=13; taro.sei="山田"; の後で宣言はダメ
420:デフォルトの名無しさん
07/04/04 23:52:17
>>417
コンパイルできるよ。
421:デフォルトの名無しさん
07/04/04 23:57:13
あれがコンパイルできるC99は残念ながら普及していないのさ
422:デフォルトの名無しさん
07/04/04 23:59:18
gccが普及してないとでも?
423:デフォルトの名無しさん
07/04/05 00:10:03
GCCは普及しているものの、社会がC99を使う風潮になっていない。
見たことあるか?C99で書かれたプログラム。
424:デフォルトの名無しさん
07/04/05 00:17:24
FreeBSDのソースがC99でかかれてたなー。
425:デフォルトの名無しさん
07/04/05 00:23:08
拡張子をcppにすればいい
426:デフォルトの名無しさん
07/04/05 00:44:47
>>423
コメントが//のCのソースコードをよく見るんだが
427:デフォルトの名無しさん
07/04/05 03:02:41
C99で書かれたものは、C89でも書ける。
極端な事言えば、C++でusing namespace std;
をグローバルで宣言して、あとはCの様に書けば
事足りる。
なんだよ、_BOOLって (w
428:デフォルトの名無しさん
07/04/05 03:09:55
極端な事言えば、 で書かれたものは機械語でも書ける。
429:デフォルトの名無しさん
07/04/05 07:05:03
ふつうにboolにしてくれた方が使いやすい
430:デフォルトの名無しさん
07/04/05 07:51:37
>>423
毎日飽きるほど見てますが、何か。
431:デフォルトの名無しさん
07/04/05 08:04:55
>>427>>429
<stdbool.h>
432:デフォルトの名無しさん
07/04/05 12:49:55
int *a;
ってやったら
aにはたとえば0x123456ff
みたいなアドレスが入ってるんだよね?
だから、a=12みたいなことはできないってことはわかったんだけど
char *c
c="abcdef";
みたいなことができるのはなんで?
char *cって指定した時点で
cには0x12345678みたいなアドレスが入ってんじゃないの?
433:デフォルトの名無しさん
07/04/05 12:54:00
"abcdef"は、文字列abcdefのアドレスの意味
434:デフォルトの名無しさん
07/04/05 12:54:04
int *aもchar *cも宣言した時点では(有効な)アドレスは入ってない。
435:デフォルトの名無しさん
07/04/05 12:59:11
あれ?
アドレス表示しても6桁なんだけど…
なんで?
436:デフォルトの名無しさん
07/04/05 12:59:55
a=12だってできる。
437:デフォルトの名無しさん
07/04/05 13:00:32
>>435
上が0なんだろ・・・
438:435
07/04/05 13:02:00
#include <stdio.h>
int main()
{
int a = 1 ;
printf ( "%x" , &a ) ;
return 0 ;
}
で実行すると
12fed4
どういうこと?
439:デフォルトの名無しさん
07/04/05 13:02:42
>>437
なるほど^^
お騒がせしました
440:デフォルトの名無しさん
07/04/05 13:04:32
>>432
そういうC言語の仕様。
「char型の配列はダブルクォーテーションで囲む文字列(これを文字列リテラルと言う)で初期化できる」
っていうルールがあるの。ただおまいはその書き込みから色々誤解してそうなフシがあるから注記しとくと
・初期化が無い宣言の時点ではその変数の値は決まってない。
その変数を格納するためのメモリ領域に元々入ってるデータがそのまま値になる。
・文字列リテラルで出来るのはあくまで初期化であり、代入は出来ない。
つまり、char c[] = "unko";はできるけどchar c[20]; c = "unko";はダメ。
・ポインタに対しても同じ事が出来るけどそれはchar *cのに対して静的なリテラルのアドレスが代入されたのであって
↑のルールとは無関係。だから厳密に言えば↑のレスは的外れになる。
441:デフォルトの名無しさん
07/04/05 13:14:58
>>438
0x12fed4
16進表記だよ
442:デフォルトの名無しさん
07/04/05 13:22:39
%p ならなんとかしてくれるかもしんない。
あ。 ゼロサプレスしてたっけか?
443:デフォルトの名無しさん
07/04/05 13:45:42
なるほどー。
char c[20];
ってやって、初期化しなかった場合に代入したいときは
scanfとかstrcpy使わないとだめなのかな?
c="asdf"はできなくてstrcpy(c,"asdf")はできるんだよね。。。
なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか
444:デフォルトの名無しさん
07/04/05 13:54:28
>>443
char c[20];
char *p=c; cのアドレスをpにコピー
コピーしたのは「アドレス」であってデータそのもの("ABCDE")ではない
このときpには c のアドレスが入っている
次に p="ABCDE";
を実行すると p は"ABCDE"というリテラルの「アドレス」が代入され
cに"ABCDE"がコピーされるわけではない
c(=p)にコピーしたいのなら strcpy(p,"ABCDE"); としなければいけない
445:デフォルトの名無しさん
07/04/05 13:54:41
>>443
> なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか
c="asdf"は、char型の20個の領域にアドレス(="asdf")を代入しているからだめ
strcpyは、char型の20個の領域に文字列asdfをコピーしているから良い
446:デフォルトの名無しさん
07/04/05 13:56:06
>>443
Cでは配列間での代入はできない。また、"asdf"は'a'を指すポインタと解釈される。
従って、c = "asdf"は配列へのポインタの代入と言うことになり、当然できない。
どうしても代入したければ、要素を一つずつ代入すればよい。
#そしてそれを、ナル終端文字列専用にしたのがstrcpy()だ。
447:デフォルトの名無しさん
07/04/05 13:58:01
c="asdf" ← というか、そもそも、c = で使えない。(cは配列の先頭を表してるってだけ)
strcpy(c,"asdf") ← c(配列の先頭のアドレス)とリテラルのアドレスを渡して、
'a','s'・・・を順次入れているだけ。
448:デフォルトの名無しさん
07/04/05 14:06:51
>>443
"asdf" は文字列が格納されている先頭メモリ番地
c="asdf" はアドレス値をコピーしようとしている
strcpy(c,"asdf") はアドレスが指すデータをコピーしようとしている
449:デフォルトの名無しさん
07/04/05 15:45:32
for (i = 0; i < THREAD_COUNT; i++) {
/* スレッド生成 */
if (pthread_create(&thread_id, NULL, threadFunc, (void *)thread_arg) == 0) {
thread_count++;
}
}
とやって、THREAD_COUNTの数をいろいろ変えているのですが
ある一定の数以上は、必ず失敗するようになります。
自分の環境では303個めまでのスレッドは作成できますが
それ以上は作成できません。
どこかでスレッドの上限というのは決められているのでしょうか?
450:デフォルトの名無しさん
07/04/05 16:32:12
/*
1000以下の素数を求める(第1版)
*/
#include <stdio.h>
int main(void)
{
int i, no;
unsigned long counter = 0;
for (no = 2; no <= 1000; no++) {
for (i = 2; i < no; i++) {
counter++;
if (no % i == 0) /* 割り切れると素数ではない */
break; /* それ以上の繰返しは不要 */
}
if (no == i) /* 最後まで割り切れなかった */
printf("%d\n", no);
}
printf("乗除を行った回数:%lu\n", counter);
return (0);
}
これでnoが3の時二個目のfor分のところのiが<演算子なのに3になるんですか?
3にならなければ3素数なのにprintfで表示されないですよね
451:デフォルトの名無しさん
07/04/05 16:42:23
no = 3, i = 2 → 割り切れない
no = 3, i = 3 → i < noを満たさないのでループ終了
no == i なので3は素数
452:デフォルトの名無しさん
07/04/05 16:44:38
<これでも
3<3までいくんだ?
<=じゃなくても
453:デフォルトの名無しさん
07/04/05 16:45:38
3になったからループを抜けるわけで
454:デフォルトの名無しさん
07/04/05 16:47:32
ループの流れ
i = 2
i < no の判定
処理
i++
i < no の判定
処理
i++
i < no の判定
処理
i++
・
・
・
455:デフォルトの名無しさん
07/04/05 16:48:36
>>450=452 ...か?
妥当なインデント付けて、最初のforループの中を一行ずつ追っていけば
何となく分かるかもね。
456:デフォルトの名無しさん
07/04/05 17:04:32
>>452
そうじゃなくて
no=3 のとき iのループは3になったら抜けるわけでループ内では2までしか処理されない
ループを抜けているのはiが3だからループのあとiは3になっている
457:デフォルトの名無しさん
07/04/05 17:46:40
printf()が負値を返すのはエラーが発生した場合とのことですが
具体的にエラーが発生するのってどんな状況のときなんですかね?
458:デフォルトの名無しさん
07/04/05 17:59:47
>>457
厳密には、printf()は出力に失敗するとEOFを返す。
リダイレクト先の出力がなんらかの制限のあるデバイスにでも振り向けられていなければ、
一般的には出力は必ず成功する。
459:デフォルトの名無しさん
07/04/05 18:44:50
てか画面以外は失敗する可能性あるよね。
460:デフォルトの名無しさん
07/04/05 18:58:02
>>459
画面って何?
/dev/consoleのこと? 必ずしも画面とは限らないのだけど……
461:デフォルトの名無しさん
07/04/05 19:03:19
要は、下位のwriteが失敗するかどうかが大体のキモだね。
printf(NULL)みたいなどうしようもないようなものをのぞけば。
462:デフォルトの名無しさん
07/04/05 19:32:07
>>457
普通にファイルに書いてたって空き領域がなくなることはあるだろうし
リムーバブルなメディアなら途中で引っこ抜かれるかも試練。
463:デフォルトの名無しさん
07/04/05 19:40:07
実は、バッファリングされているから必ずしもエラーにならない罠。
464:デフォルトの名無しさん
07/04/05 19:46:53
必ずしもの使い方が間違っている希ガス
465:デフォルトの名無しさん
07/04/05 19:47:44
463ではないが、必ずしもエラーになるとは限らない、かな?
466:デフォルトの名無しさん
07/04/05 19:50:25
容量オーバーした瞬間にエラーにならない可能性はあるが、
失敗する可能性は十分あり得るということでFA?
467:デフォルトの名無しさん
07/04/05 21:26:44
すみません。前回はありがとうございます。
また質問させていただきます。
URLリンク(www.uploda.org)
スパゲティですみません。
game3.hの構造体sceneDataなんですが変数dFFがメンバじゃないと出るんですが、
何ででしょうか?
要素が多すぎるんでしょうか?
pはsageです。
468:デフォルトの名無しさん
07/04/05 21:31:37
>>467
grep で検索しても dFF はどこにも宣言されて無いようだ
469:デフォルトの名無しさん
07/04/05 21:38:51
整数mからnまでの和を、公式n(n+1)/2を使わずに求めるプログラム作ったんですけど
#include <stdio.h>
int main(void){
int m,n,i,ans=0;
printf("数値入力>");scanf("%d",&m);
printf("数値入力>");scanf("%d",&n);
if(m<=n){
for(i=m;i<=n;i++){
ans=ans+i;
}
printf("%d",ans);
}
else {
for(i=n;i<=m;i++){
ans=ans+i;
}
printf("%d",ans);
}
return 0;
}
このプログラムって、答えをansという変数に代入してるんですが
ansを使わずに求めるにはどうしたらいいんですかね
470:デフォルトの名無しさん
07/04/05 21:42:29
mかnに加算していけば?
471:デフォルトの名無しさん
07/04/05 22:01:58
>>469
再帰処理で
#include <stdio.h>
int mysum(int a,int max)
{
if(max<=a) return a;
return mysum(a+1,max)+a;
}
int main(void){
int m;
printf("数値入力>");scanf("%d",&m);
printf("数値入力>");scanf("%d",&n);
if(m<=n){
printf("m=%d\n",mysum(m,n));
}
else {
printf("n=%d\n",mysum(n,m));
}
return 0;
}
472:471
07/04/05 22:03:22
あっ
printf("m=%d\n",mysum(m,n));
printf("n=%d\n",mysum(n,m));
m= と n= 消しといて
473:デフォルトの名無しさん
07/04/05 22:17:13
>>469
ansを思いっきり使ってるので無視してくれて構わないが簡略した
int MtoN_Add(int m, int n)
{
int i = (m>n)?n:m, ans = 0;
while( (m>n)?m:n >= i ) ans += i++;
return ans;
}
474:デフォルトの名無しさん
07/04/05 22:38:02
#include <stdio.h>
int main(void){
int m,n,i;
printf("数値入力>");scanf("%d",&m);
printf("数値入力>");scanf("%d",&n);
if(m>n) m^=n,n^=m,m^=n;
for(i=m+1;i<=n;i++) m+=i;
printf("%d",m);
return 0;
}
475:デフォルトの名無しさん
07/04/05 23:07:24
ハッカーの楽しみに載ってるやつかww
476:デフォルトの名無しさん
07/04/05 23:15:05
m^=n,n^=m,m^=n
これでスワップが出来るとは知らなんだ。勉強になったぜ
477:デフォルトの名無しさん
07/04/05 23:20:22
勉強するのはいいが、実用性はないに等しいから使わないようにね。
478:デフォルトの名無しさん
07/04/05 23:21:15
URLリンク(www.dd.iij4u.or.jp)
Wikipedia項目リンク
479:デフォルトの名無しさん
07/04/05 23:42:01
do while文ってつかわないほうがいいの?
480:デフォルトの名無しさん
07/04/05 23:49:01
while文よりは利用機会は少ないと思うけど、
使わないほうがいいってことはない。
ただし、do while文の最後を
}
while (条件);
のようにwhileが先頭に来るように改行するのは好ましくない。
こう書いてしまうと、一軒、新たに while文が始まったように見
えてしまう。
} while (条件);
とするのがよい。
481:デフォルトの名無しさん
07/04/06 00:20:44
サイズの指定たとえば#define BUF 256とかを
複数のファイルで共有するにはどうすればいいの?
ヘッダに書いちゃっていいものなの?
優しく教えてくれる東ちづる似のお姉さん回答お願いします。
482:デフォルトの名無しさん
07/04/06 00:49:06
共用するヘッダに書いて#includeする。
483:481
07/04/06 09:21:17
>>482
すみません
それは新しくヘッダのみのファイルを作っておくって事でしょうか?
484:デフォルトの名無しさん
07/04/06 10:15:23
common.hみたいな名前のヘッダファイル作って、そこに#define全部書いて
定数使うソースに#include "common.h"書けばおkって話。
485:481
07/04/06 10:50:30
>>484
そうしたいと思います。
回答ありがとおおおおおおおおおおおおおおおおおおお。
486:デフォルトの名無しさん
07/04/06 11:33:21
>common.hみたいな名前のヘッダファイル作って、そこに#define全部書いて
勘弁してくれ。
487:デフォルトの名無しさん
07/04/06 11:38:40
今の時代、ヘッダ直しただけで毎回フルビルドになってもOKダヨー
488:デフォルトの名無しさん
07/04/06 11:51:49
本当に時代は進化したなぁ
489:デフォルトの名無しさん
07/04/06 11:53:22
>>486
へ?何が勘弁してなの?煽りじゃなくてマジで・・
490:デフォルトの名無しさん
07/04/06 11:54:08
>>487
それが理由じゃない。俺様マクロが氾濫する原因になるから
利用したいソース群ごとにインクルードファイルは分けて欲しいだけだ。
491:デフォルトの名無しさん
07/04/06 11:55:15
つーか、>484の方針だとプロトタイプ宣言も全ソース共通のインクルードファイルでやってそうだな…
492:デフォルトの名無しさん
07/04/06 11:56:40
プロトタイプ宣言は普通全ソース共通のインクルードファイルに書くだろ
prototype.hとか作って
493:デフォルトの名無しさん
07/04/06 12:02:45
普通にモジュール化してたらそうはならないだろ
494:デフォルトの名無しさん
07/04/06 12:05:38
なるだろ
495:デフォルトの名無しさん
07/04/06 12:25:58
で結局どうやるのが正解なわけ?
496:デフォルトの名無しさん
07/04/06 12:27:57
>>492
勘弁してくれ。
その方針じゃ、必要のないインクルードファイルまで全部インクルードする羽目になる。
標準インクルードも片端からインクルードすることになるジャマイカ。
例えば20本くらいのソースのうち、時間(time_t)を取り扱う関数がソースAにあるとする。
それを利用するのは、ソースBとソースCだけだとする。
ソースD以下はtime_tなど全く頓着する必要はないのだが、プロトタイプが全部共通だと
全てのソースでtime.hをインクルードすることになるということだ。
time_tならそんな心配はないだろうが、環境によっては他とぶつかる可能性のある
マクロを定義しているインクルードファイルもあるだろう。
#たとえばBoolという定数マクロと関数マクロがぶつかることがあるOSの標準インクルードで実際にあった。
>493が言うように、きちんとモジュール化していたらそんなことになるはずないんだがな。
#つーか、C++でクラス設計していたら有り得ないだろ。
497:デフォルトの名無しさん
07/04/06 12:38:37
>>496
なんとなく共通のヘッダファイルは、さけてきたけど・・・
では、そうゆう方向で >_<;
498:デフォルトの名無しさん
07/04/06 13:00:14
>>496
>>492はプロトタイプ宣言だけの話じゃないの?
499:デフォルトの名無しさん
07/04/06 13:02:09
>>498
プロトタイプ宣言を纏めるためには、引き数や戻り値で使う型の情報が必要になる。
それらをインクルードすれば同じこと。
500:デフォルトの名無しさん
07/04/06 14:00:47
ポインタ型はすべてchar*に変換すればいい
というか業務だとそうしてるよな?普通
そうしないとくだらない依存関係で悩むことになる
501:デフォルトの名無しさん
07/04/06 14:20:45
>>500
勘弁してくれ。
502:デフォルトの名無しさん
07/04/06 14:24:21
16進を2進に変えるのって
ただ単に桁ごとの数字を二進法にかえればいいだけですか?
たとえば0x65なら6を二進にした0110と5を二進にした0101を並べて
01100101ってやりゃいいの?
どんな数でもこの法則成り立ちますか?
503:デフォルトの名無しさん
07/04/06 14:30:52
4進数なら 00 00
8進数なら 000 000
16進数なら 0000 0000
504:デフォルトの名無しさん
07/04/06 14:31:02
>>500
何の為に型が存在してるんだ
505:デフォルトの名無しさん
07/04/06 14:40:24
>500は釣りだろ。いくらなんでも業務で型無しプログラミングなんて有り得ない。
506:デフォルトの名無しさん
07/04/06 15:27:40
インターフェイスをchar *で統一するとデータ型に依存しないから、
仕様変更があった場合、修正個所少なくなる。というのはあるかもね。
作業が進んでから「データ型変更されますた」とかあるしw
507:デフォルトの名無しさん
07/04/06 15:32:15
そして、仕様変更でデータ型が変わってもその事実が伝達されずにそのままビルドされて納品される罠。
508:デフォルトの名無しさん
07/04/06 16:33:40
>>506
なんと愚かな・・・。
509:デフォルトの名無しさん
07/04/06 16:35:25
>>508
どこが愚かが具体的に言わないと反論になってない
さらに自分の改善案も出さないとただの愚痴
510:デフォルトの名無しさん
07/04/06 16:42:29
>>509
>507
>504
>496
>493
511:デフォルトの名無しさん
07/04/06 16:43:06
>>502
2進数を3桁で区切ってその3桁を1桁づつにすると8進数、4桁で区切って1桁づつに
すると16進数。というのは、2進数3桁だと8種類の重みを表現可能だからで、これを
一桁で表せば8進数ということになる。2進数4桁で16進数というのも同じこと。
512:デフォルトの名無しさん
07/04/06 16:48:26
>>509
反論ではありません。あまりの愚かさに衝撃を受けて出た一言です。
外人がよく言う "Oh My GOD!" に近いものです。
ああ。あなたに神の許しがありますように。
513: ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
07/04/06 16:49:42
_____
/::::::::::::::::::::::::::\ _
/::::::::::::::::::::::::::::::::::::::\ /  ̄  ̄ \
|:::::::::::::::::|_|_|_|_| /、 ヽ
|;;;;;;;;;;ノ \,, ,,/ ヽ |・ |―-、 | きみ頭だいじょうぶ?
|::( 6 ー─◎─◎ ) q -´ 二 ヽ |
|ノ (∵∴ ( o o)∴) ノ_ ー | |
/| < ∵ 3 ∵> \. ̄` | /
::::::\ ヽ ノ\ O===== |
:::::::::::::\_____ノ:::::::::::\ / |
514:デフォルトの名無しさん
07/04/06 16:50:32
>>500
何社か渡り歩いたけど、そうやってる会社もあった
大手電機メーカーでした
515:デフォルトの名無しさん
07/04/06 16:55:28
>>514
恐ろしいな。
516:デフォルトの名無しさん
07/04/06 18:08:42
>>506
せめてvoid*
何も事態は改善しないけど
517:デフォルトの名無しさん
07/04/06 18:30:31
>>516
うん。まーーーったく変わらない。
518:デフォルトの名無しさん
07/04/06 18:45:30
え?悪化してるような気がする。
char*ってことは、一旦シリアライザ・デシリアライザを挟もう、って意図じゃないの?
いまどきのIPCがみんなXML使ってるみたいに、関数の引数もXMLにしよう、みたいな話ではないの?
519: ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
07/04/06 19:39:54
_____
/::::::::::::::::::::::::::\ _
/::::::::::::::::::::::::::::::::::::::\ /  ̄  ̄ \
|:::::::::::::::::|_|_|_|_| /、 ヽ
|;;;;;;;;;;ノ \,, ,,/ ヽ |・ |―-、 | きみ頭だいじょうぶ?
|::( 6 ー─◎─◎ ) q -´ 二 ヽ |
|ノ (∵∴ ( o o)∴) ノ_ ー | |
/| < ∵ 3 ∵> \. ̄` | /
::::::\ ヽ ノ\ O===== |
:::::::::::::\_____ノ:::::::::::\ / |
520:デフォルトの名無しさん
07/04/06 19:49:00
>>468
ありがとう。どうやらIDEが別の似たファイルを参照していたらしいです。
解決しました。
521:デフォルトの名無しさん
07/04/06 20:05:31
>>476
XOR使ったスワップは、同一だとちゃんと機能せんから
せめて
a +=b, b = a - b, a -= b
とか使うようにしましょう。
522:デフォルトの名無しさん
07/04/06 20:08:53
一方俺はバッファを使った…
523:デフォルトの名無しさん
07/04/06 20:12:42
>>521
おいおいw
524:デフォルトの名無しさん
07/04/06 20:28:42
叔母風呂
525:デフォルトの名無しさん
07/04/06 20:30:47
同一( &a==&b )の場合は >>521 の方法でも 0 になってしまうよ
526:デフォルトの名無しさん
07/04/06 21:24:42
for文の途中に
return 0などがあると
関数に0を返したあとに、関数の処理は終わってしまいますか?
527:デフォルトの名無しさん
07/04/06 21:26:28
もちろん
528:デフォルトの名無しさん
07/04/06 21:54:44
#include <stdio.h>
#include <math.h>
int sosu(int);
int main(void){
int i,m;
printf("数値入力>");scanf("%d",&m);
if(m<=0) return 0;
printf("2 ");
for(i=3;i<=m;i+=2){
if (sosu(i)==1) printf("%d ",i);
}
return 0;
}
int sosu(int n){
int i;
if(n==2)return 1;
if(n%2==0) return 0;
else{
for(i=3;i*i<=n;i=i+2){
if(n%i==0){
return 0;
}
}
}
return 1;
}
入力した数までの全ての素数を表示するプログラム作ってみたんだけど
これだと横一列に表示されて見づらいので、5個ずつ表示して改行\nつけたいんだけどどうしたらいいですかね
2 3 5 7 11
13 17 19 23 29
31 37・・・といった感じです
529:デフォルトの名無しさん
07/04/06 21:59:24
>>528 これでどう?
if (sosu(i)==1) printf("%d ",i);
↓
if (sosu(i)==1){
static int sosu_count=1;
sosu_count++;
printf("%d ",i);
if(sosu_count%5==0) printf("\n");
}
530:デフォルトの名無しさん
07/04/06 22:00:27
void MyPrint(int i)
{
static cnt;
printf("%d ", i);
cnt++;
if(cnt == 5) {printf("\n");cnt=0;}
return;
}
こんな関数をprintfの代わりに使うのはどう?
531:デフォルトの名無しさん
07/04/06 22:03:25
できたー ありがとうございます
532:デフォルトの名無しさん
07/04/06 23:02:53
int main(void) って int main() と
C言語は略しちゃいけないんだよね?
533:デフォルトの名無しさん
07/04/06 23:07:14
>>532
int main();はお勧めできませんが、
int main()ならどうでもいいと思います。
534:デフォルトの名無しさん
07/04/06 23:08:47
規格をあたってみたところ、関数の定義なら問題ないと読めた。
参照したのがはJIS X3010:2003 (C99翻訳)なんで、C89とかだとどうなのかは知らんが。
535:デフォルトの名無しさん
07/04/06 23:12:11
C89でも同じ事です。
536:デフォルトの名無しさん
07/04/07 03:51:54
素数そっすうそっすうーーー
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sieve(char *p,int d);
int main()
{
int d = 0,i,k;
char buff[256] = {'\0'};
char *p = NULL;
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&d);
if (d <= 0) {fprintf(stderr,"input positive number and less than INT_MAX number.\n");exit(1);}
if ((p = malloc(d))==NULL) {fprintf(stderr,"failed to allocate %d bytes of memory.\n", d);exit(1);}
memset(p, '\0', d);
sieve(p,d);
printf("primes up to %d\n", d);
for (i = 0, k = 1; i < d; i++){
if(p[i] == 2){i++;}
if (p[i]==0){printf("%-4d ", i+1); k++;}
if(!(k%5)){ putchar('\n');k++;}
}
return 0;
}
void sieve(char *p,int d)
{
int i, j;
p[0] = 2;
for (i=2; i <= d/2; i++)
for (j=2; j <= d/i; j++)
p[i*j-1]=1;
}
537:デフォルトの名無しさん
07/04/07 04:10:22
インデント無いとこれほどまでに読みにくくなるんだな…
538:デフォルトの名無しさん
07/04/07 12:46:42
C言語で駄目文字ってどういう時に発生するの?
539:デフォルトの名無しさん
07/04/07 12:50:03
駄目文字って何?
540:デフォルトの名無しさん
07/04/07 12:53:25
Shift_JISで表したときに2バイトめに 0x5c が来る文字を俗に
駄目文字と呼ぶらしい。
541:デフォルトの名無しさん
07/04/07 13:21:08
表とか?
542:デフォルトの名無しさん
07/04/07 15:21:56
カタカナの「ソ」とかな。
>>538への答えとしては、扱うエンコーディングにShift_JIS(CP932など
類似品も含む)があるときは常にその必要があると思え、くらいか。
543:デフォルトの名無しさん
07/04/07 15:33:49
sizeof演算子 の意味がわかりません。教えてください。
544:デフォルトの名無しさん
07/04/07 15:54:25
意味ってw
変数の使用バイトを調べる為にあるんだよ
マロックとかで変数渡すときに、4って書くよりsizeof(int)って書いた方が分かりやすいからだよw
545:デフォルトの名無しさん
07/04/07 15:55:06
sizeof(int) : int型のサイズ(4バイトとかそんな感じ)
sizeof(hoge) : 変数hogeのサイズ(char hoge[260]なら260)
前者は型のサイズが違っても対応できるように、後者はmalloc(sizeof(hoge))みたいな感じに使う
546:デフォルトの名無しさん
07/04/07 16:52:02
典型的な応用例:
int array[10];
for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = 0;
547:デフォルトの名無しさん
07/04/07 16:59:42
質問者のレベルだと
*arrayのところは、array[0]と書いた方が分かりやすいだろう。
548:デフォルトの名無しさん
07/04/07 17:30:20
構造体でもパッキングの値に対応した本当のサイズが出るので
sizeof は不可欠
549:デフォルトの名無しさん
07/04/07 17:54:23
sizeofはエロイ
550:デフォルトの名無しさん
07/04/07 18:36:20
inlineよかまし
551:デフォルトの名無しさん
07/04/07 18:59:45
>>548
いや、詰め物なくてもsizeofは使うだろ。
メンバ変数のサイズを個別に求めて、合計するわけ?
552:デフォルトの名無しさん
07/04/07 19:55:09
4って書くよりsizeof(int)って書いた方が分かりやすいからだよw
?intは2バイトじゃないのですか???
553:デフォルトの名無しさん
07/04/07 19:59:47
>>552
なんで2バイトだと思ってるの?
554:デフォルトの名無しさん
07/04/07 20:00:36
釣りだろうけどマジレスするとintサイズは環境依存、一般的には
8bit, 16bit cpu では2の
32bit cpuでは4
64bit cpuでは4, 8 に分かれる。
555:デフォルトの名無しさん
07/04/07 20:03:30
コンパイラが決めてるってことですか?
どーやって決めてるんですかね?
556:デフォルトの名無しさん
07/04/07 20:06:58
釣りじゃないです。
勉強し始めて、一ヶ月。
わからないことばかりです。
本には、intは2バイトって書かれてるから。
環境依存?
むつかしい。前途多難です。
557:デフォルトの名無しさん
07/04/07 20:08:58
>>556
すごい古い本つかってないか?
558:デフォルトの名無しさん
07/04/07 20:12:22
Javaだと身動き取れないくらいカッチリとサイズが決められてるけど、
Cのintは最低2バイトでshort以上long以下のCPUに都合の良い(が扱いや
すい)幅。以上/以下とあるから、どちらかと同じであってもよい。
559:デフォルトの名無しさん
07/04/07 20:15:49
C99だと「最低でも32bit以上で、一番速い型」とか指定できるからいいな。
560:デフォルトの名無しさん
07/04/07 20:16:10
intが最低2バイトと書いてしまったが、ちゃんと書くと、
1. short: 最低2バイト、longよりは小
2. long: 最低4バイト、shortよりは大
3. short <= int <= long
1.2.からshortとlongの幅が同じになることはないので、3.の等号は
成り立つとしても片方しか成り立たない。
561:デフォルトの名無しさん
07/04/07 20:16:22
longとintでサイズ同じなら二つも作って紛らわしくさせんじゃねーよ!
とか憤ってた学びたての頃の俺をDQNといわないで下さい
562:デフォルトの名無しさん
07/04/07 20:17:20
>>555
実行環境のCPUその他アーキテクチャにとって都合の良い大きさに決まる
563:デフォルトの名無しさん
07/04/07 20:19:24
CPUが64ビットだとややこしいな。
int=64ビット long=64ビット
int=32ビット long=64ビット
int=32ビット long=32ビット long long=64ビット
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5375日前に更新/183 KB
担当:undef