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++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
7 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 23:52:20 ] >>5 > スタック上に準備すべきサイズもわかります。 それはコンパイル時に判明したサイズですよね。 実行時もそのサイズを知る必要があると思うのですが、どこにあるのですか。 実行バイナリファイルにあるのでしょうか。 プロセスの仮想空間にロードされた後もわかるのでしょうか。
8 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 23:56:32 ] >>3 スタックの大きさは決めうち コンパイルオプションで変えられる 実行時に呼ばれた関数が必要としている分だけ スタック領域を準備しようとするけど実行時に不足していればスタックオーバーフローで止まる 再帰関数で油断してたり、巨大な配列を自動変数で確保しようとしたりするとよく起こること
9 名前:5 mailto:sage [2010/03/05(金) 23:56:51 ] >>6 んー、確かにC99可変長配列の扱いはありましたね。
10 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:00:56 ] >>7 コンパイル時に自動変数に必要なサイズが判明しておれば、それにしたがってスタックポインタを変化させるコードをコンパイル時に生成すればいいのでは。 実行時にあらためて自動変数のサイズを求める必要はないはずです。仮想メモリの話は関係ないと思います。
11 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:06:08 ] >>7 homepage1.nifty.com/~sha_w/masm/model.html このページのPROC 〜 ENDPのところにスタックフレームを作ってるアセンブラのコードが あるでしょ。 add sp, 0FFFCh ;ローカル変数領域の作成 のところで、たとえば、intの変数が三つあったら、add sp, 12 ってコードが生成される。 それだけの話。
12 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:06:37 ] >>10 つまり、局所変数のサイズが300バイトだとしたら スタックポインタ = (現在の)スタックポインタ + 300バイト + その他情報の大きさ みたいな命令を、関数呼び出し毎にしているってことなのでしょうか。 質問ばかりですみません。
13 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:07:42 ] >>11 まちがえた。add sp, -12 だな。
14 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:08:26 ] >>11 なるほど。少し納得しました。 これで寝られそうです。みなさん、ありがとう。
15 名前:デフォルトの名無しさん [2010/03/06(土) 00:34:25 ] これは酷い fx.104ban.com/up/src/up13600.jpg
16 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:38:03 ] >>15 みゃくらくもなくグロ
17 名前:デフォルトの名無しさん [2010/03/06(土) 00:39:17 ] こんな板でも貼る奴いるんだな
18 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:44:48 ] 寝る前に見てしまった...orz
19 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 01:25:51 ] >>15 とにかくグロ注意 みゃくらくは不明だが... (誰か削除依頼したほうが良さげ)
20 名前:デフォルトの名無しさん [2010/03/06(土) 01:34:21 ] そんなもんどうでもいい
21 名前:デフォルトの名無しさん [2010/03/06(土) 01:36:47 ] 誤爆だったw すまんwwww これで許してwwwimg.f.hatena.ne.jp/images/fotolife/g/gatinko-uragazou/20080315/20080315232919.jpg
22 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 01:38:49 ] コラなんか要らんわぼけ
23 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 09:14:42 ] アセンブラを勉強すれば関数呼び出し時のスタック操作とか自分でやるから理解が深まるけどな。 しかし、なんでここまで気にするんだろ?
24 名前:デフォルトの名無しさん [2010/03/06(土) 12:13:05 ] たぶん自分独自のコンパイラ開発しようとしてるんだろ。ううんきっとそう
25 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 12:45:36 ] エラー時にスタックトレースを出力したいとか
26 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:05:44 ] >>23 ここまで気にする人だから、Cを学ぼうとしているんだろう。 低レベルに興味ない奴はVBとかJavaに行くだろ。
27 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:09:15 ] 知らなくても察しが付くことだけどな
28 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:14:13 ] そうか?それって天才じゃね?
29 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:29:55 ] 問題: 配列a[10]に対して、以下のコードと同等の結果になるコードを、gcc c言語のインラインアセンブラによるSSE3を駆使したコードで書け なお、long long型のサイズは8バイト。 4 long long a[10] = { 0x1234L, 0x5678L, 0x9012L, 0x3456L, 0x7890L, 0x1234L, 0 x5678L, 0x9012L, 0x3456L, 0x7890L }; 5 6 int i=5; 7 do{ 8 *(a+i+0) *= 0x3L; *(a+i+1) *= 0x3L; 9 i--; 10 }while( i > 0 ); という問題があったとして、答え合わせの解答集を無くしてしまったとして、答え合わせにこまってます。 ここの住人の方々は、みんな超スーパーハカーぞろいだという噂を聞きました。 どうか皆様がたのウルトラハイパー知識をくしして、この超難問の答えを導き出していただけませんでしょうか…! よろしくおねがいします。
30 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:44:53 ] 4 long long a[10] = { 0x1234L, 0x5678L, 0x9012L, 0x3456L, 0x7890L, 0x1234L, 0 x5678L, 0x9012L, 0x3456L, 0x7890L }; 5 6 int i=10; 7 do{ 8 *(a+i-0) *= 0x3L; *(a+i-1) *= 0x3L; 9 i--; i--; 10 }while( i > 0 ); すみません、こうでしたw
31 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:47:43 ] >>30 まだ間違ってるんじゃね?
32 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:00:02 ] >>29 なんでお前に命令されなきゃいけないわけ?
33 名前:デフォルトの名無しさん [2010/03/06(土) 17:23:15 ] その前にいくらよいしょしてもここにそんなに知識のある奴はいないと思うが。
34 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:36:02 ] おれ>>32 だけど、ちょっと頭がおかしくなってた。 ごめんな。
35 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:46:26 ] > 問題があったとして、 解答集を無くしてしまったとして そもそも仮定からしておかしい
36 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:00:29 ] つーか >インラインアセンブラによるSSE3を駆使したコード どういう頭の構造だと、これが C の質問だと思えるのかと。
37 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:38:27 ] /* sayHello() 関数へのポインタ */ void (*func)(void) = sayHello; このとき、'func()' と '(*func)()' の違いって何ですか? 結果は同じなのですが...
38 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:47:52 ] 281 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 00:27:05 関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね? もともとはどっちが正しいの? 282 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 01:06:42 元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、 世間に受け入れられたなんて話を聞いたことがある。
39 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:49:50 ] ↑ ありがとう.
40 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:54:41 ] #include <stdio.h> int main () { unsigned long long a[10]={ 0x1234111111111111L, 0x5678000000000000L, 0x9012000000000000L, 0x3456000000000000L, 0x7890000000000000L, 0x1234000000000000L, 0x5678000000000000L, 0x9012000000000000L, 0x3456000000000000L, 0x7890000000000000L }; unsigned long long b[2]={3,3}; printf("3a={%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx}\n", a[0]*3,a[1]*3,a[2]*3,a[3]*3,a[4]*3,a[5]*3,a[6]*3,a[7]*3,a[8]*3,a[9]*3 ); unsigned long long* ap = a; unsigned long long* bp = b; int i=5; while(i-->0){ asm volatile ("\ movdqa (%0),%%xmm0;\ movdqa (%0),%%xmm1;\ paddq %%xmm1, %%xmm0;\ paddq %%xmm1, %%xmm0;\ movdqa %%xmm0,(%0);\ " : "+r" (ap) : "r" (bp)); ap++; ap++; } printf ("3a={%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx}\n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]); return(0); }
41 名前:40 mailto:sage [2010/03/06(土) 21:57:23 ] を実行したら 3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000} 3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000} ってなりました… 意味が分かりません… 動くはずないのに… なんで動いてるんですか…(orz
42 名前:デフォルトの名無しさん [2010/03/06(土) 22:57:36 ] WindowsNT系のコマンドをC言語で呼び出す方法を教えてください。 dirなどのコマンドを呼び出す方法を教えて欲しいです。 仮に代替できるWin32APIやC言語の関数があったとしても、dirを直接呼び出す方法を教えてください。 よろしくお願いします。(dir以外の他のコマンドも将来的に呼び出したいため) 環境はWindowsNTだけサポートしてれば大丈夫です。
43 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:08:33 ] systemとか winexeとか dirだけでいいならopendirとか
44 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:41:00 ] _poepn
45 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 00:28:51 ] CreateProcessだろ DOS画面出さず出力をメモリに入れられる
46 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:03:39 ] >>45 つスレタイ
47 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:59:22 ] const と define の違いが今ひとつわからない どっちも定数を定義するんだよね?
48 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 08:47:35 ] ココでも読め。 detail.chiebukuro.yahoo.co.jp/qa/question_detail/q128719177 rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200510/05100021.txt
49 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:20:16 ] C言語でrailsのActiverecord 作ってくださいお願いします
50 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:23:47 ] 自分でやれよ
51 名前:デフォルトの名無しさん [2010/03/07(日) 10:37:04 ] >>47 define ・・・最も古くから使われている enum ・・・ヒゲさん曰く見えない圧力に押されて追加、いまいちらしい const ・・・禿と共同開発 定数を返す関数という手もあり これが実は最も融通が利く
52 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:55:25 ] defineはコンパイル時に置き換えてくれるだけ だからマクロとして使えるし、関数丸ごとdefineしてみるとか変なこともできる __LINE___や__TIME___みたいなコンパイル時に決まるやつもある 事項時はもうすでに置き換わっているのでaaaaとかって名前でdfineしてデバッカでaaaa探してもない constはメモリ上に固定でそいつがずっといるだけ つまりデバッカで値も見れる
53 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:55:26 ] >>47 これ↓も似たような質問かな? C言語のdefineとグローバル関数について - Yahoo!知恵袋 detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1237313677
54 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:57:16 ] おれ52だけど なんでアンダーバーが3っつなんだろ??
55 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:59:46 ] コンパイル時というかプリプロセス時
56 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:00:50 ] キーリピート間隔を短く設定していたんじゃないのか
57 名前:デフォルトの名無しさん [2010/03/07(日) 11:12:23 ] 8bitのデータで、 6ビット目が1になったら他のビットが1でも0でも関係なく特定の処理をする動作はどのようにすればよいでしょうか。
58 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:17:02 ] & (1 << 5)
59 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:17:36 ] if(data&0x20){ 特定の処理 }
60 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:36:45 ] ループを使わずに配列の順序を逆にせよ。 という問題は、ループ制御構造(whileやfor)を使わずに、という意味でいいのかな? 関数の再帰呼び出しでもできそうだけど、goto文使ったらだめ?
61 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:38:53 ] >>60 それはCの問題ではなく日本語の問題じゃね? どういう意図で書いたのかを書いた人に聞けよ
62 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:43:04 ] >>61 このホワイトボードプログラミングのところ: http://japan.zdnet.com/sp/feature/07tenthings/story/0,3800082984,20409456-2,00.htm 一応、こんな感じで(^^ int * reverse(int ary[]) { int i = 0; int j = SIZE - 1; int tmp; loop: if (i >= j) goto end; tmp = ary[i]; ary[i++] = ary[j]; ary[j--] = tmp; goto loop; end: return ary; }
63 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:47:31 ] gotoつかってもループだろ
64 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:49:50 ] goto文はループ制御構造ではないんですよね。 だったら「ループを使わずに」じゃなくて「再帰を使って」、と書けばいいのに。。
65 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:51:03 ] たぶん出題意図としては、再帰を使ってほしいんじゃないかね Cというよりは関数型言語でやらせるような問題
66 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:52:09 ] >>62 答え出てるぞ * ループを使わずに配列の順序を逆にする。 答え:順次、配列を画面に表示して行ってオペレーターにメモさせておき、 メモした値を逆順に入力するよう促すダイアログを出す。
67 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:21:02 ] 画像の範囲内をマウスのクリックで判定させるにはどのような考え方をすればよいのでしょうか? 参考サイトがあれば紹介して頂きたいです。
68 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:30:16 ] UNIX環境でVCの代わりになるような物ってないですかねぇ
69 名前:デフォルトの名無しさん [2010/03/07(日) 13:34:37 ] VC のどんな特徴の「代わり」ができればいいんだ? VC そのものなら Xen という手もある
70 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:35:53 ] >67 その画像が矩形なのか矩形以外の多角形なのかで変わる >68 Anjuta, Emacs, Geany
71 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:38:38 ] >>70 矩形を想定しています。
72 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:44:12 ] >>71 ドラッグして範囲選択みたいな感じ? 考え方っていうか、サンプルコード見たほうが早いんじゃない? マウスダウンのイベントでマウスカーソルをキャプチャして、マウスの ボタンが離されたれらそこまでが選択範囲だけど。
73 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:49:13 ] 単にヒットした座標か画素が欲しいだけだろ
74 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:53:45 ] 範囲選択ではなく、画像のスイッチのような感じです。 一定の矩形の範囲内をクリックすることで、処理が行われるようにしたいと 思っています。
75 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 13:58:16 ] ゲームでも作りたいんじゃないの 確かやねうさんはビット演算でやっていたな 自分で紙に矩形とポイントを描いて条件を考えてみれば自ずと答えが見えてくるよ
76 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 14:20:51 ] マウスの位置と矩形の位置を取得しておいて 矩形の上境界線と下境界線の間にマウスの縦座標があって 左境界線と右境界線の間にマウスの横座標があればいいだけじゃないの?
77 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 14:30:09 ] left <= x && x <= rignt && bottom <= y && y <= top
78 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 14:30:29 ] >>67 むかしBMPファイル(って予備領域とか拡張可能になってるから)に勝手にホットスポットっていうか クリック可能位置を付け足してクリックすると話が進む紙芝居、見たいなの作った 言語も環境も書いてないからあれだけど クリッカブルマップ、とかでググってみるとなんとかくやり方わかると思うよ あとは環境しだいで同じ様な事を違うやり方でやれば
79 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 14:44:28 ] 様々なご回答ありがとうございます。 全て参考にさせて頂きます。
80 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 15:18:45 ] >>68 : kdevelop (書こうとしてる字を予測して、自動補完してくれるからラクちんです) >>71 : 三角形がいっぱいあるとおもってやるほうほうもあるみたいですよ。 double OuterProduct( double ax, double ay, double az, double bx, double by, double bz, double cx, double cy, double cz ) { double Ax=bx-ax; double Ay=by-ay; double Az=bz-az; double Bx=cx-bx; double By=cy-by; double Bz=cz-bz; double opx = (Ay*Bz-Az*By); double opy = (Az*Bx-Ax*Bz); double opz = (Ax*By-Ay*Bx); return opz; } B A △ C 3角形ABC の中に、点P が「中かな?外かな?」ってのを知りたいときは、 「AB と P」、「BC と P」、「CA と P」 の3つについて、この関数で調べてみて、戻り値が3つとも全部プラス、または3つとも全部マイナスなら 点Pは 3角形ABCの内側ってことらしいです。 なんでか理由はよくわかりませんがw 符号1 = OutarProduct( Aのx座標、Aのy座標, 0、 Bのx座標、Bのy座標、0、 Pのx座標、Pのy座標、0 ); 符号2 = OutarProduct( Bのx座標、Bのy座標, 0、 Cのx座標、Cのy座標、0、 Pのx座標、Pのy座標、0 ); 符号3 = OutarProduct( Cのx座標、Cのy座標, 0、 Aのx座標、Aのy座標、0、 Pのx座標、Pのy座標、0 ); if( 符号1と符号2と符号3が、3つともプラス。 または3つともマイナスなら){ 点Pは、さんかっけいABCのうちがわ♪ } ってなるみたいです。 なんでか理由はよくわかりませんがw こんど算数の先生に聞いてみまーす。
81 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 15:22:25 ] 外積で左右判定してるんでしょ
82 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:35:50 ] >>67 三角形の内部の点かどうか判定するプログラム #include<stdio.h> #include<math.h> int is_inner(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) { double Ax, Ay, Bx, By, Px, Py, alpha, beta, divisor; Ax=ax-cx; Ay=ay-cy; Bx=bx-cx; By=by-cy; Px=px-cx; Py=py-cy; divisor=Ax*By-Bx*Ay; if(fabs(divisor)<1.0e-6) return 0; alpha=(By*Px-Bx*Py)/divisor; beta=(-Ay*Px+Ax*Py)/divisor; if(0.0<alpha && alpha<1.0 && 0.0<beta && beta<(1.0-alpha)) return 1; return 0; } int main(void) { printf("%d\n", is_inner(1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 0.5, 0.499)); return 0; }
83 名前:デフォルトの名無しさん [2010/03/07(日) 21:51:15 ] 再帰的アルゴリズムの利便性がわかりません。 下手をすればスタック領域が蓄積されていってメモリ不足に陥りますよね。 再帰を使わなくても他に解決できる手段があればみなさんはどちらを選択しますか
84 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 21:54:10 ] >>83 間違いが少ないほう
85 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 21:56:59 ] ほらループなしで処理が書けたよ!と頭よさげにアピールできる 問題領域そのものが再帰的なら可読性と保守性があがる C言語ではあまり利点がないので他の手段で頑張る 関数型言語とかだとまた別の話しになる
86 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 22:10:59 ] >>83 利便性っていうか、再帰的な処理は再帰で書いた方がわかりやすいな。
87 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 22:11:17 ] 関数に状態を持たせるのがどうじゃこうじゃ 逆に再帰で書いているのを繰り返し制御などで書き直す方が頭良さげ 最近再帰使ったのはビット単位でファイルに書き込む関数の下請け関数だわ
88 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 22:28:25 ] 本物のプログラマは自己書き換えプログラミング・コードを記述する。 そのことにより再帰アルゴリズムを使うのに比べて20ナノ秒も実行時間が改善される どうしても再帰なんつう場面は数年に一度 それ以外は、再帰アルゴリズムがぱっとわからないと馬鹿にされるという理由だけで使用する プログラマってそんなもん
89 名前:デフォルトの名無しさん [2010/03/07(日) 22:52:19 ] 再帰は、数学の階乗を求めるプログラムをかじった程度です。 可読・保守性があがるという利点は納得です。 逆にプログラマが再帰プログラムを創り出すほうが大変そう。 階乗求める以外に再帰を使ったほうがいいケースは思いつきにくいですね
90 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 22:53:10 ] >>89 3D オブジェクトを扱うときは必須だよ
91 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 22:54:05 ] 階乗こそ単純ループで十分で再帰にする必要なんてないんだが。
92 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:00:41 ] 無向グラフの経路探索とか再帰使わないと面倒でやってられんけど
93 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:01:26 ] >>89 ディレクトリをおりていく処理とか、ループで書くとめんどくさいだろ。
94 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:12:27 ] >>91 教材的な意味だろ
95 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:46:11 ] 教材としてあげるにしても、せめてユークリッドの互除法とか、フェボナチ数列(など漸化式)とかが出てこないものか
96 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:47:17 ] 再帰関数の教材ならハノイの塔の問題を解く奴が好き
97 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:56:03 ] 他人のコードで見つけるとループに書き換えられないかと難癖付けてみたくなる要素 自コードと同じスタックでライブラリ的利用させてもらう場合特に
98 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:55:01 ] 組み込み系だと、変数を取れるキャパが決まってたりして 「お、スタックが空いてる再帰でなんとかしろ」とかあるよ
99 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:18:44 ] >>89 再帰だとシンプルに書けるものはたくさんある。 もちろんスタックオーバーフローには注意が必要だけど、 プログラマの差ってのはこういうところから来るんだと思う。 例えば、テキストファイルの行を逆順に出力する(いわゆるtacコマンド) を作ろうとすると、再帰だとこんなにシンプル #include <stdio.h> void rev() { char buf[1000]; if(fgets(buf, 1000, stdin) != 0) { rev(); fputs(buf,stdout); } } main() { rev(); }
100 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:21:16 ] >>99 再帰関数で大きな自動変数の配列を使うのはナシだろ
101 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:25:22 ] なにこの制限だらけのtac
102 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 01:50:03 ] >99 これは再帰の悪い例としていつか使わせてもらう
103 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 02:14:39 ] >>再帰 文字列の中から、正規表現によって単語検索をする場合、正規表現の文字列の並びを、配列から、一旦、順序木の構造に変換してしまって、 木のノードを順番に辿りながら、文字列を検索していくと、一連の検索を、共通の操作であつかえて簡単だとおもいます。 たとえば括弧で囲まれて1まとめになった複数条件も、あるノードの子としてまとめて、”あるノードの子というひとまとまりの単位”であつかえるので、 たとえば単純な ”A" という条件も、複雑な ”[AかBかC]”みたいな括弧で囲まれた条件も、どちらも同一の「”このノード”を使って検索する」という操作で扱えます。 これが再帰を使って得られる簡単さという恩恵だと思います。 簡単に素直にするために再帰を使うんだと思います。 たとえば括弧に囲まれた複数文字も、囲まれてない単一文字も、どちらも同じように考えて検索できるのだから、 木がどんなに複雑な形をしてても、逆にどんなに単純な形だとしても、 どちらも同じ要領で「”このノード”を使って検索する」という共通の操作だけで最後まで処理できます。 この順序木を巡っていくという操作を、単一のループだけでやろうとすると、 「さまざまな形の木を想定」して、それぞれに専用の動作を書いたりするケースが出てきやすいと思います。 (たとえば "A"の場合と "[AかBかCか]"の場合とでの動作の違いを、「わざわざ専用に用意」しないといけいない。などのメンドクササ。 これがループだけでやる場合のメンドクササだと思います。) だけど、純粋に繰り返しの処理速度だけでみれば、やっぱり for ループみたいなモノの方が優れてるような気がします。よく知りませんが。 普通はループで十分事足りるので、たとえば「シンプルな int[1000] の配列全部に0を代入する」だけのことに、わざわざ再帰を使う必要は無いと思うし、 無理やり再帰なんか使ったら、逆に、わかりづらくなるだけだろうし、わかり辛いとミスも増えますし。 あたりまえですけど、「より簡単に、より素直に書ける方」を選んで使えばいいだけのことかとおもいます。どっちも便利だとおもいます。
104 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 04:41:46 ] Cの場合、非再帰で記述(スタックを自前で構築ってのは この場合反則になるんで)できる位の力量が無いのに 再帰(間接再帰を含む)を使いまくったコードを書くと 後で地獄を見る可能性も視野に...
105 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 05:08:48 ] >>104 よく分からん縛りだけど 人に強要するのは勘弁してね
106 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 05:11:09 ] ライブラリ、長く使うものに再帰はないな。 どこがスタック積まれるか判らないし、スタックオーバーフローもいつ起こるか特定できない。
107 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 07:41:46 ] >>99 逆順にならない。
108 名前:107 mailto:sage [2010/03/08(月) 18:48:09 ] 失礼、行を単位に逆になるという意味だったんですね。ちゃんとうごきました。
109 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:51:24 ] 1行毎に1000バイトずつスタックに積むとか使えない。 手元にあるテキストは、1行当たり数キロバイトとか逆に数十万行とか普通にあるんだが。 まぁ発想方法としては、悪くないんだけどね。
110 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:58:51 ] 一行読んで、それを連結リストで繋いでおく方がいいな。 それでもファイルサイズが大きすぎると面倒だけど。 tacコマンドは、ファイルの末尾にseekしてから表示しているな。 seekできないストリームに対しては、テンポラリファイルにコピーしてから。 まあちゃんと読んだわけではないから詳しくは知らないけど。
111 名前:デフォルトの名無しさん [2010/03/08(月) 20:21:44 ] Cと直接関係してる質問じゃないけど ソースを見れる形でファイルを上げれるcodepadのようなアップローダって他にある? なんか似たような感じで見やすいところがもう一つあった気がするんだけど
112 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:27:44 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ここ?
113 名前:デフォルトの名無しさん [2010/03/08(月) 20:32:06 ] いや、もっと企業がやってるようなオシャレな感じで掲示板では無かったんだけど。 codepadみたいにソースが表示されてdownloadボタンが付いてる感じで
114 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:20 ] gist.github.com/ ここ?
115 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:44:11 ] おおそれだ、探しても見つかんなかったんだありがとう。
116 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:44:29 ] 言われてから探して見つけてきたけど
117 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:52:01 ] アップローダとか無駄なキーワード入れてたのが駄目っだのかな・・
118 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:14 ] codepadの類似サービスだから一緒くたに紹介されてると思って、はてブでcodepadと検索したら出てきた
119 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 21:41:02 ] #include <stdio.h> void rev(void) { char *buf; if ((buf = malloc(sizeof(char) * 1000)) == NULL) { fputs("memory allocate error.", stderr); exit(1); } if (fgets(buf, 1000, stdin) != 0) { rev(); fputs(buf,stdout); } free(buf); } int main(void) { rev(); return 0; } これでいいですか?
120 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 21:55:53 ] malloc()で動的に確保しても、領域計算量が大きければ意味なし。
121 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:27:03 ] 最近も再起なんて使う?みたいなレスを見たなぁと思ったら図書スレでか まぁこの手の話題は定期的にあがるもんだけど
122 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:28:31 ] C言語って難しいんですか??
123 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:30:22 ] 難しいの定義による。
124 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:30:22 ] >>122 わかれば簡単だと思うよ
125 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:30:56 ] >>122 文法自体はかなり簡単な部類 ポインタで躓かなかったらな
126 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:32:03 ] 英語とかって、出来てたほうがいいですかね??
127 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:33:37 ] >>122 難しいともいえるしやさしいともいえる。 低機能の言語なので、文法自体はシンプルで覚えることは少ない。(やさしい?) 低機能の言語なので、なんかやろうとするとめちゃくちゃ手間がかかる。(難しい?)
128 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:39:03 ] >>126 出来た方がいいに決まってるが、 そんな質問するアホには必要ない。
129 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:39:54 ] >>126 読みやすいプログラムはそれ自体英文として読めるプログラムだから(俺流の解釈) 読みやすいプログラムを書くためには英語は必要。 英語のできない人が書いたプログラムは大変。 CにしてもJavaにしても英語圏の産物なんだな。
130 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:54:34 ] プログラミング言語は、アルファベット使うけど英語じゃなくて数学に近いな
131 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:24:31 ] >読みやすいプログラムはそれ自体英文として読めるプログラムだから こんなこというやつの変数や関数は長くてむかつく ReadDataFromUserFileToImageBuffer() みたいなやつ あるいはアンダーバーでつなげてみたりして 今時補完機能があるからへいきだろう、とか言い出してさ >読みやすいプログラムを書くためには英語は必要。英語のできない人が書いたプログラムは大変。 こういうこと言うやつは俺がnamaeみたいな変数とかyomikomi()みたいな関数作ると怒り出すよな いいじゃん、日本人なんだから日本語にしただけで読みずらくなったりしないよ と見ず知らずの129にすげえむかつく
132 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:26:24 ] 英語できないやつのプログラムは、 childs とか serch とか、ありえないスペルミスがあって、読みにくくてかなわん。
133 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:26:40 ] いや読みにくいから
134 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:26:53 ] >>131 日本語があやふやなお前が言っても説得力は無い
135 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:42:49 ] 俺が普段書くスクリプトなんて一文字変数、スペースけちって詰め詰めばっかりだよ
136 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:44:49 ] SQL?
137 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:41:32 ] >>131 ReadDataとToImageBufferが意味的にかぶってない? UserFileというのもちょっと。 ReadImageFromFileじゃだめかい? 英文として読めるように、というのはよくある指針だね。
138 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 03:58:43 ] RiyousyaFileKaraGazouBufferHeYomikomi() とか書かれたらキレそう
139 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 05:21:39 ] プログラムが正しく動作して、開発スタート時に決めた関数の命名規約 (※腐ったルールだとしても)を遵守しているなら、あまり気にしないレベル
140 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:16:23 ] >>137 そうそう、こういう人 上記のやうは例じゃん、適当に作ったさ それにたいしてまで、こんな事言ってくる そういう点がむかつくんだって事 ReadImageFromFileじゃだめじゃん 長々と英文を関数名にしてるやつが居るよねって例としては短すぎる ここは多少英語としておかしくても長くして置かないと駄目
141 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:17:31 ] JISYO のように複数のローマ字方式をミックスしたり、 JYOHO のような適当ローマ字で書かれているのを見るとためいきが出る。
142 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:32:31 ] readdata readdata2 readdata3 readdataEX readdataEX2 みたいにされるのもむかつく、混在してたりするとさらに
143 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:15:36 ] とりあえず読みにくいのはお断り 関数名は英語とローマ字のどちらかに統一されていれば気にしない 混在してるとイラッとくるが
144 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:17:50 ] >>140 シンプルだが単語のせいで長くなる場合は仕方ない i18nのようにごまかすのもいいけど、やりすぎはよくない 複数の意味を含めた名前になるのならそれは関数化が足りない
145 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 10:05:36 ] つかもともとCは単語を略す文化だよね intもcharもbufだってそう memcmpとかやっちゃうし 昔の本とかのソース見るとインデントもあって目を細めると螺旋模様のように見える 今のソースはBASICのようにブロック並べたみたい
146 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 10:09:31 ] スパゲティコードより読みにくいという説もあるいわゆるうねりコードですね
147 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 10:35:16 ] 文化じゃなくて制限。creatとか今思えばひどいもんだよね 端末に表示できる文字数の問題もあったし、環境に合わせてその辺は変化していってもいいと思うんだ
148 名前:デフォルトの名無しさん [2010/03/09(火) 11:45:10 ] Visual C++ 2008 Expressで1から勉強を始めたいのですが ソリュージョンのディレクトリの作成はオンにするのとオフにするのはどちらがよろしいのでしょうか? 参考に2つのサイトを見て勉強したいと思います 苦C 9cguide.appspot.com/p_vc2005.html 猫 homepage2.nifty.com/c_lang/net2005/project.htm 苦Cでは特にオフにしろとは書かれてなく、猫のほうはオフにしろと書かれてましてオンとオフどちらにしたらいいのか分かりません
149 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 11:58:44 ] すべてローマ字で書くことに決めたとしても、簡単なカタカナ語をどうするか悩む どうしてもrisutoと書かなきゃいけないのか、listにしちゃいけないのか そして無意識のうちにlistと書いちゃってコンパイルエラー
150 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:00:28 ] >>148 両方やってみて違和感が少なかったほうにすればいいよ
151 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:01:36 ] あ、気に入らなかったらフォルダごと捨てれば大丈夫だから、神経質にならずにためせばいいよって意味も含んでるよ 最初は確かにいろいろそわそわしたなぁと思い出したので追記
152 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:25:15 ] ありがとうございます オフにしてやってみます
153 名前:デフォルトの名無しさん [2010/03/09(火) 12:26:20 ] > 読みやすいプログラムはそれ自体英文として読めるプログラムだから COBOL 屋かてめーわ
154 名前:デフォルトの名無しさん [2010/03/09(火) 13:52:42 ] 他人のコードを改造しているんですが コードの量が大きいので一つの変数の型を変更するとそれに関連するものを変更する作業が大変です。 例えばint型だったものを制度をよくしたいのでdouble型に変えたとします。 それに関連する関数の戻り値や引数、代入される変数等、膨大な数になってしまいます。 なにか自動で型を変換する方法ってありませんか?
155 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:09:54 ] typedefしておけばいい
156 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:33:17 ] 理解力がなくてすみませんがtypedefでどう解決するのでしょうか?
157 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:42:44 ] 全部変えてしまうのは、まずいだろ 見ながら1こ1こかえるしかねーべ、そういうものとあきらめて
158 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:47:01 ] mozillaではパーザで構文木作ってそれを木の変換技法を使って自在に書き換えするっていうのを javascriptで作って、それをコードメンテに使ってるみたい dehydraとかいうやつだっけか
159 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:08:52 ] 検討の例えで整数変数を実数に入れ替えにしてるのは 釣りかい?
160 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:14:02 ] んだなぁ (x == y)みたいなのは、型を変えただけじゃだめだしなぁ 結局>>157 しかないな
161 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:21:18 ] たとえばビット演算を使っていたりしたらアルゴリズムから検討する必要が出てくるので 自動でやるのはとても不可能だろうなあ。
162 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:22:10 ] , -‐−-、 ヽ∧∧∧ // | . /////_ハ ヽ< 釣れた!> ハ レ//j け ,fjlリ / ∨∨V ヽ h. ゚l; ハイイト、"ヮノハ // |::: j 。 /⌒ヽヾ'リ、 // ヾ、≦ ' . { j`ー' ハ // ヽ∧∧∧∧∧∧∨/ k〜'l レヘ. ,r'ス < 初めてなのに > | ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!> . l \ `ー‐ゝ-〈/´ / ∨∨∨∨∨∨ヽ l `ー-、___ノ ハ ´ ̄` 〈/‐-、
163 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:32:51 ] すいません、苦Cの事を一通り覚えた後は何をしたらいいでしょうか?
164 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:35:48 ] >>163 アルゴリズムとデータ構造が少ない希ガス
165 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:41:12 ] コマンドラインで動作する素数判定プログラムprimeを作っているのですがうまくいきません。 コマンドラインオプションでの整数取得・切り分けがうまくいかないです。 助言お願いします。
166 名前:154 mailto:sage [2010/03/09(火) 16:59:15 ] 多くのレスありがとうございます。 全intをfloat(double)に変換するとか強引な方法をとってはダメでしょうか?
167 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:04:35 ] 駄目かもしれないしOKかもしれない なんでそんなことわかるの? でもきっとコンパイルエラーがわんさか出るだろうな sprintfとかの辺とかビット演算の辺とかまずそう switch文とかもまずそう サイズをsize_tじゃなくてintでやってるところとかあればまずそう 戻り値をintでエラーで分岐してたらまずそう
168 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:04:56 ] ダメだって書いてあんだろーが
169 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:19:45 ] #include <stdio.h> void hack(void){ printf("実行可能\n"); exit(0); } void func(void){ int iArray[2]; iArray[4] = (int)hack; } void main(void){ func(); } VC++のDebugで、 どうしてこれが実行できてしまうのでしょうか?
170 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:42:09 ] そういう風にできてるから
171 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:44:52 ] >>165 つ codepad 瞬殺でアドバイスが得られると思います。
172 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:15:01 ] 運がいいから
173 名前:165 mailto:sage [2010/03/09(火) 19:53:43 ] 素数判定ではなく素因数分解factorでした ttp://codepad.org/ESKYLo9R うまい具合に引数を整数にしたいです。 例えば、 factor 123451234512345 のときも動いてほしいです。 OSはwindows vistaでコンパイラはgcc、バージョンは gcc version 3.4.5 (mingw-vista special r3) です。 その時のint型(4bytes)の上限は +2,147,483,647 (10桁)です
174 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:23:07 ] >>173 gmp みたいな多倍長整数ライブラリを使う
175 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:40:07 ] 引数は整数になってると思うけど桁数を増やしたいって話? 20桁未満ならgccはlonglong使えるんじゃないか
176 名前:165 mailto:sage [2010/03/09(火) 21:15:02 ] >>174 試してみます。 >>175 桁数を増やすのと、 例えばint型を使っていて、 引数argv[1]がその上限を超えたときに エラーにしてくれるようなチェック方法を知りたいです。
177 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 21:45:35 ] >>176 コマンドラインオプションの解析は getopt(3)でいいんじゃない? 自分で判定するのは面倒でしょ。 パラメタを整数にするのも、strtol とかstrtoll あたりでいいかと。 上限超えたらどうなるかは、man 見れば載ってると思う
178 名前:デフォルトの名無しさん [2010/03/09(火) 23:12:10 ] ヘッダファイルで #define RED 1 #define BLUE 2 ..... #define YELLOW 100 と数百個定義しているのですが(全部定義しているわけではない) 結構順番を入れ替えます.そこでインクリメンタル的なものをつかえないかと思っているのですが, よい方法ございますでしょうか? よろしくお願いします.
179 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:14:01 ] enum
180 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 16:36:16 ] ヒープメモリとスタックメモリって読み書き速度に差はあるの?
181 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 16:37:55 ] >>180 スタックは頻繁にアクセスされるためCPUキャッシュに乗った状態の可能性が高い
182 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:09:32 ] スタックもヒープも物理的に差はない。 C言語がやりくりする一定値のメモリがスタック。OSに問い合わせしないので解放取得が速い。 ヒープはOSに問い合わせる。 スタックもプログラム開始時にOSに問い合わせて取得する。 OSはこの二つの違いは認識しない。使われていなければ、スタックでもページアウトする。
183 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:12:31 ] 100Mとか多めに確保したヒープにランダムアクセスしたら遅くなるが 確保できたとしてスタックでも同じ程度の速度。 はじめに一定値を確保してあるか無いかの違いだけ。
184 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:13:31 ] スタックはメモリプールという機能と同じってこと。
185 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:28:47 ] Windowsを初め、比較的新しいOSではスタックも追加確保 されるる時にOSに問い合わせます。
186 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:31:37 ] XPはスタックオーバーフローするが。 vistaからはそうなったか。
187 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:12:17 ] >>185 OSが許容するスタック上限値よりずっと低いスタック量で プロセスを起動しても、行儀の良いプログラムだったら 問題がないんでそうしてるわけですね。 少し「仕事をする」(再帰とか使ってたり、ローカル変数に 配列とか大量に確保する)プログラムだったら当然それでは 足りないからスタックオーバーフローする。そのタイミングで OSはスタックを追加してプロセスを停止させず続行するわけ です。
188 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:30:49 ] OS的には、変数は極力グローバル変数に確保し、再帰を使わない プログラムであることを望んでいるというわけですね
189 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:43:30 ] OSはスタック追加などしないぞ。OSから見たらカタックとヒープの違いはない。 MS-DOS Windwos3.1では区別はあったとおもうが。 Windwos3.1はスタックの固定領域を指定して使い切ったら駄目だった気がする。
190 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:00:26 ] MS-DOSにおいて、カーネルを含むプログラムの実行に確保できるメモリ空間(コンベンショナル・メモリ)は8086のアドレス空間の最大1MBである。 ほとんどのコンピュータでは、この空間にBIOS ROMやメモリマップドI/O、VRAMなどの空間も存在するため、 アクセス可能なメモリ空間は最大でも640KBから768KB程度であった。 ただし、バンクメモリやEMS、プロテクトメモリ(80286/386以降)等のコンベンショナルメモリ以外の領域・手段の利用が一般化していたため、 「貴重な」コンベンショナルメモリがこれらの領域によって圧迫されることはなかった。 日本語入力用のFEPなどの常駐型のデバイスドライバを使用すると一度に使用できるユーザーメモリはさらに減少するため、 ユーザーはEMSやXMS、HMAやUMBなどの拡張メモリの管理機能を利用して、 辞書や常駐部やMS-DOSシステムの一部をそれらへ配置し、コンベンショナルメモリの圧迫を少しでも避けることが重視されるようになった。 「とりあえず動く」という状態を作るだけであればエンドユーザーがこれらを直接操作する必要はほぼ無かったが、 「とりあえず」に飽き足らず無駄を省き最適な設定をするためには知見と試行錯誤が要求されるある種の職人芸的な資質が要求されたため、 これらの事情が「MS-DOSの環境設定は非人間的で困難なものであった」とする後世の評価を招く原因ともなった。 MS-DOS - Wikipedia
191 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:32:23 ] XPでもコンベンショナル・メモリのような設定あるんだがな。 デスクトップアプリケーションヒープ、非対話型サービスヒープの設定可能。 ここ変えないといくらメモリふやしても、メモリ不足改善しないことある。
192 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:22:20 ] Win3.1の場合、8086向けのコンパイラを若干改造した もので生成出来るコードでGUIアプリが作れるという のが基本設計 8086ではスタックの動的変更を行う一般的 方法のCPUアーキテクチャーレベルのサポートは 殆ど無いしコンパイラでもサポートしている例は 皆無。
193 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:26:14 ] おまえは勘違いしている。 スタックというのは、OSから見たら特別な領域でない。 スタックとヒープというのは、C言語(その他)から呼ばれているだけ。 どっちもOSに合わせたメモリ取得関数を呼び出して確保する。同じもの。
194 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:30:58 ] 昔のOSは区別してあった領域があるかもしれないが いまのメモリ確保はどれ使っても、OSレベルでは結局は一通りのメモリ確保しかないだろ。 レジスタとかGPUとかは別。
195 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:39:53 ] >>179 ありがとうございました. うまくいきました.
196 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 21:20:04 ] 暴れてる長文バカも 同じくらい環境依存なのに startupコードやセクションの話になるとサクッと黙るんだよな
197 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:15:37 ] >>193 WindowsはCPUレジスタそのものを管理しないって? んなことない。ないからこそ他のプロセッサ向けに移植 されていない。初期のWinNT(4.0まで)はプロセッサ が今のように分化してないから対応できたんだろうが さすがに無理になってしまって現在はIntel以外は非対応
198 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:19:13 ] レジスタやGPUメモリは専用命令で扱えるが スタックとヒープを区別して扱う命令はない。 OSではこれらの差はない。
199 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:19:18 ] おっとMovail (CE)とかは上位レイヤーや言語インターフェース の互換性があるだけでメモリアーキテクチャーはIntel版とは全然違ってると考えたいね。HD非搭載なマシンでも動作させる必要がある わけだから違って当然だけど
200 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 23:25:22 ] 入門スレであまり難しい話しないでよ
201 名前:デフォルトの名無しさん [2010/03/10(水) 23:33:17 ] >>197 alpha とかサポートやめた主な理由は商業的なことで 儲かるとなれば技術的な問題はどうとでもなったはず
202 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:06:16 ] >>198 何を根拠にそういうこと言い切っちゃうの? OSが無い環境もあるし、物理的にアクセス速度が違うメモリに振り分けられることもあるだろう。 結局は環境を絞らないと何も言えない。
203 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:11:18 ] Javaならどうだろうか?
204 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:36:13 ] Intelと一口に言っても、x86/x86-64とIA-64はまったく別物だしね。
205 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:55:40 ] CPUが特殊命令持っていて、スタック動作を速くすることが出来たとしても それが付いてないCPUでも、スタック、ヒープメモリは使えないといけない。 これより、C言語のスタックとヒープはソフトウェアとしての用語。
206 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:58:52 ] コンパイラの実装次第だがWindowsXP以降では、 スタックもヒープも同一のメモリ確保関数を使っているだろう。 すべてのコンパイラを知っているわけではないが。 CPUレジスタやCPUキャッシュのみをスタックに使う実装も出来ないことはないけど ないんでは。
207 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:24:29 ] 「スタック処理支援命令が付いていないプロセッサなどCPUと 呼んではいけない」 という意見には必ずしも賛成ではないが、付いていることを 前提とするかしないかでは、OSのカーネル開発の開発者の 集団力学には大きな影響が発生し、それがOS全体に 作業環境全体に与える影響力は計り知れず、スタック支援命令が ついたプロセッサ上のOSしか知らない俺にとっては とてもじゃないが反対だとも言えない。
208 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:07:46 ] ハードウェアのスタック機能と、C言語のスタックとヒープは 名前と動作は似ていても別物。 C言語のスタックメモリは複雑だろ。auto変数や関数呼び出しや再帰とか。 ハードウェアの機能に丸任せできないだろ。
209 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:14:51 ] >>181 で答え出てるのにまだ続けるのか
210 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:23:33 ] C言語に限らずプログラミングで頻繁に出現する データ構造の総称的名称としてのスタックやヒープと CPUが決定する「具体的な」ものとでは使われる コンテクストが全く違うだろうな(特に範疇性) 同じ用語を用いていてもコンテクストが全く異なる ので同じコンテクストで使われていると決めつける と何かと混乱の原因になりやすい鴨
211 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:48:24 ] 文字列が数値かどうか判定するのにisdigitを使うと マイナスや小数が誤判定されてしまいますが これらも正しく数値と判定させるためには自前で関数用意するしかないのでしょうか。
212 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:52:39 ] >>211 isdigitは数字かどうかを判定する(一般には)マクロ なんで、数値かどうかの判定を一発でするのは 無理 受け取った文字列をsscanf等で数値に直したものを 人の目を通して確認してもらうのが一番 0.9994242123123232132という文字列を数値 に直したのを表示させた時に 0.9994242123123456789 となった場合にそれが問題なのかどうかは状況に 依存。
213 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 05:41:48 ] >>211 atoiやatof等で不満なら自作するしかないね。
214 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:01:50 ] レスどうもです。 sscanfだと"1xyz"みたいに先頭だけ数字の文字列も数値として通ってしまうなぁ・・ と試行錯誤してたらatofで完璧でしたどうもありがとうございます。
215 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:10:06 ] とおもったらatofでもやはり先頭が数字だとだめでした;;
216 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:32:11 ] >>208 べつに、auto変数や再帰や関数の引数で特別なことはやっていないし C 言語のスタックメモリが複雑とも思えませんけれども。
217 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 07:00:12 ] >>215 じゃぁ、自作だね。 チェック関数だけ書いて後はatofに流すのが無難かなっと思うけど 用途や目的次第なのでお好きにどうぞ。
218 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 13:54:53 ] >>215 #include<stdio.h> double get_value(const char *str) { double value; int n; if(sscanf(str, "%lf%n", &value, &n)==1) { if(str[n]=='\0') return value; } return -1.0; } #define TEST(str) printf("[%s]=%f\n", str, get_value(str)) int main(void) { TEST("0.12345"); TEST(" 0.12345"); TEST("0.12345 "); TEST("1xyz"); return 0; }
219 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 15:01:30 ] 素直にstrto{l,ul,d,f,ld}を教えてやれよ
220 名前:デフォルトの名無しさん [2010/03/11(木) 18:54:28 ] スレチかもしれませんが detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1137870116 これ、答えて下さいませんか?
221 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:56:35 ] >>220 スライドショー フリーソフト でggrks
222 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 19:57:20 ] 断片化対策にこういうことってやっていいの? サイズ違うのにキャストしても大丈夫かな? void *my_allocate(size_t size) { return malloc(size / 4 * 4 + 4); } void my_deallocate(void *address) { free(address); } int main(void) { char *pc = (char *)my_allocate(sizeof char); *pc = 'c'; printf("%c", *pc); my_deallocate(pc); return 0; }
223 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 20:05:17 ] >>222 多いのは大丈夫 不足するのはダメ
224 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:59:52 ] >>222 4バイト単位で大きさ調整しても意味なさそう。
225 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:24:21 ] その式だと、最初から4の倍数だった時、必要なサイズより4バイト大きくなってしまう 普通はビット演算を使うと思う (size + 0x00000003) & 0xfffffffc
226 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:46:52 ] >225 それはsize_tが何バイトだと想定しているわけ いや、むしろ何ビットといった方が良いのかな
227 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:10:36 ] (size + 3) / 4 * 4 だな
228 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:54:07 ] >>226 それなら、0xfffffffcを~(size_t)3にでもすればいいと思う。
229 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:32:04 ] ~((size_t)3)かな
230 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:41:42 ] 昔は乗除算は必ずシフトに展開しろと教わったもんだが 今のCPUだとコストに差はないのかな (size + 3) >> 2 << 2
231 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:48:41 ] 演算子の強度低減ぐらいなら処理系がうまく最適化してくれるので 意図をそのまま表現するのが良いとされるようになってきたような
232 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 02:59:55 ] / 4 * 4 も >> 2 << 2 も & 0xfffffffc に最適化してくれるね
233 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 03:35:43 ] 素直に「4の倍数に切り上げ」ってコメントに書くわ どんなに簡単な処理でもコメントがあった方が読みやすいし とくに何年も前に書いたソースだと
234 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:01:25 ] >>233 まさかとは思うが、こんなコードは書かんでくれよ。 ++count; // カウントのインクリメント
235 名前:デフォルトの名無しさん [2010/03/12(金) 15:08:47 ] 教えてください。 システムソフト開発の会社に入ってそろそろ10年。 サポートや試験担当ということもあって、 まったく言語というものを知らずに来ました。 最近、なんかまずいかな? と思い始めて「猫C」を買って勉強しています。 でも、特に目的がないせいか、 この本やったあと次はなにを勉強すればいいかわかりません。 なにかおすすめの書籍があれば教えてください。
236 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:11:00 ] なにがまずいの?
237 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:11:31 ] 会社の言語やってるやつに聞け 実用で使われないやつやっても無用の長物 配置転換でリストラにならないように現場で使われる率高いやつ
238 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:13:50 ] C言語などいくらやっても徒労に終わる 基礎が出来ても完成品が出来るまでの道のりは険しい 自分でした独習など焼け石に水状態 会社でやってるのをピンポイントでやるべき
239 名前:デフォルトの名無しさん [2010/03/12(金) 15:17:38 ] ありがとうございます。 .NET(C#?)の問い合わせが多いので その言語のサンプルを読めるようになると サポートの幅は広がるよね。 とは言われました。 そうか、と思いつつ、 基本である(と思っている)C 言語の初歩本くらい やっといた方がいいのかな、 と思ってせこせこやっていました。
240 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:20:59 ] あとC#で何分野やってるのかも聞くといい。 GUIとかゲームとかネットワークとか。 その分野を重点してやる。
241 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 15:25:07 ] C#で開発ってXbox360かと思った。
242 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 17:16:54 ] >>239 土方を目指すのでなければCは必須
243 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 18:00:22 ] Cできたところで結局ドカタなんすけどね
244 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 18:37:40 ] switch(c->programming){ case YES: printf( "Cができるとは素晴らしいですね\n" ); default: c->status = "土方" break; }
245 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:05:31 ] 浮動小数を文字列に変換する方法について教えてください。 求める動作は次のとおりです: * double型を文字列に変換 * printf系などの外部関数で変換しない * 整数は整数として表示(小数点を付けない) * 小数点以下の不必要な0は付けない * 有効な精度(15桁程度?)で適当に丸める * 出力が長い場合も扱える(例えば、「12340000000000000000000」など) いろいろやってみたのですが思い通りのものが作れなかったので・・・ アイデア・ヒントいただければと 自分で作ってみたものも一応晒しておきます。 ↓だと、「456」のときに「459.9999...」となってしまいうまくいきません。 codepad.org/lEqBv5Qz
246 名前:245 mailto:sage [2010/03/12(金) 19:07:20 ] ↑の「459.9999...」は「455.9999...」の間違いでした。 申し訳ない。
247 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:44:29 ] 配列を関数に渡して、その値を取得したいんですが、上手くいきません どうすればいいでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:46:36 ] >>247 [50] を除けばいいかも
249 名前:デフォルトの名無しさん [2010/03/12(金) 19:58:47 ] すみません、取得したいというのは int test[10]; func( &test ); a = test[ n ]; というつもりでした
250 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:00:10 ] >>249 質問がよく判らんが、こういうことか? void func(int * test) { test[0] = 1; } void caller() { int test[10]; func(test); int a = test[0]; }
251 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:47:19 ] >>250 それだと関数の中で1を代入しても関数を呼ぶ側では変化しないと思うんですが 普通の変数をポインタで引数を渡して変更した値を取得するプログラムの配列バージョンみたいなのは可能でしょうか?
252 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:56:56 ] 変化しましたけど。。 codepad.org/OGLPv5dF
253 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 22:57:46 ] 勘違いしてました 解決しました ありがとうございます
254 名前:デフォルトの名無しさん [2010/03/12(金) 23:31:42 ] >>238 違うね 「基礎ができて」ない奴の道のりが険しいだけ 計算をしっぱなしな奴と、ちゃんと検算する習慣がある奴の違いは 小学校で受けた教育の質から来る
255 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:33:45 ] 基礎からやればいいじゃん 簡単なプログラム書くときでもホーア論理とか記述的意味論とか使って検証しながら書くとかさ
256 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:58:26 ] >>222 mallocがアライメント調整してるのに自前でもやる意味あるのかな?
257 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:04:47 ] 「何故かは分からんが出来たからいいや」 こういうタイプは一生伸びない。 応用できるのは何故そうなったか、つまりプロセスの部分であり、解は応用できないからである。
258 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:12:55 ] うるせーばか 既解決問題の証明を一生再生産してろ
259 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:19:19 ] こうしてHTMLは死んだ
260 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:23:10 ] >>256 malloc()がアライメント調整してない場合も、pragma指定かAPIで調整できる場合が多いね。
261 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 05:35:26 ] >>239 10年っていったらもう30前後なんだろ? 今更言語やっても身につかないし そんな奴は役に立たない
262 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:36:24 ] 確かに>>261 は役に立たない
263 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:47:32 ] >>261 お前使えねーな
264 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:52:07 ] >>261 ごめん。相当気持ち悪いな、お前
265 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:06:55 ] 261の人気にシット☆
266 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:16:18 ] shit?
267 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:04:47 ] 執刀
268 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:58:55 ] ファイルが存在すれば追記でオープン ってのを格好よく書くにはどうしたらいいかな あればエラー無ければ作成ってオプションならfopen()にあるけど 逆なんだよな〜access()使うの面倒くさいな〜
269 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:04:45 ] 質問です ネストって一般的に何重が限度ですか?
270 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:12:56 ] 何のネストだよ
271 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:14:30 ] >>268 "r+" でよくね?
272 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:17:32 ] >>270 if文のです
273 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:40:30 ] C言語の弱点はネストだな。短い文で使えばいいけど 間に沢山あるとわかりにくくなる for{}つかえときはcontinue;で括弧を引きずらないようにするといい 場合によってはgotoもいい 長い部分は関数化
274 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:51:43 ] >>269 ,272 > 5.2.4.1 Translation limits > The implementation shall be able to translate and execute at least one > program that contains at least one instance of every one of the > following limits: > - 127 nesting levels of blocks > - ...
275 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:52:04 ] >>272 みっつくらいじゃね?
276 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:55:31 ] >269 ISO/IEC 9899:1999 (E) 5.2.4.1 Translation limits 1 The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:13) 127 nesting levels of blocks 63 nesting levels of conditional inclusion 63 nesting levels of parenthesized declarators within a full declarator 63 nesting levels of parenthesized expressions within a full expression 13) Implementations should avoid imposing fixed translation limits whenever possible. number of characters as the corresponding universal character name, if any)14) 14) See ``future language directions'' (6.11.3). 15 nesting levels for #included files 1023 case labels for a switch statement (excluding those for any nested switch statements) 63 levels of nested structure or union definitions in a single struct-declaration-list ネスト以外の限界については省かせてもらった やっぱり63か >274 その一つ下じゃないか
277 名前:デフォルトの名無しさん [2010/03/13(土) 20:56:03 ] >>273 ネスト深くてもわかりやすい言語なんかねーよ 安易にgoto勧めんなよ 場合によって、の解釈でとんでもないことになるし goto排斥主義者の人が来ちゃったら揉めるだろ
278 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:58:54 ] だからgoto使わなければいいだけ
279 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:10:33 ] >>276 "conditional includion" は 6.10.1 にある #if とかの話。
280 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:13:57 ] >276 あっ、ほんとだ プリプロセッサの話だ
281 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:24 ] >>280 許してやる
282 名前:268 mailto:sage [2010/03/13(土) 21:21:26 ] >>271 あー、オープンしてから自分でシークすりゃいいだけか。 ありがとう。
283 名前:デフォルトの名無しさん [2010/03/13(土) 22:19:58 ] プログラム勉強始めたばかりの初心者です。例えば以下のようなif文があるとします。 カッコを入れるタイミングと位置がよく理解できていません。 なんで下記のように2回連続カッコが続いて記述されるのでしょうか? きっとそれぞれのカッコがどこで始まり終わっているのかが理解できていないと思います。 必ず対になるので偶数個になるのは理解できていますが・・・ おかしな日本語で大変申し訳ありませんが、どなたかわかりやすく解説をお願いできますでしょうか。 よろしくお願いします if (条件1) { if (条件2) { 文1; } else { 文2; } } ←これは何に対してのカッコ?なんで2回連続なんだろう??? else { 文3; }
284 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:25:09 ] >>283 2回連続しているけど、意味は別もの。 ネストしているカッコをそれぞれ別のカッコと考えれば分かると思うよ if(条件1)「 if(条件2)『 文1 』else『 文2 』 」 else
285 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:26:00 ] >>283 例にあげた if 文自体が間違っています。 わからなくて当然です。 なんの本にかいてあったんですか?どこのサイトですか?
286 名前:デフォルトの名無しさん [2010/03/13(土) 22:31:48 ] >>283 です 解説ありがとうございます。いまからじっくり読んで見ます。汗 サイトはこちらです。コピペした時におかしくなっただけかもしれません 汗 www9.plala.or.jp/sgwr-t/c/sec06-1.html
287 名前:デフォルトの名無しさん [2010/03/13(土) 22:51:51 ] >>284 さんありがとうございます。 初心者の私にはこのように見えます。 if(条件1)「 @ if(条件2)『 A 文1 A』else『 B 文2 B 』 」@ ←上記の番号がきっとそれぞれ対になっていると思っています。ただ、 条件1が満たされなかったら下のelse文に続くからこの閉めカッコは何?とも感じます。 きっと私は文の構成の初期的なところを理解していないと思われます 汗 else
288 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:56:51 ] 才能無い奴はやめてしまえ おまえがC言語をやらなくてもかわりはいくらでもいる ゴミなんだよお前は
289 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:58:46 ] むやみに煽りすぎだろ。
290 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:59:35 ] 最初のうちは↓のような書き方をした方が分かりやすいかも if (条件1) { if (条件2) { 文1; } else { 文2; } } else { 文3; }
291 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:00:31 ] 煽り?どこがだよ!お前もそうおもうだろ!正直に言えよ!
292 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:01:36 ] ifの中にifがはいってるってことはわかってる? 「ネスト」で調べてみましょう
293 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:12:57 ] >>291 ま、正直、あまりに根本的なところで、なんで?なんで?って聞かれるとイラっとはする。
294 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:13:35 ] >>288 視野が狭いな まさに土方の考え方だわ
295 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:15:27 ] >>294 はぁ?じゃあお前がちゃんと答えればいいじゃねえか!てめえがびしっとこたえねえからこんな事になってんだろ!クソが!
296 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:17:04 ] まず落ち着いて入門書を読むレベルだろコレ おまえらが半端に親切にするからチャット状態で何も考えずに質問しちゃうんだよ
297 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:18:52 ] 九九の表を覚えないのに掛け算するレベル。
298 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:21:26 ] この程度で才能なのかよ。 可哀想だなお前ら。。
299 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:25:00 ] この程度もできないのはまさに才能だろうな。
300 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:25:07 ] >>287 疑問の回答になってるかわからないけど、 if( 条件1 ){ 略 } ←このカッコ else { 略 } このカッコは、"else"があれば終わりが分かるんだから 不要じゃないか?っていう疑問なら、確かにその通り。 でもそれは"else"が来る場合限定の話で、else の来ない場合はそうじゃない。 C言語は、カッコでくくったブロックが基本単位になってるんだけど、 この辺りの感覚が分かってくると、閉じカッコが2重につくのも納得いくと思うよ
301 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:26:58 ] 変なところでひっかかる人はたまにいる んで、引っ掛かりが取れたらグンと伸びることも結構ある 283もそうなのかは分からんけどね
302 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:28:06 ] んじゃとりあえず期待。
303 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:28:08 ] >>287 条件1が満たさた場合、「 @から」@までが実行される。 どこからどこまでか範囲を指定してるから、どこまでを示す閉めカッコが必要。 範囲じゃない場合は省略できるが、最初のうちは必ず{}でくくっておいた方がいいと思う。
304 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:29:55 ] if (条件1) { if (条件2) { 文1; } else { 文2; } } else { 文3; } は if ( (条件1) && (条件2){ 文1;} else if( 条件1) { 文2; } else {文3;}と等価でよいでしょうか?
305 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:32:55 ] 実際に条件式書いてコンパイルしてみたら分かるでしょ。
306 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:33:00 ] if (条件1) { if (条件2) { 文1; } else { 文2; } } else { 文3; }
307 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:34:32 ] >>304 一般的には等価ではない。条件1を再度評価したとき同じ結果が 返るとは限らないから
308 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:35:21 ] >>304 条件1が評価時に変化しなければ等価
309 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:38:28 ] そんな条件の条件があるのなら等価じゃないだろ
310 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:40:24 ] そもそもコーディングの意図が明らかに違う
311 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:41:36 ] だから適当な変数を用意して int 条件1結果; 条件1結果=(条件1)?1:0; if ( (条件1) && 条件2 ){文1;} else if(条件2) {文2;} else {文3;} と書くのがもっとも無難じゃないかと...
312 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:41:39 ] 質問に答えてください
313 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:44:41 ] ここで聞くより入門書を買って読んだ方が手っ取り早い
314 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:47:31 ] ここは 「C言語なら俺に聞け(入門編)」 です 煽るだけの奴は去れ
315 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:48:00 ] >>312 お前が質問するのは自由だが、それに答えるかどうかもこっちの自由だ。
316 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:49:48 ] 煽るだけじゃなく、例えば荒らしもする奴は居てもいい。
317 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:50:22 ] >>314 スレタイにだまされるな。 初心者の質問をネタに雑談するスレだ。
318 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:50:52 ] >>1 >C言語の*入門者*向け解説スレッドです。 質問または答えない奴はここにいる資格は無い
319 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:51:47 ] じゃあ俺に聞けなんて自信満々にいわないでください スレタイをC言語なら入門書を読んだ上でたまになら俺に質問してもいいよ(入門編)に改名するべきです
320 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:01 ] 質問を議題とし、初心者同士がディスカッションするスレだよ
321 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:14 ] 自信満々に答えられないなら来なきゃいいのに。
322 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:20 ] >>317 それでいいんだよ 通ぶってても規格票と違っている事を固く信じ込んでいる事はよくある
323 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:53:54 ] >>319 「俺に聞け」なんて不遜な言い方、ジョークに決まってるだろ。
324 名前:285 mailto:sage [2010/03/13(土) 23:54:08 ] >>283 んー、私が間違っていましたね。 これであっています。失礼いたしました。 で、こういう書き方をすればわかりやすいかもしれませんが、いかがでしょうか。 if (a == 0) { if (b == 0) { x = 0; } else { y = 0; } } else { z = 0; }
325 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:54:37 ] マジに、ただひたすら初心者様に奴隷のように教えるだけのスレになったら回答者なんてだれもよりつかなくなるよな。
326 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:57:57 ] 低レベルな回答者はいらないです。
327 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:59:01 ] 逆ギレすんなよ
328 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:05:41 ] ヤフの質問箱とかOKWebとかなら、むやみに煽られないんじゃないのかね。 あそこらは「君たちは質問の意図を理解してませんね。 そういうことはいいから早く質問にこたえなさい」系の物言いも許されるイメージ。 あんまり見てないから知らんけど。
329 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:17:35 ] if文のネストで巧くいかなかったら 条件式を工夫してみろ 条件式をいじってうまくいかなったら if文のネストを工夫してみろ 両方駄目だったらあきらめろ 言えることはこれくらいかな
330 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:29:35 ] 聞くだけならいくらでも聞いてやる ただし答えるとは誰も言ってない
331 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:32:42 ] 答えないならせめてずっと黙ってろ
332 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:34:53 ] いや質問があるなら俺に聞けよ
333 名前:デフォルトの名無しさん [2010/03/14(日) 00:34:56 ] <object width="480" height="385"><param name="movie" value="www.youtube.com/v/n-PyrgNSGHA&hl=ja_JP&fs=1& "> </param><param name="allowFullScreen" value="true"></param> <param name="allowscriptaccess" value="always"></param> <embed src="www.youtube.com/v/n-PyrgNSGHA&hl=ja_JP&fs=1& " type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object> このプログラムを教えてください。私のレベルは、cを少しかじっただけです。
334 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:56 ] >>329 最初から理屈だけで覚えようとすると得てして失敗しやすいからな
335 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:15 ] >>333 Cをかじったなら、それはCじゃないってわかるだろ。
336 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:40:14 ] おCりかじり虫〜
337 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:08:45 ] 鉄分ミネラルビタミンCは
338 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:08:49 ] 保存済みのメモ帳に書いてある10個の数字からランダムに5個読み取りたいんですけど、 fopen、fscanf、for、ifのみを使ってそのようなプログラムを作ることって可能なのでしょうか?
339 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:11:26 ] 不可能
340 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:12:15 ] 手書きだったら、スキャナで読み取って画像認識しなければ ならないから、相当難しいだろうな。 しかも使える関数や構文にも強い制限があるみたいだし....
341 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:16:10 ] /dev/randomとかある環境ならいけるんじゃね?とか思うけど
342 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:16:21 ] 宿題はC/C++宿題スレへ。テンプレート持って。
343 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:17:06 ] ってnotepad.exeで作成したテキストファイルじゃなくてリアルメモ帳かよ!
344 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 11:40:26 ] 木綿生地以外は全部ナイロンに分類してしまう某民族みたいな話だな
345 名前:デフォルトの名無しさん [2010/03/14(日) 12:26:11 ] randとかの関数のアドレス調べておいて それでfopenを上書きすればいいんじゃね あるいはランダムな数字が入ってるテキストファイル用意しておくとか
346 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:27:13 ] 却下
347 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:00:38 ] >>338 できるよ
348 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:26:37 ] fopen、fscanf、for、ifだけじゃ無理だろ。 カッコや演算子もないとプログラムの書きようがない。
349 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:29:57 ] 糞スレ
350 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:30:27 ] 開くだけ開いて閉じないってのはなぁ
351 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:36:40 ] 必要な関数を全部挙げろよカス
352 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:37:04 ] >>348 なんか小学生みたいだな
353 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:05:35 ] hoge.hにint num;というグローバル変数を宣言?します 全然関係ない所から、#include "hoge.h"をしてhoge.hのint num;を使うと numのスコープはどうなるのですか?
354 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:10:57 ] 記憶クラス指定子にextern付けとけ どっかのコンパイル単位でint numで定義すればいい
355 名前:353 mailto:sage [2010/03/14(日) 15:36:26 ] >>354 ひとまず、グローバル変数にはexternをつければいいことは分かりました でも、いつグローバル変数が死ぬかわかりません
356 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:42:23 ] グローバルに限らず静的変数はmain()が始まってから終わるまで生きてる。 寿命をスコープと言わない。スコープってのは名前の有効範囲。
357 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 16:00:40 ] >>350 fopen()で開いたストリームは、プログラムが終了すると自動で閉じられるんで、 閉じるのは省略しても問題ないって場合もある。
358 名前:353 mailto:sage [2010/03/14(日) 16:06:29 ] すみません、まだexternとグローバル変数について分からないので教えてください staticのまとめ 1.#include "hoge.h"とした時に初期化(定義)される 2.staticは何度も#include "hoge.h"としても、1度しか初期化されない 3.プログラムのすべてが終わると自動的に、削除される 4.オブジェクト指向のpublic? externのまとめ 1.#include "hoge.h"とした時に初期化(定義)される 2.#include "hoge.h"とする度に初期化されてしまうので、多重定義になってしまう 3.プログラムのすべてが終わると自動的に、削除される
359 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 16:29:24 ] >>358 #includeと切り離して説明すると、 file1.cとfile2.cで、それぞれ、static int n = 1; とstatic int n = 2; と宣言されていたら、 この二つのnはそれぞれ別の変数になる。 それぞれ1と2で初期化される。 file1.cで宣言されたnはfile1.cの中からしかアクセスできない。よそからは見えない。 file2.cで宣言されたnはfile2.cの中からしかアクセスできない。よそからは見えない。 file1.cとfile2.cで、それぞれ、int n = 1; とextern int n; と宣言されていたら、 この二つのnは同じ変数になる。 1で初期化される。 file1.cとfile2.cでnを書き換えると、同じ変数だから、とうぜん、file1.cとfile2.cから みえるnは同じように書き換えられる。
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に入りそうだな
461 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:59:13 ] int 21Hで終わりでいいじゃん
462 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:06:12 ] char c[1234]; ってのは、使うときは putchar( c[3] ) みたいにして使います。 c[0] なら最初の文字、c[3]なら3番目の文字です。 &c[3] みたいに、頭に&マークをつけると、このデータがメモリのどこに書かれてるかがわかります。配列の先頭が、メモリのどこにあるかは &c[0] でわかります。 使うときにカッコを取って c って書くと、 &c[0] って書いたときと同じ数字がわかります。 この c そのものを c++ ってやって一個増やすと、 char型の配列なら、char一個分だけメモリをさしてる場所が増えます。 だから c++ とすると、つぎに使うときは c は &c[1] といういみになります。 int型の配列なら、int i[1234];
463 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:08:19 ] i++ で int の大きさ分だけ増えます。 や〜めた
464 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:14:26 ] >462 またまたご冗談を
465 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:19:03 ] >>462 そんなコンパイラなんて… あるかもしれないが規格無視じゃないか
466 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 00:27:03 ] >>462 その場合cは定数だからc++なんて出来ないだろアホ