- 1 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 23:27:18 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 60 pc12.2ch.net/test/read.cgi/tech/1264920499/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.72【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1267775473/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 134代目 pc12.2ch.net/test/read.cgi/tech/1263824755/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 360 名前:353 mailto:sage [2010/03/14(日) 16:52:37 ]
- >>359
わかりました、ありがとうございます また、疑問に思う事があったら質問します
- 361 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 17:56:37 ]
- C言語の入門サイトではヘッダの作り方がかかれていませんが、
C言語では普通ヘッダを作らないのでしょうか? ちなみに、*.cを*.hにするだけじゃダメなんですか
- 362 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:37:33 ]
- if(1)
{〜} else {〜} elseブロックは最適化で消滅する?
- 363 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:46:39 ]
- >>361
ちょっと規模が大きいとファイルを複数にわけるんで、ヘッダを作るのが普通。 ヘッダには定数とか関数のプロトタイプを入れるもんなので、.cを.hに変えるだけじゃだめ。
- 364 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:51:50 ]
- だめだお。
- 365 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 18:52:32 ]
- >>362
おまえさんが使っているコンパイラに聞いてみろ
- 366 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:05:19 ]
- >>245
ソース見たら、たぶん20行から28行までのところを、なんかしたら、なんかなるかもなぁ〜〜って気がしたんで、 そこのところをあてずっぽうでいじったら、456 って出た(^_^/わーい ソースの、ここのところを /* 各桁の数字を、有効な桁まで計算しておく */ for(i = 0, trunc = 0; i < 15; ++i) { m = modf(n, &n); buf[i] = (int)n; n = m * 10.0; ↓ こういうふうに変えてみたです。あとはいっしょです /* 各桁の数字を、有効な桁まで計算しておく */ double def = n; // ここと for(i = 0, trunc = 0; i < 15; ++i) { m = modf(n, &n); buf[i] = (int)n; n = ( modf( ((def+pow(10.0,-15)) * pow(10.0,i)), &n ) * 10.0 ); // ここ わかんないけど、「誤差とかが、掛け算で、かける10ってのを何度もしてると、誤差がでるのかなぁ〜」とかおもったので、 まいかい全部バ〜〜って、かける1000とかして一気にやったらどうかな?って思ってやったけどダメだったので、 しょうがないので0.00000......1 て小さい1足して、四捨五入しちゃえ〜〜 えいや〜〜ってやったら、なんか偶然456 ってなった。 よかった。 すいません、ぜんぜん知的じゃなくて(・_; 算数的な根拠はないです。なんかラッキー頼りですみません(orz はずぅ〜〜い
- 367 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:05 ]
- >>363
thx
- 368 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:40:38 ]
- C言語のことならなんでも聞いてくれるんですか。
- 369 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:21 ]
- 難しいのはちょっと・・・
- 370 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:51:50 ]
- さあ願いを言え
どんな願いも一つだけ 聞き流してやろう…
- 371 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:05:45 ]
- いくらでも聞くよ
- 372 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:35 ]
- >>366
pow()のアルゴリズムを知っているか? 知っていればすぐに判ることだが非常に誤差が発生しやすい。 従って、第二パラメータが整数になるなら使わない方が無難。 後は、その分の計算量をどこでどう分散させるかだな。
- 373 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:32:38 ]
- いまだにミドルウェアっていうのがよくわからない
- 374 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 11:29:44 ]
- >>373
ミドルウェアってのはOSとソフトウェアの中間に値する物 ミドルウェア = DBMSって覚えておけばok
- 375 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 11:49:53 ]
- ヘッダファイルには全ての関数/変数に、extern/staticを付けなければならないんですか?
- 376 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:44:34 ]
- いいえ
- 377 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:50:48 ]
- >>375
そもそも、ヘッダファイルで定義をしてはいけません。
- 378 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:01:24 ]
- 中間搾取w
- 379 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:04:54 ]
- 元ダフ屋が金券ショップになりやがて中央銀行になったようなもの
- 380 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:58:35 ]
- >>338
#include <stdio.h> #include <stdlib.h> void main(int argc, char** argv ) { char str[0xFF]; double n[1000]; int n_max = 0; int i=0; FILE* fp = fopen( argv[1], "r"); while( fgets(str,0xFF-1,fp) != NULL ){ n[n_max++]=strtod( str, NULL ); } srand((unsigned)(time(NULL))); while( i < 5 ) { int r = rand()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }} } くじびき的な何か?
- 381 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:02:18 ]
- ↑
fopen、fscanf、for、ifのみを使って という条件を満たしていない気がするのだが、いいのか。
- 382 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:58 ]
- うむ、randが使えないのが難点だな
- 383 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:11:06 ]
- >>380
fgets()の第二パラメータの意味を誤解していそうだ。
- 384 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:47 ]
- せめて現在時刻がわかれば乱数のように使えるのに
制限が厳しすぎる
- 385 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:27:10 ]
- __asm は使ってもいいですか? 関数じゃないからいいよね?
- 386 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:53:32 ]
- 乱数の代わりに初期化していない自動変数の中身を読むってのは無し?
- 387 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:14:56 ]
- 厳密なことをいうと、十分にランダムである保証がない
特に乱数や、乱数の種、ましてや暗号関係で使うのは厳禁 あと初期化されていない変数って、規格上は読んでいいんだっけ?
- 388 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:18:33 ]
- 定義されていないだけで、読むのは別にいいんでない
- 389 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:39:10 ]
- >>381
#include <stdio.h> #include <stdlib.h> static double s; static int rnd(void){ int p; if(s>1e+8){s*=1e-4;}; if(s<0){s*=1e+8;} s += 0.1*s; return((s<0.0)?-s:s); } void main(int argc, char** argv ) { char str[0xFF]; double n[1000]; double d; int n_max = 0; int i=0; FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; } s=((double)((long)&str)); rnd(); for( i=0; i<5 ; ){ int r = rnd()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }} } な、なんか意味あんのん?… この制限て…(・_; ばたり…
- 390 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:43:09 ]
- もうひとつ制限がありました。7行で書いてください
- 391 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:47:44 ]
- 改行しなきゃいいだけ
- 392 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:53:39 ]
- >>390
#include <stdio.h> static int rnd(double* s){ int p; if(*s>1e+8){*s*=1e-4;}; if(*s<0){*s*=1e+8;} *s += *s*0.1; return((*s<0.0)?-*s:*s); } void main(int argc, char** argv ) { double n[1000]; double d; int n_max = 0; int i=0; double s =(double)((long)&n); rnd(&s); FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; } for( i=0; i<5 ; ){ int r = rnd(&s)%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }} } もぅ寝まつ…(つ_\
- 393 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 01:08:23 ]
- >>338
これでどうだ ウチでは実行するたびに結果が変わったよ #include<stdio.h> #define DATA_NUM 1000 int main(void) { unsigned long rand_pool[DATA_NUM], rand_num[5]; int value[10], i, index; FILE *fp; if((fp=fopen("hoge.txt", "r"))==NULL) return 1; for(i=0;i<10;i++) if(fscanf(fp, "%d", &value[i])!=1) return 2; for(i=0;i<DATA_NUM;i++) rand_num[i%5]^=rand_pool[i]; for(i=0;i<5;i++) { index=rand_num[i]%(10-i); printf("%d\n", value[index]); value[index]=value[10-1-i]; } return 0; }
- 394 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:27:07 ]
- 回答が知りたい。
こんな問題を出した意図とか。 どうせ>>338が問題を書き間違えて重要な情報が抜け落ちてたってオチだろうけど。
- 395 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:26:46 ]
- 関数で参照渡しするときの所作を詳細に教えてくささい
- 396 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:30:29 ]
- まず、参照渡しの定義をしてから質問してください
- 397 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:36:06 ]
- C言語では参照渡しはできません
JAVAを使いましょう
- 398 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:37:08 ]
- もどきはできるじゃん
- 399 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:37:44 ]
- ポインタによる間接参照
- 400 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:08:09 ]
- >>395
洒落じゃね?
- 401 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:45:29 ]
- sprintfを使って整数から文字列に変換しようとするとき
"%04d",i みたいに前をゼロで埋める指定で、0で埋める個数って変数にできないんですかね?
- 402 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:49:04 ]
- *
- 403 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 23:05:00 ]
- なるほど、%0*d , (int) , i でいけました
ありがとうございます
- 404 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:08:23 ]
- 超初心者ですがよろしくお願いします。
Macでも使えて軽いコンパイラってありますか?
- 405 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:26:55 ]
- gccでいいだろうに
- 406 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 06:44:00 ]
- 軽いコンパイラって、どんなコンパイラだよ。
- 407 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 14:35:10 ]
- じゃ軽いライブラリで
- 408 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 15:30:45 ]
- 俺の作ったコンパイラすごいぜ。
5年前のノートPCなのに、円周率計算させると2秒で5億桁まで出力する。 VisualStudio2008ってソフトなんだけど。
- 409 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 15:42:31 ]
- ネタだろうけど、GMPより糞速いじゃん
gmplib.org/pi-with-gmp.html
- 410 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 00:39:07 ]
- gccでプログラム作ってます。
例えば、buff=(char *)malloc(sizeof(char) * 10);とメモリを確保したあと 配列が不足するたびにreallocでメモリを増やしていこうと考えてます。 buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。 そこで悩んだのですが、ある時点でbuffにどれくらいメモリが割り当てられてるか 確認する方法ってないですか? 「* 10」を「* i」みたいに変数を使って確認するしかないんでしょうかね?
- 411 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 00:41:37 ]
- サイズを保存するしか無いよ
- 412 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 00:46:46 ]
- >>411
ありがとう。そうします。
- 413 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:11:33 ]
- >>410
> buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。 出たよ。メモリ確保できないときにリークが確定するパターン。 初心者に realloc() 教えるとすぐこれをやらかす。
- 414 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:16:08 ]
- 鬼の首でも取ったのか?
喜びすぎだろ
- 415 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:20:57 ]
- 喜んでるわけが無いだろjk
うんざりしてるんだよ。
- 416 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:32:19 ]
- #include <stdio.h>
#include <stdlib.h> // 構造体 B typedef struct tagB { int max_size; char* buff; } B; // B を初期化する命令 void B_init( B* b ) { b->max_size=10; b->buff =(char*)malloc(sizeof(char) * b->max_size); } // B のメモリを10ふやす命令 void B_realloc( B* b ) { b->max_size += 10; b->buff = (char*)realloc( b->buff, sizeof(char) * b->max_size ); } // Bに char を一文字セーブする命令 ( B の buff が短かったら自動的に伸ばしてくれる ) void B_write( B* b, char c, int index ) { if( index >= b->max_size ){ B_realloc(b); B_write( b, c, index ); } b->buff[index] = c; } // Bから char を一文字ロードする命令 ( B の buff が短かったら自動的に伸ばしてくれる ) char B_read ( B* b, int index ) { if( index >= b->max_size ){ B_realloc( b ); B_read( b,index ); } return( b->buff[index] ); } void main() { B b; B_init( &b ); B_write( &b, 'A', 12345 ); printf("%c\n", B_read( &b, 12345 ) ); } おこられそう…w(^_^
- 417 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:52:10 ]
- >>416
怒りはしないが、ダメダメ。 ロードする関数でrealloc()しても、増えた領域に何にも書いてないから不定値が返るぞ。 それに、セーブする方も任意のindexを指定できるのに一度に伸ばせるのが高々10文字だから簡単に範囲外書き込みになってしまう。 それに、sizeof(char)なんて無意味なことは書くべきじゃない。
- 418 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:55:55 ]
- >>413
出たよ。問題の本質と関係ない話をする奴。 buffの宣言がないじゃん、と言ってるのと同レベルだぜそれ。 初心者じゃなくなったと思い込んでる初心者はすぐこれをやらかす。
- 419 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:56:52 ]
- そもそも、メモリ確保ができなくなる心配をする前にすることがあるだろうと。
- 420 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 02:57:08 ]
- その程度のサイズでrealloc使うとか、何の冗談だよw
- 421 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 03:00:21 ]
- 足りなければ倍にするというやんちゃな方式が時として功を奏することもあるよ
とりあえず、ポインタを元にアロケーションしているサイズを知ることはできないので他で管理しましょう >>420 ええと。
- 422 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 09:12:57 ]
- どうしても必要ならともかく、入門レベルでrealloc使わせるのはどうかと思うが。
余裕をもとって大きめに領域確保するほうがよっぽどマシ。
- 423 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 09:15:29 ]
- >>413
すぐそのあとに、if (buff == NULL) exit(1); と書けば問題なし。 メモリ不足なら、ほかのところだってまともに動くわけないんだから。
- 424 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 09:32:48 ]
- >>422
それはそれでイヤン
- 425 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 11:07:20 ]
- >>424
サイズをオーバーするかどうかちゃんとチェックするならありじゃね?
- 426 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 14:55:30 ]
- >>425
オーバーしそうになったらどうすんの?
- 427 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 15:50:24 ]
- >>426
・ごめんなさい、私には無理です ・オーバーする分はなかったことにしていいよね どちらでもお好きに。
- 428 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:08:53 ]
- 一行が長いテキストファイルを開くと落ちるエディタ
一行が長いと後ろのほうが切り捨てられるエディタ どっちもいやだなぁ
- 429 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:10:43 ]
- 4G以上のファイルとかどうやって扱ってんのか気になる
- 430 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:27:26 ]
- >>429
4GB以上のファイルを普通に扱える環境なら、64ビットアドレッシングで使うのが当たり前だから特に工夫は要らないよ。 32ビット環境で扱いたいなら、一度に全部開かなければいいだけだからやはり、4GB以上だからといって別段大仰な手間は要らない。 >>428 初心者が作るのなら、取り敢えずそれでもいいのでは? まさか、そのまま保存するわけでもあるまいし。
- 431 名前:デフォルトの名無しさん [2010/03/19(金) 19:50:57 ]
- 文字配列についてお尋ねします
char buf[6] = {'A', 'B', 'C', 'D', 'E', '\0'}; と宣言したとします。 このとき buf[1]は 'B'が格納されており文字コードが例えば66だとします buf[1]は数値そのものであるので、if(buf[1] == 66)もしくはif(buf[1] == 'B')のような比較が可能です。(ですよね?) ここでbufとするとABCDEという文字列を表すことになりますが、このときbuf自体の数値は bufのアドレスが入っています。(ですよね?) ここで疑問なのですが、bufは一体どこのアドレスが入っているのでしょうか? 例えば、buf[0]のアドレスと同じものであればAとしか表示されないはずです。 ABCDE\0をもってくるにはbuf[0]からbuf[5]までのアドレスが必要なはずです。 buf自体はアドレスの開始地点で終端文字の\0が現れる部分までのオフセットを割りだし そのアドレスをすべて与えて文字列を表示しているということでよろしいでしょうか? 回答よろしくお願いします。
- 432 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:01:01 ]
- >>431
buf と等価なのは &buf[0]
- 433 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:04:08 ]
- >>431
だいたい合ってるが、1点だけ。 > ここでbufとするとABCDEという文字列を表すことになりますが、 bufがABCDEという文字列を表しているわけではない。 あくまで文字列の先頭のアドレスを保持しているにすぎない。 buf == &(buf[0]) puts(buf)で"ABCDE"と表示されるのは、以下のような処理をしているため。 for(char *p = buf; *p != '\0'; p++) { *pを出力; }
- 434 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:07:07 ]
- >>431
配列は配列であってポインタじゃない
- 435 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:10:42 ]
- char buf[] = {'h', 'o', 'g', 'e', '\0'}
char *p = buf; buf ↓ 'h' 'o' 'g' 'e' '\0' ↑ 0x00..... ← p
- 436 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:13:39 ]
- グダグダ言ってないでデバッガで変数見りゃいっぱつだろうが
- 437 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:14:09 ]
- >>431
>ここでbufとするとABCDEという文字列を表すことになりますが ここでってどこだよw
- 438 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:26:53 ]
- >431
言っていることはその通り何だけど NUL('\0')終端文字列はNULが現れるまでを文字列とみなすから表示させたい最初の文字のアドレスを渡すだけでいいのよ あなたにお薦めなサンプルプログラム #include <stdio.h> #include <string.h> int my_print(char const*str) { size_t i; for ( i = 1; i < str[0]+1; ++i ) { putchar(str[i]); } return i-2; } int main(int argc, char **argv) { char foo[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; char bar[16] = {'a', 'b', 'c', 'd', 'e'}; char baz[] = {3, 'b', 'a', 'z'}; memset(bar+5, '\100', 10); /* ゴミを入れる */ bar[15] = '\0'; /* NUL終端させる */ printf("%s\n", foo); printf("%s\n", &foo[0]); printf("%s\n", &foo[3]); printf("%s\n", bar); my_print(baz); return 0; }
- 439 名前:デフォルトの名無しさん [2010/03/19(金) 21:22:55 ]
- 配列はメモリ上連続しているので、先頭アドレスと型がわかれば計算で出ます。
コンパイラは &buf[5] を &buf[0] + (5 * sizeof(char)) と捉えます。
- 440 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:33:35 ]
- プログラミングに使う単語って英語ですか?
- 441 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:37:20 ]
- 基本的には
- 442 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:43:31 ]
- 皆さんは英語ペラペラですか?
- 443 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 21:44:01 ]
- My English is poor.
- 444 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:17:57 ]
- >>442
fuck u
- 445 名前:431 [2010/03/19(金) 22:18:43 ]
- >>433
buf自体がが先頭アドレスなのは↓に書いたように知ってます >buf自体はアドレスの開始地点 結局全部 for(char *p = buf; *p != '\0'; p++) { *pを出力; } これやってるだけなんですね…
- 446 名前:431 [2010/03/19(金) 22:24:21 ]
- >>439
buf[5]を例えばprintfするときはオフセットで 文字列を全部表示するときはポインタをズラす方法で表示しているのですか? for(char *p = buf; *p != '\0'; p++) { *pを出力; } このようにポインタをズラしているのか、 それとも &buf[5] を &buf[0] + (5 * sizeof(char)) のようにオフセットで計算しているのか 内部の処理はどっちなんでしょうか? それが>>431の質問で一番知りたいことなんですが
- 447 名前:431 [2010/03/19(金) 22:26:02 ]
- >>436
オフセットで計算したものか、ポインタをズラしたものなのか 格納されたアドレス見るだけじゃわからないんですよ…
- 448 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:26:32 ]
- どういう風にprintfを作るかなんて決まってないしコンパイラメーカーが勝手にやってるだけだよ
きっと、前者だろうなって気はするけど
- 449 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:27:39 ]
- 前者な気がする
- 450 名前:431 [2010/03/19(金) 22:28:24 ]
- >>448
そうなんですか… どっちが主流なのか知りたかったのですが(速度とかいろんな意味で)
- 451 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:30:39 ]
- そんなこと知ってどうすんだろ
- 452 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:31:24 ]
- 速度とかそれこそきまってねえだろ
おまえはなにか?コンパイラは全て同じ中身じゃないといけないと思ってんのか?主流ってなんだ?どの環境の主流だ? クソして寝ろや
- 453 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:33:28 ]
- >>450
もう答えは出てるだろう。文字列探索程度のコストを気にするより もっと他の所の速度を気にしろ。
- 454 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:35:29 ]
- 簡単なプログラムつくって、最適化全部はずしてバイナリを逆アセンブルして追っかけてみれば?
ペンティアム以降になると急に難しくなるから、LSICの試食版あたりからははじめて あるいはgccならprintfもソースみれるよ そうやって3,4個調べてみれば主流もわかるんじゃね
- 455 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:38:50 ]
- robot C わかる人いる?
- 456 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:41:38 ]
- ボクは個人的には
char c[1234] ってのを putchar( c[0] ); putchar( c[1] ); putchar( c[2] ); putchar( c[3] ); putchar( c[4] ); putchar( c[5] ); 〜〜〜ずーっとつづく って書くよりも char* p=c; putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); 〜〜〜ずーっとつづく って書く方が、コピペが楽なので好きですw
- 457 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:43:53 ]
- ?
- 458 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:44:02 ]
- 頭おかしいのかおまえ
- 459 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:52:53 ]
- 俺がコンパイラなら syntax error 出すわな
- 460 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:53:21 ]
- 最終的にはsystem callを追っかけてlibcやkernelに入りそうだな
|

|