1 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 16:45:25 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 9 pc11.2ch.net/test/read.cgi/tech/1173284217/ 過去スレ Part 1 pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 pc11.2ch.net/test/read.cgi/tech/1171946674/ 関連スレ C/C++の宿題を片付けます 84代目 pc11.2ch.net/test/read.cgi/tech/1172981618/ くだすれC言語(初心者用) Part.2 pc11.2ch.net/test/read.cgi/tech/1172099763/ 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 pc11.2ch.net/test/read.cgi/tech/1170338926/ 【初心者歓迎】C/C++室 Ver.35【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1171888583/ 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html
528 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 22:03:25 ] できたー ありがとうございます
532 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:02:53 ] int main(void) って int main() と C言語は略しちゃいけないんだよね?
533 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:07:14 ] >>532 int main();はお勧めできませんが、 int main()ならどうでもいいと思います。
534 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:08:47 ] 規格をあたってみたところ、関数の定義なら問題ないと読めた。 参照したのがはJIS X3010:2003 (C99翻訳)なんで、C89とかだとどうなのかは知らんが。
535 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 23:12:11 ] C89でも同じ事です。
536 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 04:10:22 ] インデント無いとこれほどまでに読みにくくなるんだな…
538 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 12:46:42 ] C言語で駄目文字ってどういう時に発生するの?
539 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 12:50:03 ] 駄目文字って何?
540 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 12:53:25 ] Shift_JISで表したときに2バイトめに 0x5c が来る文字を俗に 駄目文字と呼ぶらしい。
541 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 13:21:08 ] 表とか?
542 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 15:21:56 ] カタカナの「ソ」とかな。 >>538 への答えとしては、扱うエンコーディングにShift_JIS(CP932など 類似品も含む)があるときは常にその必要があると思え、くらいか。
543 名前:デフォルトの名無しさん [2007/04/07(土) 15:33:49 ] sizeof演算子 の意味がわかりません。教えてください。
544 名前:デフォルトの名無しさん [2007/04/07(土) 15:54:25 ] 意味ってw 変数の使用バイトを調べる為にあるんだよ マロックとかで変数渡すときに、4って書くよりsizeof(int)って書いた方が分かりやすいからだよw
545 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 15:55:06 ] sizeof(int) : int型のサイズ(4バイトとかそんな感じ) sizeof(hoge) : 変数hogeのサイズ(char hoge[260]なら260) 前者は型のサイズが違っても対応できるように、後者はmalloc(sizeof(hoge))みたいな感じに使う
546 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 16:52:02 ] 典型的な応用例: int array[10]; for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = 0;
547 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 16:59:42 ] 質問者のレベルだと *arrayのところは、array[0]と書いた方が分かりやすいだろう。
548 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 17:30:20 ] 構造体でもパッキングの値に対応した本当のサイズが出るので sizeof は不可欠
549 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 17:54:23 ] sizeofはエロイ
550 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 18:36:20 ] inlineよかまし
551 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 18:59:45 ] >>548 いや、詰め物なくてもsizeofは使うだろ。 メンバ変数のサイズを個別に求めて、合計するわけ?
552 名前:デフォルトの名無しさん [2007/04/07(土) 19:55:09 ] 4って書くよりsizeof(int)って書いた方が分かりやすいからだよw ?intは2バイトじゃないのですか???
553 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 19:59:47 ] >>552 なんで2バイトだと思ってるの?
554 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:00:36 ] 釣りだろうけどマジレスするとintサイズは環境依存、一般的には 8bit, 16bit cpu では2の 32bit cpuでは4 64bit cpuでは4, 8 に分かれる。
555 名前:デフォルトの名無しさん [2007/04/07(土) 20:03:30 ] コンパイラが決めてるってことですか? どーやって決めてるんですかね?
556 名前:デフォルトの名無しさん [2007/04/07(土) 20:06:58 ] 釣りじゃないです。 勉強し始めて、一ヶ月。 わからないことばかりです。 本には、intは2バイトって書かれてるから。 環境依存? むつかしい。前途多難です。
557 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:08:58 ] >>556 すごい古い本つかってないか?
558 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:12:22 ] Javaだと身動き取れないくらいカッチリとサイズが決められてるけど、 Cのintは最低2バイトでshort以上long以下のCPUに都合の良い(が扱いや すい)幅。以上/以下とあるから、どちらかと同じであってもよい。
559 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:15:49 ] C99だと「最低でも32bit以上で、一番速い型」とか指定できるからいいな。
560 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:16:22 ] longとintでサイズ同じなら二つも作って紛らわしくさせんじゃねーよ! とか憤ってた学びたての頃の俺をDQNといわないで下さい
562 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:17:20 ] >>555 実行環境のCPUその他アーキテクチャにとって都合の良い大きさに決まる
563 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:19:24 ] CPUが64ビットだとややこしいな。 int=64ビット long=64ビット int=32ビット long=64ビット int=32ビット long=32ビット long long=64ビット
564 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:19:31 ] >>558 のカッコのなかの「が」は CPUに都合がよい、しかし扱いやすい じゃなくて(逆接になる意味がない)、 CPUに都合がよい(CPUが扱いやすい) の意です……
565 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:20:39 ] >>560 それ間違ってないか? 手元の本にはそんなことは書いてないが。
566 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:27:01 ] shortはshort int、longはlong intの略記であり、 無印intはshort intかlong intのどちらか処理系に都合がよいほうと同じ、 だっけ?
567 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:30:01 ] 手元の本って何だよ。JISのプリントアウトか? まぁ、もちろん規格にも>>560 のような最低hogeバイトとは書いていないけどな。
568 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:38:20 ] >>560 > 1.2.からshortとlongの幅が同じになることはないので、3.の等号は > 成り立つとしても片方しか成り立たない。 実際に sizeof(short) == sizeof(int) == siezeof(long) == 4 な処理系は実在する。
569 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:39:54 ] >>566 intがshort intとlong intのどちらかと 同じ大きさである必要があると定められてはいなかったと思う。 >>567 しかし<limits.h>の定数は少なくともxxx以上・以下でないといけないという規定があり、 そこから必然的にshortとintが16ビット、longが32ビットなければならないということが導かれる。 1バイトが8ビットである環境なら当然2バイトと4バイトになる。 「3.の等号は成り立つとしても片方しか成り立たない」は違うような気がするけど。
570 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:42:07 ] 知っているつもりのことでも、きちんと知らないことってあるんだなあ。
571 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:42:24 ] >>567 新ANSI C言語辞典って本だけど。
572 名前:デフォルトの名無しさん [2007/04/07(土) 20:52:41 ] すごい細かいんですね。 大丈夫かな?? 無理かな??不安になってきた。
573 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:54:37 ] 「どこでも同じとは限らない」ということだけ知ってればOK。
574 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:07:34 ] つまり sizeof(short)=2 sizeof(int)=3 sizeof(long)=4 な処理系があればいいんだ、過去の俺を納得させるだけの為に
575 名前:デフォルトの名無しさん [2007/04/07(土) 21:13:02 ] だからどーやってCPUがバイト割り当ててんだよ その仕組みを教えればいいだろ
576 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:14:09 ] 説明しきれないんだろ? 少なくとも俺はわからん
577 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:16:23 ] CPU < short形が2バイトだの、charが8ビットだのってのは、俺が決めてるわけじゃねーよ。
578 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:17:21 ] 誰がきめてんだよ
579 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:19:28 ] 設計者じゃねーの?
580 名前:デフォルトの名無しさん [2007/04/07(土) 21:20:05 ] 何になるの?? こんな質問方法では、だめか・・。
581 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:21:16 ] 設計者なわけないだろ あたらしいCPUがでたら また設計者があたらしく定義しなおすのか?
582 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:21:50 ] >>575 CPUを設計する人が「これは32ビットCPUだ(1バイト=8ビット)」と言えば、 コンパイラを設計する人はそのCPUで動くコードを出力するコンパイラはintを4バイトにするという具合。
583 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:24:49 ] コンパイラを設計するひとは CPUが新しくできるたびに設計しなおさないといけないってこと?
584 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:25:31 ] CPUのレジスタサイズと、コンパイラの整数型は必ずしも一致してないんだな。 32bitCPUでも、int8のコンパイラがあったり、int64のコンパイラがあったり。
585 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:25:33 ] すんげぇめんどくさいんですね 出来たばっかりのCPUだとプログラミングできないんじゃん
586 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:26:58 ] 毎度新しく決める必要はない。 たとえば80386から続くIntelの32ビットCPUシリーズはIA-32と一括りにされるという具合。
587 名前:デフォルトの名無しさん [2007/04/07(土) 21:27:27 ] なるほど
588 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 21:33:17 ] もちろんCPUが全てではない。 x86-64では、WindowsはMSがWindows APIをLLP64にすると言い、 VC++もLLP64(long longとポインタが64ビット、intとlongは32ビット)になった。 しかしUnix系では一般的にLP64(longとポインタが64ビット)が採用されていると言う具合。
589 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:14:09 ] 入門者には難しい >_<;
590 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:18:22 ] >>574 そんな環境はないだろうけど、 short = 2 int = 4 long = 8 なら、普通にあるだろ。
591 名前:デフォルトの名無しさん [2007/04/07(土) 23:12:07 ] char K1[]="abcde"; は、 sizeof は、何になるのですか?? 6??なぜ??
592 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:14:31 ] >>591 配列はその全体のサイズになるから。 文字列の場合は最後に0がつくから、みかけのサイズより+1の大きさになる。
593 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:14:32 ] 規格でそう決まっているから
594 名前:デフォルトの名無しさん [2007/04/07(土) 23:21:50 ] 591 \0 じゃなくてですか?
595 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:23:54 ] NULLぽ
596 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:30:20 ] >>595 ガッ
597 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:51:36 ] >>591 暇だったんで俺が決めといたんだ
598 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:09:58 ] >>594 '¥0'なら
599 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:32:27 ] 配列の平均値を求める関数aveを作ってみたんですが これで表示が1としか表示されないんだけどなんでですかね・・・ #include <stdio.h> void ave(int array[]); int main(void){ int a[5]={1,2,3,4,5},i; ave(a); return 0; } void ave(int array[]){ int sum=0,i,m; m=sizeof(array)/sizeof(int); for(i=0;i<m;i++){ sum+=array[i]; } printf("平均=%d\n",sum/m); } 調べてみたら、ave関数のm=sizeof(array)/sizeof(int) がおかしくて、mに1が入ってみるみたいなんです。 配列aの要素数は5だから、mに5を入れたいんだけどどうすりゃいいんですかね?
600 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:39:08 ] >>599 Cでは配列を関数に渡すことはできない。素直に個数も渡すしかない。 cf. void ave(int * array, int nOfArray) { ...; }
601 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:42:02 ] >>599 void ave(int array[]){ これはダメだな int *array と同じでポインタのサイズしか渡さない int *array のポインタサイズ(4バイト) / int のサイズ(4バイト)=1 void ave(int array[],int size) { int sum=0,i,m; m=size/sizeof(int); ・・・・・ } int main() { ・・・・ ave(a,sizeof(a)); とするとか
602 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:13:19 ] you! c++でいっChinaよ
603 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:21:58 ] C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。 main関数で要素数を入れなきゃダメなんですねどうもありがとうでした
604 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:38:01 ] 出来ん事も無いけど STLとか使ったら一瞬で出来ることをなんで悩まないといけないのか って鬱になるから普通はしない
605 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:39:41 ] 課題でeggx(C言語)てので正五角形を作って来いって言われたのですが途方にくれてます。 多角形を描く関数(fillpoly)もあるようですが、頂点の座標がわからないと描けないようで困っています。
606 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:54:27 ] 頂点の座標なら 円の式と、直線の式の交点を求めるとか sin、cosを使うとか
607 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 01:57:04 ] プログラムと何の関係があるのか分からんが、 正五角形の頂点なら、 k=0, 1, 2, 3, 4 として x = cos(2π/5 * k) y = sin(2π/5 * k) で求まるだろう
608 名前:デフォルトの名無しさん [2007/04/08(日) 08:32:47 ] Cのライブラリ全てが説明されている本って無いですか? 言われて分かる人なら X680x0 libc みたいな本を探している、と言えば早いですかね。 使用する関数名が分かっていれば、man して使い方を知る事は出来るものの、 どんな関数があるのかが分からずで困ってます。 対象は Linux / FreeBSD で、ソツ無く使える本を。
609 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:10:47 ] man2とかman3のディレクトリをlsしちゃだめなのか?
610 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:41:14 ] 標準Cの範囲なら規格書で充分だろ。
611 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:46:47 ] セクション2はCの規格じゃないけどな。
612 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 10:13:48 ] >>604 興味本位でやってみたいからヒント頼む
613 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 11:32:32 ] >>612 C++をやれ
614 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:02:01 ] 以後、配列を扱う場合はかならず構造体の単一メンバにすること。
615 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:02:46 ] オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ
616 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:46:15 ] >>608 は、Unixのシステムコールも含んで、載ってるやつがほしいんじゃないか?
617 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 12:58:11 ] >>608 あんまりない無い。 www.linux.or.jp/JM/index.html 結局これが一番いいんじゃないかと思う。 入門書としては、UNIX-Cプログラミングを唱っているもので、プロセス・スレッド、 mmap、socletなんかを扱っているものもあるが、中途半端なものばかり。 最終的にはmanみろってことなのかもしれない。 UNIX共通に通用するベース技術・仕様の本といったら、POSIXの規格書とか 解説書あたりがお望みのものに近いか? BSD系はソースが公開されているんだからそれを読んでコミニュティで 解決しろというスタンスが濃い。 Linuxはアプリケーションソフトばかりがとりだたされる傾向にあって、 コアなライブラリ解説なんて皆無に等しい。 オライリーのカーネル本とか、デバドラ本くらいか。
618 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 13:11:02 ] 「ふつうのLinuxプログラミング」あたりでファイルシステムとかストリーム とかシグナルとか、考え方から理解しておいて、あとはmanなんだろうなぁ。
619 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:09:16 ] >>613 Cではできないのですか?
620 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:15:22 ] >>619 STL は C++ 標準ライブラリ
621 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:55:09 ] スティーヴンス本も知らんのか君達は
622 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 15:17:13 ] (´・ω・`)知らんがな
623 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 15:26:18 ] C言語500の極意(うろおぼえ)みたいな本で十分だろ。
624 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:35:41 ] 608です。 皆様からのレスは本屋で携帯から読めて大変参考になりました。 >>615 >オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ C Desktop Reference なる本は見掛けたのですが、これの事? 内容は本の厚さに比例してそこそこと言う感じでした。 初めてCを使う人には良いかも。 >>623 >C言語500の極意(うろおぼえ)みたいな本で十分だろ。 これを見掛けた時は「これか!?」と思ったのですが、内容が・・・ 参考になる点も多かったのですが、今求めている物とは大きくずれてました。 いざ探してみると満足の行く物は確かに無いですね。 みんなどうやってプログラミングしているんだろう?と不思議になってきました。 今にして思うと X680x0 libc は偉業と感じます。 これには標準的な関数ならバッチリ載っているので、残りは >>617 を参考にするのがベターの様です。 本屋で探した感じでは C言語大辞典 がわりとイイ線行ってたので 今度は神保町あたりでじっくり探してみたいと思います。 レスしてくれた方々、有難う御座いました。
625 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:36:11 ] 配列って、絶対アドレス順にしかできないの? a[0]とa[1]はメモリ上となりあわせで a[0]アドレスが100ならa[1]は99といった感じで使いづらい・・・ malloc関数を使ったら、a[0]〜a[それまで]のものが全部初期化されちゃって使いづらい。 今までの配列の要素を変化させずに動的に配列の要素数を変化させることはできないですか? scanf関数を使うたびに配列の要素をひとつずつ増加させるのを作りたいんだけど。 int ct=0,m,*data; data=(int*)malloc(100*sizeof(int)); while(1){ scanf("%d",&m); if(m==0)break; data[ct]=m; ct++; } たとえばこれだと100個以上の入力されるとエラー起こすし、 5個しか入力しないと残りの95個もったいない どうすりゃいいですかね?
626 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:39:05 ] そのための線形リストだ。
627 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:42:26 ] >>625 ・realloc ・std::vector (C++ 限定)
628 名前:デフォルトの名無しさん [2007/04/08(日) 22:09:43 ] ビット演算の意味がわからない。
629 名前:デフォルトの名無しさん [2007/04/08(日) 22:11:34 ] #include<stdio.h> void main(void){ int x,y; scanf("%d,%d",&x,&y); printf("%d",x/y); } 5行目:0で割っています と出るんですが、何故なんでしょうか? x,yには0以外の数字を入力しています
630 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:15:11 ] "%d,%d"のフォーマット通りに入力してる?
631 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:15:15 ] >>620 >>603 の >C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。 に対して >>604 が >出来ん事も無いけど って答えているので、STLってかテンプレート使わずにC言語の機能だけでできるのかなぁと思って聞いてみたわけです。 なんか粘着みたいですいません。
632 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:19:44 ] >>624 いや"C Pocket Reference" もれは英語版を使ってるけど一応ISBNは 0-596-00436-2
633 名前:629 [2007/04/08(日) 22:22:42 ] >>630 すいません、フォーマット通りとはどういうことでしょうか?
634 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:26:52 ] >>630 じゃないが たとえば $ 4,2 にように入力してるかってこと
635 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:27:11 ] 10,2 とか
636 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:29:00 ] 123,456もだな
637 名前:629 [2007/04/08(日) 22:29:46 ] >>634-635 やってませんでした。今やったらできました。ありがとうございます!
638 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 22:36:36 ] >>636 いやwwwそれいったらintの範囲のその範囲乗までレスがつくぞ
639 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 07:17:09 ] scanfの戻り値みろよ…
640 名前:デフォルトの名無しさん [2007/04/09(月) 10:18:00 ] すいません、どなたかわかる方がいれば回答お願いします C言語のコマンドラインから引数を渡すプログラムで ちゃんと動いてくれませんorz #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ FILE*fin,*fout; char ss[256]; if(argc!=3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL) { printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } while (fgets(ss,256,fin) !=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; }
641 名前:デフォルトの名無しさん [2007/04/09(月) 10:21:03 ] これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、 としか表示されなくて・・・ 色々調べて試行錯誤したのですが結局一晩かけてもわかりませんっでした こんな自分は問題解決能力がないからPGむいてないのでしょうか(´Д`;)
642 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:24:50 ] >>641 俺の環境ではちゃんと動いたけど?
643 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:25:15 ] >>641 問題無いように見えるけど・・・
644 名前:もしかして、コマンドライン引き数を知らないと言う落ち? mailto:sage [2007/04/09(月) 10:38:51 ] >>640 >これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、 >としか表示されなくて・・・ 漏れの環境では、引き数を指定しないで実行したらそうなった。 期待通りの動作じゃないのか?
645 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:45:37 ] 学びたての頃一日かけてやっとセミコロンが一つ足りないことに気付いたことがある俺の勝ち
646 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:50:17 ] セミコロンが一つって思うだろうがたかが1日じゃないか 3日悩むよりずっといい まだまだだな
647 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:00:17 ] >>640 のfinの宣言部で FILEと*finがくっついて1つの単語になってるように見えるのはオレだけ?
648 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:04:53 ] 俺の三倍とはこやつやりおるわ… hoge.exe piyo.txt のようにコマンドプロンプトに入力すればファイルの中身を表示できるはずです。 くらい書いとけばいいのに、不親切なテキスト(かどうか知らんが)だなぁ
649 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:09:22 ] 漏れなんて、ソースファイル末尾の改行がないためにNULLポン消えなくて一週間悩んだぜ。 #コンパイラが生成するアセンブリ出力の改行が足りなくなると言う素敵なバグの所為だったんだけど。
650 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:18:17 ] >>641 >これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、 ってことは printf("引数の数が違います\n"); が実行されて表示されてるってことで それが実行される条件はプログラムに与えられた引数の数 だからtest.exe a.txt b.txtのようにプログラムに与える引数を変えればいいんじゃない 問題解決能力じゃないと思う たとえばできるだけ客観的に説明する能力とか不足を補う理解力とか 誰もが通る道だけどな向き不向きなんてすぐにはわからん
651 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:21:31 ] >>650 お前は日本語で説明する能力を養え
652 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:26:54 ] PGに不向きな奴は1年持たない 1年持てば問題なす
653 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 12:42:16 ] もれなんて一切コメントがないという芸能人の浮気疑惑のようなプロジェクトを引き継いで マイプライベートタア〜イムを返上して解読&コメントつけていったのに 1ヵ月後に会社が清算を迎えたo... rz
654 名前:デフォルトの名無しさん [2007/04/09(月) 15:35:11 ] >>640 ちゃんと動くんだが?
655 名前:デフォルトの名無しさん [2007/04/09(月) 20:53:17 ] フリーウェアの秀丸のサイトを教えてください
656 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:54:50 ] は?
657 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:55:17 ] ttp://www5.ocn.ne.jp/~hidemaru/
658 名前:デフォルトの名無しさん [2007/04/09(月) 21:15:23 ] #include <stdio.h> int main(void) { /*文*/ return 0; } 入門書では上のように学んだんですが、コンパイルできれば次のような形式でも 問題ないのでしょうか? #include <stdio.h> main(){ /*文*/ }
659 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:22:17 ] >>658 コンパイルできても上の方が望ましい。
660 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:25:08 ] いや、下のでも問題ないよ。
661 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:30:00 ] 戻り値の書かれていない関数定義はintを返すと見なされる(Cではだっけ?) ので、いいっちゃいい。(許容されるという意味で)
662 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 21:31:27 ] return 0のほうか。 戻り値を使う予定がないならなんでもいいよ。 型は>>661 にあるようにintになるがどんな値になるかは不明。
663 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 22:46:13 ] >>659->>662 レスありがとうございます。他の人のプログラム見せてもらったとき たまたま見つけて疑問に思った程度なんです。とりあえず、 自分で書くときは習ったやりかたでやっていこうと思います。
664 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 22:58:14 ] >>663 たぶん書き忘れじゃないかと思ふ
665 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 22:58:37 ] >>662 >intになるがどんな値になるかは不明。 あれ?return書かない場合は0返すんじゃなかったか?
666 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:06:02 ] クラスのstaticで宣言したメンバー関数の関数ポインタを持つ事って可能ですか?
667 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:10:06 ] >>665 C++では前からそうだが、CではC99から >>666 C++はスレ違いだが、静的メンバ関数は、非メンバ関数同様に扱える。 ようするに静的メンバ関数へのポインタはただの関数へのポインタで扱える。
668 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:11:14 ] >>666 可能 VCで試した メンバーへのポインタじゃなくてC言語のように普通の関数へのポインタ
669 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:18:43 ] 参考書とかネットの記事とか見てるとmain()内の最後で、 return 0; return (0); って2種類の書き方見るんだけどこれらに明確な違いってあるのか? 低レベルな質問ですまん ><
670 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:24:11 ] >>669 括弧いらない あっても結果は変わらない
671 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:25:28 ] 違いはない。ただし括弧を付けない書き方が一般的。 昔はreturnに括弧を付けなければならなかった。 現在、括弧は不要になったが、あっても式の一部として扱われるのでコンパイルは通る。
672 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:26:01 ] >>670 レスありがとう。やたら気になってたんだ
673 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:28:21 ] >>669 returnは関数じゃなくてステートメントだから付けないてよい。 付けてもエラーにはならないが a = b + c を a = (b) + (c) などと書くのと同じことで冗長。 お作法的な話で言えば、綴りを間違って retrn 0 と書けば即コンパイルエラーだが、 retrn(0) と書いてしまうとそういう関数があるものと仮定されリンク時までエラーが発覚しない。
674 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 23:29:06 ] >>671 いつの話だ。
675 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 01:48:13 ] sizeof expr はつけなくてよいと分かっていても括弧つけてしまうな…
676 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 02:36:33 ] これは確かに使い分けに迷う。 sizeof(型); sizeof 変数;
677 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 02:42:05 ] 演算子もいってみりゃ関数みたいなもんじゃん ってことで()付けてるけどいいのか?
678 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 03:55:13 ] >>676 変数ではなく式
679 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 04:01:44 ] >>677 別に構いませんよ。 ++(*(&(i)));
680 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 05:33:50 ] 激しくうっとうしいわw
681 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 06:05:28 ] 式だったら尚更()つけないとね
682 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 10:55:06 ] sizeof は、長い行の中に入ることもあって () なしだと見づらくなる場合があるからな でもsizeof() じゃなくて、sizeof () にしてるな。 >>671 return に括弧が必要なときってあったか?
683 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 13:59:08 ] mem = malloc(len * sizeof * mem);
684 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 15:55:00 ] arrayという2次元配列にintの数値が入っています for(i=0;i<array[0][j];i++)という風for文の条件式にしようとしても出来ませんでした こういう場合はどうすればいいのですか
685 名前:640 [2007/04/10(火) 16:10:53 ] やはりちゃんと動いてくれません(´Д`;) >>650 さんの意味がよくわからないのですが >>if((fin=fopen(argv[1],"r"))==NULL) の所のargv[]を1ではなくて他 の数値を渡せということでしょうか??
686 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 16:15:25 ] ちゃんと動かないって…もうちょっと他人にわかるように説明しろよ。 * どういう方法で起動していて、 * どういう挙動をして欲しいのか、 * そして実際はどういう結果になっているのか
687 名前:362 mailto:sage [2007/04/10(火) 16:38:24 ] >>363 型を見てみたらsignedcharでした。 この型しかソケット通信では送れないのでしょうか? >>364 ぐぐってもデータの転送順がかわることしかわかんなかったです>< 多くのデータを一度にsendで送るいい方法はないのですか><
688 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 17:06:16 ] bcpadから直接起動してるから引数渡せてないと予想
689 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 18:53:39 ] 趣味で麻雀をやってるんだけど、自分の打ち方がどれぐらい強いのか試そうと思ってC++のコンパイラさえあればあとは言語が書ければ代打ちソフトが作れるってdllを見たんでCをしてみようと思うんですけど。 これを読めばとりあえず素人はなんとかなるとか、このコンパイラが素人向けでわかりやすいなどありましたら教えてください。 一応Delphiは触るだけ触ったことはあるので言語そのものにアレルギー反応なんかは起こしませんけど、実用的なソフトを作ったことがないのでアルゴリズムなどちんぷんかんぷんです。
690 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:00:07 ] にh
691 名前::: [2007/04/10(火) 19:00:55 ] C言語習ったばかりなんですが、システムを組んでみたいと思ってます。 システムを組むための参考書や問題集は売ってますかね?自分で一から システムを作るのはやはり難しいですか?
692 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:01:30 ] システムの定義を教えてくれ
693 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:03:29 ] >>690 わかりにくかったなら省きますけど要は、素人におすすめできるコンパイラ(いつまでも使えるのならなおいいけどわかりやすさ優先。)と素人向けの参考書を教えてくださいってことです。 OKですか? 眠いのでちょっと日本語がおかしかったのは見逃してください。
694 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:41:38 ] >>693 おまいは、>>690 を見て >にほんg(ry って分かったのかよw だったらなぜ、そもそも改行が出来ないんだ WindowsならBCCでおk
695 名前:687 mailto:sage [2007/04/10(火) 19:58:19 ] キャストしてもデータが途中までしか送れません>< どうすればいいんですか
696 名前:デフォルトの名無しさん [2007/04/10(火) 23:22:31 ] C言語で、char型の配列を確保する時に 領域を指定しないで宣言する方法ってありますか? char *s[]; ←のように宣言してもsのサイズが不明、もしくはゼロとか出て うまくいかないんですが、何かいい方法ありますか? 因みにこの問題ではmallocを使わないでやるという事が前提になってます。
697 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:24:37 ] callocもしくはreallocを使えばいい
698 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:28:27 ] >>695 じゃあ二回に分けて送れば
699 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:35:21 ] 質問です AまたはBならCをする if( A || B ) { C ; } という条件文をA、Bわけて記述した時に、 if( A ) { C ; } else { if( B ) { C ; } } こう記述できると思いますが、Cを1回だけ使うような記述の方法はあるでしょうか?
700 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:39:14 ] 最近、こんなトンチみたいな問題だす学校、多いのかね?
701 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:41:08 ] >>689 それはつまり1人用の麻雀ゲームを作ろうというわけですね それなら簡単なGUIと思考ルーチンが必要です 思考ルーチンは現在の状況, つまり引いた牌と持ち牌(っていうのか?もれは麻雀やらないから言い方違うかも) と相手の打った牌などから次にどの牌を打つかを決める一連の思考の手順のことです これは一般的に一種類あるいは数種類の思考パターンを用意し, これらのような決まった処理のことを アルゴリズムと言う アルゴリズム(思考手順)そのものは言語に依存しないので(もちろん言語によって書き方は異なるかもしれないけど) すでに知っている言語があったら新たにCとかC++を勉強しなくてもOK 思考手順そのものを研究するのが目的ならVBやJavaなどの簡単にGUIが作れる言語が(個人的には)おすすめ これを足がかりにほかのゲームや実用ソフトを作りたいなら将来にわたって使っていけるような言語を選ぶのもあり(CとかC++) もしLinuxなどのUNIX系OSや, プラットフォーム非依存をターゲットとするならJavaが一番手っ取り早い GTKやwxWidgetなどのクロスプラットフォームのツールキットを使うこともできる (こういったツールキットは大抵複数の言語に対応している) あるいはPythonなどのスクリプト言語を使ってみるのもあり でも, ひとこと言わせてもらうと > 自分の打ち方がどれぐらい強いのか試そうと思って の意図はいまいちよくわからないが 作ったプログラムと自分で対戦すると言うなら それは一人二役でゲームをするのと同じだからちょっと無意味っぽいと(個人的に)思う また自分の思考をプログラミングしてほかの人やプログラムと戦わせたいのなら相当の覚悟が必要 人の思考は想像以上に複雑で, 無意識や勘なども作用してくるから 完全に自分の思考回路をプログラミングすることは(現実には)不可能に近い したがって出来上がったプログラムは君自身より弱い また, 何手か先を読むような(ありふれた)機能を盛り込む場合でも 計算しなければいけない手数は爆発的に増えるから(計算量とメモリーの増加), それをいかにして押さえるかとか いろいろとテクニックも必要になってくる ここまで考えるとかなり手間がかかる もれは大学の卒論がチェスのゲーム理論だったからよくわかる
702 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:44:16 ] >>699 do { if( !A ) { if( !B ) { break ; } } C ; }while(0);
703 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:48:24 ] >>699 なぜそうするのかはわからんが 単純にフラグをつけるのもいいんじゃない? Aが真ならflag = TRUE;してBのところでflag == TRUE;ならCを実行しないとか?
704 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:49:25 ] >>699 if( A ) { C ; } else if( B ) { C ; } これじゃダメなのか?
705 名前:704 mailto:sage [2007/04/10(火) 23:52:50 ] >>699 あー1回だけの記述か
706 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:54:18 ] >>699 if(A) { goto l; } else if(B) { l: C; }
707 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:01:42 ] >>699 if(A) goto label1; if(B) goto label1; goto label2; label1: C; label2: ;
708 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:18:16 ] >>699 人気だなww
709 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:30:03 ] で、本当にこれ宿題なのか? だとしたらこんな腐った問題を出す教師ってどんなやつなんだ。
710 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:35:24 ] Q.腐った問題を出す教師自体が腐ってる確率を求めるプログラムを作りなさい
711 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:40:44 ] >>710 int main() { printf("腐った問題を出す教師自体が腐ってる確率=%d%%",100); return 0; }
712 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 01:01:48 ] >>701 えっとですね、あんまり必要ないかと思って省いてしまったんですけど。 東風荘っていうネット雀荘みたいなものがあるんですけど、そのゲームの画面の状況から変数を作るdllを見つけてですね。 上がりや聴牌の判断もそのdllの関数がやってくれるので私はその変数の扱いを設定するだけで麻雀の代うちソフトが作れるようになるわけなんです。 だから、相手は人だし麻雀というゲームを遊ぶための土台の部分は配布されているので単純にアルゴリズムを考えるだけでOKってことなんですよね。 テクニックとしては、プログラムのテクニックよりは麻雀のテクニックのほうが重要だとおもうので簡単という言葉を使わせてもらってます。
713 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 03:44:18 ] そんな面白そうなものがあるのか。 ちょっと探してこよう……と思ったら一発で見つかった。
714 名前:701 mailto:sage [2007/04/11(水) 05:22:28 ] >>712 ほほー便利だなー それなら自分がどんな風に思考しているのかと どうやってそれをアルゴリズムにするのかを悩むだけでいいのかw
715 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 07:56:24 ] if (A) { if (B) { C; } }
716 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:00:29 ] >>715 っ A==1 B==0
717 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:07:36 ] >>715 おちつけ それは、A||Bは(又は)ではなくてA&&B(喝)だ
718 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:07:36 ] 実際こういう場合はどうしたらいいの? 素直に判別式に論理演算使えってこと?
719 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:17:18 ] switch (x) { case A: case B: C; }
720 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:22:28 ] 逆に論理演算を使いたくない理由ってのがわからない
721 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:22:53 ] というかその為に論理演算子があるんだから使ってやれよ… 論理演算子が泣いてるぞ。
722 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:23:43 ] >>719 なんじゃそりゃーーー!(松田優作風に
723 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:23:56 ] AまたはBならCをする。 => AでないかつBでないならCはしない。 というド・モルガンの法則を理解するための課題であった。 なわけはないか。
724 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:22:50 ] >>719 caseは定数しかとらないので A, Bのような式はだめ
725 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:23:38 ] >>699 void f(void){ C; } int main(void){ if(A){ f(); }else if(B){ f(); } }
726 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:28:07 ] #define SHE C void main(void){ if(A){ SHE; }else if(B){ SHE; } }
727 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:29:03 ] ↑訂正 ×void main(void){ ○int main(void){
728 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:52:06 ] >>723 setjmp&longjmp関数の有用性を教えるための課題
729 名前:デフォルトの名無しさん [2007/04/11(水) 10:08:09 ] invalid digit "8" in octal constant invalid digit "9" in octal constant このコンパイルエラーって何ですか?教えてください!
730 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:15:07 ] >>729 8進数なんだから0〜7までで表せよ、 8や9なんてねーよバーカ っていうエラー。整数の頭に0をつけてるだろ。
731 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:15:55 ] >>729 #include<stdio.h> int main(void){ printf("%d\n", 012); /* 数値の頭に 0 が付くと 8進数 */ printf("%d\n", 12); return 0; }
732 名前:729 [2007/04/11(水) 10:22:40 ] >730さん >731さん ありがとうございます! 参考になりました。
733 名前:695 mailto:sage [2007/04/11(水) 10:35:06 ] 整数やら文字列が入った構造体を、ひとつの文字列にするいい方法はないですか?><
734 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:44:08 ] >>733 関数を作る
735 名前:733 mailto:sage [2007/04/11(水) 10:48:45 ] 整数やら文字列が入った構造体を、ひとつの文字列にする関数を作りたいのですが、いい方法はないですか?><
736 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:51:23 ] >>735 構造体晒せ
737 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 10:52:16 ] いつまでこのアホタレを甘やかす気ですか?><
738 名前:735 mailto:sage [2007/04/11(水) 11:02:14 ] struct test { int i; char c[10]; struct kouzoutai { int seisuu; double kazu; int suu; char moji[10]; }kou; };
739 名前:デフォルトの名無しさん [2007/04/11(水) 11:04:39 ] >>738 釣り乙 死ね
740 名前:735 mailto:sage [2007/04/11(水) 11:04:41 ] 全部snprintfとかstrcatで繋ぐのはめんどくさいです 要するにバイト列と文字列を相互変換できる方法が知りたいのです><
741 名前:735 mailto:sage [2007/04/11(水) 11:05:18 ] 自己解決しました><
742 名前:753 mailto:sage [2007/04/11(水) 11:06:53 ] 爆釣ありがとうございました><
743 名前:740 mailto:sage [2007/04/11(水) 11:07:14 ] >>741 してないです>< とりあえず16進数でずらずらと数字を並べてみることにするです><
744 名前:743 mailto:sage [2007/04/11(水) 11:08:48 ] できました><
745 名前:743 mailto:sage [2007/04/11(水) 11:21:14 ] >>744 まだやってません>< ところで、 sprintf(text, "ABC"); と sscanf("ABC", "%s", text); って strcpy(text, "ABC"); と同じですか?
746 名前:743 mailto:sage [2007/04/11(水) 11:39:57 ] 隣の後輩が教えてくれました>< ありがとうございました><
747 名前:745 mailto:sage [2007/04/11(水) 11:44:37 ] >>746 >< なんとか自分でやってみます。ありがとうございませんでした><
748 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:20:11 ] カオスすぎです><
749 名前:747 mailto:sage [2007/04/11(水) 12:26:13 ] 初心者なのですいません><
750 名前:749 mailto:sage [2007/04/11(水) 14:57:11 ] 構造体へのポインタをunsigned char*型にキャストして 1バイトずつ2桁の16進数に直したら 構造体と文字列の相互変換ができました>< unsigned char *p; unsigned char text[1024], buf[1024]; strcmp(text, ""); p = (char *)&test1.kou; for(i=0; i<sizeof(test1.kou); i++) { sprintf(buf, "%02x", (unsigned char)p[i]); strncat(text, buf, 2); }
751 名前:749 mailto:sage [2007/04/11(水) 14:59:26 ] p = (char *)&test2.kou; for(i=0; i<sizeof(test2.kou); i++) { strncpy(buf, &text[i*2], 2); sscanf(buf, "%02x", &((unsigned char)p[i])); }
752 名前:749 [2007/04/11(水) 15:00:31 ] 以上オナニーでしたありがとうございました><
753 名前:749 mailto:sage [2007/04/11(水) 15:01:26 ] また初心者を装った釣りに来ますのでよろしくです><
754 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 15:02:25 ] もうこなくていいよ
755 名前:751 mailto:sage [2007/04/11(水) 15:04:22 ] >>752-754 ほんとに初心者なのにひどいです><
756 名前:735 mailto:sage [2007/04/11(水) 15:06:39 ] すみませんなんか偽物がレスして話進んでるんですけど>< >>738 から全部偽物です><
757 名前:755 mailto:sage [2007/04/11(水) 15:09:48 ] なら>>756 も偽者ですね><
758 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:04:36 ] >>735 1バイトづつ16進2桁の文字列にしてしまうとか、あるいはコントロールコード などの表示不能な文字はエスケープして表示可能な文字にして、表示可能な 文字はそのままにするとか、あるいは表示する必要が全くないのなら気にせず 全部 write() や fwrite() で出力してしまうとか、方法は色々あります。
759 名前:757 mailto:sage [2007/04/11(水) 17:43:19 ] >>758 >表示不能な文字をエスケープして表示可能な文字にして 文字列←→構造体で相互に変換したいので、文字列から戻す時に もともと表示可能な文字だったのかエスケープして表示可能になった文字なのか 分からなくなってしまうと思うのでこの場合は使えないです><すいません ソケットプログラムでsendするときunsigned char型を使うので、 構造体を文字列にしたかったのですが後は何とか自分でがんばってみるです><
760 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:01:36 ] バイナリを可視なASCII列にするにゃ Base64 エンコが手っ取り早いような気がしないでもない が、構造体の中身をそのまんまエンコして送るのも抵抗があるな。 受け側のアライメントとエンディアン、基本型のサイズの全てが一致してないといけないしね。
761 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:01:41 ] >>759 エンコードした文字列は当然、デコードできる。 例えば不可読文字に遭遇したら%に引き続く二文字を16進の文字コードになるようエンコードする。 デコードするときは当然、その逆をやればいい。注意すべきは、%に遭遇した場合もエンコードしておく必要があることだけだ。 Ex. source: SOH "abc%" LF "def" ETX 20(4バイト整数) EOT encoded: %01abc%25%0adef%03%00%00%00%14%04
762 名前:759 mailto:sage [2007/04/11(水) 18:06:10 ] >>760-761 ありがとうございます><すごく勉強になります %をつける方法だと文字列の長さが一定にならないから送受信のとき大変そうですけど なんとか考えてやってみます
763 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:11:31 ] >>762 ソケットの送受信は長さ決め打ちして読むと泣きを見るわけだが… プロトコルを自前で規定してるか? # fgets 等を使わずに fread と fwrite で同じことを記述できるようにしてから、 # ソケットへ移行したほうが良いと思うぞ。
764 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:12:28 ] バイナリ値主体なら>760、テキスト主体なら>761だな。 #どちらも定番だね。
765 名前:762 mailto:sage [2007/04/11(水) 18:43:32 ] つい最近ソケットプログラムとかを勉強し始めたばかりなのでわからないことばかりで…。 とりあえずBase64というのをやってみることにします><;すいませんでした。
766 名前:765 mailto:sage [2007/04/11(水) 18:58:09 ] 今は文字列と数値を全部snprintfでそのまま繋げてやっていますが 構造体内の変数名とかを全部書かないといけないので ソースが汚いうえ無駄が多いです><
767 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 18:59:58 ] どういう風にやっているのかは知らないが、 そうやって単なる文字列にするのも一般的だと思うぞ。
768 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 19:03:30 ] 構造体のシリアライズは一大テーマで、 ここで扱うには余白が狭すぎるとは思うんだよなあw
769 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 20:11:51 ] >>713-714 亀ですけど、もし興味わいたなら最強の麻雀のアルゴリズム作ろうぜスレで一緒に最強のアルゴリズムつくりませんか?
770 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:12:05 ] 亀がしゃべった!
771 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:34:43 ] C始めて3日目の俺がきましたよ。 研修でダンプ出力するPGを作成する課題やってるんだけど、 ファイル開く→開いたファイルから16バイト読み込む →読み込んだデータの16進数変換を行いHEXに格納する までは出来たんだが、その後の置換処理がさっぱり分からん('A`) 置換処理はHEXに格納されたデータの表示できないコードを ピリオドに置換してCHARに格納するんだが、検討もつかないし_| ̄|○ 助けてくだしあ
772 名前:デフォルトの名無しさん [2007/04/11(水) 21:40:26 ] >>771 isprint関数を使う isprint(c)? c: '.';
773 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:43:06 ] >>770 亀レスって言葉をご存知?
774 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:44:03 ] >HEXに格納された 意味が不明すぎる char配列に16進数の文字を入れてるって事?数値?
775 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 21:50:02 ] >>773 く、くまー ネタにマジレ(ry
776 名前:771 mailto:sage [2007/04/11(水) 22:20:05 ] 参考書片手に悩んでた。 >>772 レストンクス ちと考えてみるわ。 >>774 HEXには sprintf(HEX,"%X",ss) でss内の文字列を16進表示で入れたんだが。 おそらく数値?
777 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:25:04 ] >>768 浮動小数点数を有効桁いっぱいいっぱいまで伝達しようとすると悩ましいね
778 名前:714 mailto:sage [2007/04/11(水) 23:14:51 ] >>769 いやオレはもうチェスで懲り懲りだよww プログラム部はだいたい解決策が決まってるけど 思考の部分は定石と言えるような方法がない (まあ思考とプログラムも明確に分けれるもんじゃないけどね) これ以上はスレ違いなんでそのスレの住民と一緒にがんばれ!
779 名前:771 mailto:sage [2007/04/11(水) 23:39:22 ] >>774 自分でも問題の意味を分かってなかったらしい。すまぬ。 HEXDATA CHARADATA | ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄| *|54|45|53|54| | | | | *|T|E|S|T|. |. |. |. |  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄ 見づらくてスマヌ('A`) こんな感じで格納したいわけで。 置換処理でisprint使うっていうのは大体分かったけど、for文で回してなにかしろ みたいなことを講師が言っていた希ガス。何回したらいいの(;´Д`)??
780 名前:771 mailto:sage [2007/04/11(水) 23:40:09 ] なんてこったい。 ステキにずれてらっしゃる_| ̄|○
781 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:43:15 ] 数値をCHARADATAにそのまま書けばいいじゃん
782 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:52:39 ] 回すものといえば皿ぐらいしか
783 名前:771 mailto:sage [2007/04/12(木) 00:06:20 ] レストンクス。 >>781 CHARADATAに書き込むってisprint使ってですかい? >>782 俺の頭の中で星が回ってるよ。
784 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:10:22 ] >>783 isprintで表示できないコードを判別して表示できないのならピリオドを、 表示できるのなら、そのコードを代入
785 名前:771 mailto:sage [2007/04/12(木) 00:15:09 ] >>783 なるほど分かってきた。 isprintで表示できるって判断したときに返す値って何? 表示できないってときは多分0返してくるんだよね?
786 名前:771 mailto:sage [2007/04/12(木) 00:17:48 ] 784の安価ミス
787 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:42:50 ] >>785 そこまでヒントもらってるんだからマニュアルみなよ。ぐぐってもいいしさ。
788 名前:771 mailto:sage [2007/04/12(木) 00:49:03 ] ある程度分かったから参考書片手に頑張ってみるわ。 おまいらありがとう
789 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:32:40 ] >>785 Cの真偽値の基本は、0でない=真、0=偽 真の場合、0でない値として必ず1を返すケースがいくつか定義されているが、 明言されていない場合は、0でないことだけが保証される。
790 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:41:47 ] なんで*(s+1)とs[1]の二つの書き方をつくったのよ>K&R *s++は*にしかできない書き方だし *(*(s+1)+2)は読みにくいからs[1][2]と書くんだけど なんか一貫性に欠けてるぞオイ なんでアメ人は人工言語にこんな汚い要素を持たせるのよ 完璧主義で潔癖症なオレはポインタと配列を使うとき、毎回迷うじゃん
791 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:53:05 ] >>790 *を使わなければいい。 *s++なんてロジックは却って最適化を阻害しかねない。 s[offset++]でいいジャマイカ。
792 名前:デフォルトの名無しさん [2007/04/12(木) 11:56:03 ] 読み込むファイルにひらがなあったら駄目だけどね #include <stdio.h> #include <string.h> #include <ctype.h> #define BUF_SIZE 16 int main() { FILE *fp; char filename[1024] = {'\0'}; char buff[BUF_SIZE] = {'\0'}; char *temp = NULL; size_t len = BUF_SIZE; fgets(filename,sizeof(filename),stdin); if(temp = strchr(filename, '\n')) *temp = '\0'; fp = fopen(filename, "r+b"); while(len == BUF_SIZE){ unsigned int i; len = fread(buff, 1,BUF_SIZE , fp); for(i = 0; i < len; i++) printf("%02x ",(unsigned char)buff[i]); for(; i < BUF_SIZE; i++) printf("-- "); for(i = 0; i < len; i++){ int c = buff[i]; if(isspace(c)) c = ' '; putchar(c); } putchar('\n'); } fclose(fp); return 0; }
793 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:47:04 ] >>791 そうなんだけど *s++ = *t++みたいな記述は確かに便利だし s[i]は添え字の分のメモリーも必要だし ちと読みにくくなるけど *(*(s+1)+2)でいくか
794 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:01:03 ] >>793 >s[i]は添え字の分のメモリーも必要だし ダウト。 今時のコンパイラはどっちで書いても同じコードを吐いてくれる(ことが期待できる)。
795 名前:さいきち [2007/04/12(木) 13:05:57 ] 教えてください。C言語を勉強し始めたひよっこです。 Cコンパイラ(Borland C++)をPCにインストールして、コンパイルしようとしたら 以下のようなエラーがでてウマく行きません。何が原因なのでしょうか? エラー E2209 sample1.c 5: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample1.c 10: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) 10日でおぼえるC言語入門 という本を見て勉強を始めたのですが勉強を進めきれず 困っています。 どなたか教えてください。
796 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:06:10 ] * は直接参照する時しか使わないな。 インデックスを使うときは必ず [ ] を使う。 その方が読みやすい。 全てのループは if と goto で書けるが そう書かないのと同じ事だ。 分かりやすく書くのが至上。 後の事は最近のカシコイコンパイラが最適化してくれる。
797 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:11:11 ] >>795 このあたりから setbcc とかを参考にしてみるといいかもしれない。 ttp://lacc.biz/cpp/cpp01.html
798 名前:さいきち [2007/04/12(木) 13:17:18 ] 大変申し訳ありません。795で質問しました さいきち です。 わたくしはルール違反をしてしまいました。過去ログを調べていません。調べて見ます。 795の質問は『無視』でお願いいたします。
799 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 15:49:17 ] >>798 つい最近まったく同じ質問があって、インストールしたbccがアップデート版だった というのがあったな。
800 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:20:45 ] argv[1]とargv[1][0]ってどう違うのですか? どちらも一つ目のオプションを指してると思うんですが printf( "%p %p\n", argv[1], argv[1][0] ); で表示させると違う値になります
801 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:24:04 ] >>791 >>794 >>796 コンパイラがちゃんと最適化してくれるのか 知らなかった これからは[]で統一する やっぱ*(*(s+1)+2)なんて書かれたらウザいよねw
802 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:25:44 ] >>800 argv[1] はchar* argv[1][0] は char
803 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 16:27:14 ] argv[0]は&argv[0][0]と同じってことですね
804 名前:766 mailto:sage [2007/04/12(木) 16:36:19 ] 構造体のなかのintをcharに全部変えたらbase64の文字列が短くなって通信ができるようになりました >>760 さんありがとうございました。><
805 名前:デフォルトの名無しさん [2007/04/12(木) 18:42:57 ] 入力した数字が0ではない間ループするってやつで int aho[100]; int i=0; while(aho[i]!=0){ scanf("%d",&aho[i]); i++;} ってやると0入力してもおわらんのだけどなんでじゃ?
806 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 18:51:52 ] >>805 標準入力からaho[0]に数値が入力されてるのに、while文の判定ではaho[1] 見てるからじゃね?
807 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 18:54:45 ] >>805 「入力した数字」なのだから、入力前に検査しちゃダメだろう。 do { scanf("%d", & aho[i]); ++i; } while (aho[i - 1] != 0); or int tmp = 0; do { scanf("%d", & tmp); aho[i] = tmp; ++i; } while (tmp != 0); いずれにしても、scanf()をそのまま使うのはお勧めできないが。
808 名前:デフォルトの名無しさん [2007/04/12(木) 20:37:29 ] >>806 〜>>807 ほんとだw ありがとう
809 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 21:05:32 ] >>800 別に配列にしたからって、より最適化してくれるってわけでもないがな。