1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 19 pc11.2ch.net/test/read.cgi/tech/1190342593/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
792 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:11:12 ] >>791 特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか) MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある 勉強ならパソコンでやればいい
793 名前:デフォルトの名無しさん [2007/11/03(土) 00:13:41 ] ああ
794 名前:プリンがー mailto:aaa [2007/11/03(土) 00:20:25 ] >>792 なるほど。 参考になった。
795 名前:プリンがー mailto:aaa [2007/11/03(土) 00:27:51 ] >>782 ループの前に整数を10で割るという変数を定義してて大丈夫でしょ!?
796 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:28:17 ] >>795 喪前みたいにこんなに物覚えが悪い馬鹿が実際にコンパイルしないで効率落としてたら迷惑だ。 とっととコンパイラをインストールしてこい。 コンパイラなしに勉強したいなら、もう少し他人の書き込みを注意深く読めるようになってからにしろ。
797 名前:デフォルトの名無しさん [2007/11/03(土) 02:40:36 ] 生まれた年を入力することによって今年何歳になるかを表示するようにしようとしたのですが、何が間違っているかわかりません。 #include<stdio.h> int tosi(int a,int b); return a - b; main() { int year; printf("あなたの生まれた年は?\n"); scanf("%d",&year); printf("あなたは今年%d歳\n",tosi(2007,year)); return 0; }
798 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 02:43:29 ] >>797 構文
799 名前:デフォルトの名無しさん [2007/11/03(土) 03:46:22 ] 配列の入力の時に,EOFだと-1入力で終了になりますよね? 改行で入力終了にしたいのですが,どうすればいいですか? 1 1 0 0 1 0 1 1 改行 で入力を終了したいです。 教えてください。よろしくお願いします。 //---- 配列入力 num = 0; do { scanf("%d", &arr[num]); } while ( arr[num++] != EOF ); // 改行は入力の終了 num--; // 有効な入力数
800 名前:デフォルトの名無しさん [2007/11/03(土) 04:28:06 ] 変数やポインタについて質問なんですが、 それらが自分自身のメモリサイズを知っているのは何故なんですか? 例えば、 int a[3]={1,2,3}; printf("%d",*(a+1)); とかって場合、*(a+1)の+1がint分オフセットするって記憶している場所ってどこなんでしょう??
801 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:30:23 ] 気にすんな
802 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:34:20 ] >>800 キニスルナ あえて言うならコンパイラさんの秘密の小部屋の中だ
803 名前:デフォルトの名無しさん mailto:age [2007/11/03(土) 04:45:16 ] デジタルフィギュア www.youtube.com/watch?v=9OHe2h3sZL0
804 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:05 ] >>800 そういう風に作られているからとしか言いようがない CPUが変わるとコンパイラ変えないとだめでしょ?
805 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:49:31 ] >>801-802 ぅぅ…気になる。。 けど我慢します。 ありがとうございました。 どっかのメモリ上にいるんだろうけど…。 それを参照出来ないのかな…。。 気になる…寝れない。
806 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:51:21 ] >>805 そんなに気になるならアセンブラ勉強しろ 大抵のコンパイラはソース吐かせられるようになっているから それを見れば一目瞭然なんだが
807 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:53:43 ] >>804 ,806 あ、なるほど。 レジスタにもメモリにもディスクにも記憶されてないんですね!? ただ単にオフセットしたりする順序が(機械語レベルで)書かれているんですかね。 なんとなく想像付きました。
808 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:57:45 ] >>800 intやcharのオフセットサイズが知りたいのならsizeof(int)でおk 但し、これらの結果は環境に依存するから注意が必要だ
809 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:01:20 ] >>807 CPUのアドレッシングモードを活用している場合もある 例えばx86のintならレジスタに+04hずつ足しながらレジスタ+レジスタで アドレスを算出している事が多い RISCの場合は完全にコード内に組み込まれてしまう場合が多いね
810 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:02:23 ] #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "ないよう", "たいとる", MB_OK); return 0; } XP2、VC++2005Express、cl.exeなんですが、たったこれだけのソースなのに以下のエラーが出てコンパイルできません。 なんでなんだぜ? test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。 test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
811 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:43:32 ] c言語で、田 (←は辺の数2x2の例) のような図形の辺上での経路探索プログラムを作っているのですが、 自分で作ったプログラムでは、再帰処理を用いたせいかやたら速度が遅く、 辺の数を増やすと数時間では終わらなくなってしまいます。 なるべく関数を再帰呼び出ししないように無駄な探索は再帰前にチェックさせたのですが、それでも遅いです。 再帰を非再帰にしたいのですが、自分の技量ではまったく記述が浮かびませんでした。 再帰の内容は、開始位置から上下左右の4つの方向にそれぞれ移動させ、さらに再帰でその処理を繰り返しながら 目的位置までの経路を探索する、というものです。 どうすれば、非再帰にできるか助言頂けないでしょうか?
812 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:08:11 ] そうすを出しなさい
813 名前:デフォルトの名無しさん [2007/11/03(土) 06:17:14 ] >>811 経路データをどう与えるんだ? あと一筆書きするって事?
814 名前:デフォルトの名無しさん [2007/11/03(土) 06:26:38 ] 1、2、・・・N 点に対して (1,2) (4,8)という風にデータを与えればいいか ただし(a,b)書いたときa<bとしaとbはつながっているとする 前回にすすんだ経路を記録しておいて、進んだときにその経路を消していけばいいのでは? 戻るときは前回のデータを復元していく たとえば、A=(a1,a2)などとして、ABCDEFGという繋がりが与えられれば、各段階でAからGの経路へ進めるということを繰り返す 初めに(進めるとして)Aへ進めたらBCDEFGが残る 次にAを進めようとするがここは残っていない BCD・・・とチェックしていく
815 名前:デフォルトの名無しさん [2007/11/03(土) 06:36:49 ] 繋がりの個数 N、 繋がり (a0,b0)・・・(a(N-1), b(N-1)) 探索の深さ d 現在の探索位置 k0,・・・k(N-1) 現在位置 x i = 0・・・N-1 xから繋がり(ai,bi)で移動できるか 出来るならkd = i、d++ とし繋がりを消す すべての繋がりがなくなれば成功でリターンする どの繋がりにも行けないならd--。kdのつながりを復元して上へ戻る もしd=0なら失敗でリターンする
816 名前:815 [2007/11/03(土) 06:44:37 ] 最大1000点の繋がりを処理できるプロクラム作ってやるぜ!
817 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 06:57:02 ] 最短距離となる経路を知りたいのか?経路の総数を知りたいのか?目的がわからん。 経路の総数なら数式で出したほうがラクだと思うが。
818 名前:815 [2007/11/03(土) 07:15:55 ] ねむくなりました とちゆうまで貼り付けておきます #include <iostream> #include <time.h> using namespace std; main(){ unsigned int A[32768]; int n,a,b,c; for(n=0;n<32768;n++)A[n]; for(n=0;n<20000;n++){ a=rand()%1024;b=rand()%1024; if(a!=b){c=a+1024*b; A[c/32] |= 1<<(c%32);}} int v[10000],d=0,x=0; for(n=0;n<10000;n++)v[n]=0; for(n=v[d];n<1024*1024;n++) if( (A[n/32]>>(n%32))&1 ){ a=n>>10 ; b=n%1024; if(x==a){x=b;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));} else if(x==b){x=a;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));} } }
819 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:07:29 ] >>810 user32.libをリンクしろ。 user32.libはPlatform SDKもしくはWindows SDKに入っている。 VC++ 2005への設定が容易な分、Windows SDKがおすすめ。
820 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 08:35:56 ] >>799 scanf()の戻り値を見て、0だったら終わればいい。
821 名前:デフォルトの名無しさん [2007/11/03(土) 10:52:55 ] >>798 具体的にどこをどう直せばいいですか?
822 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 10:58:41 ] >>821 #include<stdio.h> int tosi(int a,int b){ return a - b; } main() { int year; printf("あなたの生まれた年は?\n"); scanf("%d",&year); printf("あなたは今年%d歳\n",tosi(2007,year)); return 0; }
823 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 12:17:33 ] >>811 メモ化 再起をループに書き換えたところで改善されるパフォーマンスは微々たるもの
824 名前:815 出来たけどバグあるよ 直して使ってくれ [2007/11/03(土) 14:24:44 ] #include <iostream> #define TEN 3 using namespace std; main(){ int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1]; //経路生成 for(n=0;n<=N/32;n++)A[n]=0; for(n=0;n<100;n++){ a=rand()%TEN;b=rand()%TEN; if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}} //経路総数 int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++; int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;; for(n=0;n<keirosu+2;n++)y[n]=0; for(x=0;x<TEN;x++){ z[0]=x; while(1){ n=y[d]; if(n>=N){ if(d==0)return 0; d--;n=y[d];a=n%TEN; b=n/TEN; if(a==x)x=b;else x=a; A[c/32]|=1<<(c%32);s++; y[d]++;continue;} if( (A[n/32]>>(n%32))&1 ){ a=n%TEN; b=n/TEN; if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;} if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}} y[d]++;}} end:for(n=0;n<keirosu-s;n++)cout<<z[n]<<"→";}
825 名前:815 すこしなおした バグ取るか、参考として利用してくれ [2007/11/03(土) 15:04:39 ] #include <iostream> #define TEN 20 using namespace std; main(){ int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1]; //経路生成 for(n=0;n<=N/32;n++)A[n]=0; for(n=0;n<100;n++){ a=rand()%TEN;b=rand()%TEN; if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}} //経路総数 int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++; int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;; for(n=0;n<TEN;n++)z[n]=-1;for(n=0;n<keirosu+2;n++)y[n]=0; for(x=0;x<TEN;x++){ z[0]=x; while(1){ n=y[d]; if(n>=N){ if(d==0)break; z[d]=-1;d--;x=z[d]; A[n/32]|=1<<(n%32); s++;y[d]++;continue;} if( (A[n/32]>>(n%32))&1 ){ a=n%TEN; b=n/TEN; if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;} if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}} y[d]++;}} end:for(n=0;n<keirosu;n++)cout<<z[n]<<"→";}
826 名前:>>811 mailto:sage [2007/11/03(土) 15:17:37 ] もう少し悩んでみることにしました、ありがとうございました。 >>825 ソースまで公開して頂きありがとうございます。 じっくり読んで参考にします。
827 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:07:57 ] すみません。 struct
828 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:12:56 ] すみません。質問です。 struct AAA{ : : }; AAA* a = (AAA*)malloc(sizeof(AAA)*4); とコーディングしていたら客先の担当者からおこられました。 「一応サイズは保証されているけどそれはAAA a[4]ではない」、と。 C++では AAA* a = new AAA[4]で保証されていますの、といったら 「それはC++だからでしょ?」といわれました・・・・。 AAA* a = (AAA*)malloc(sizeof(AAA)*4);ってやっちゃいけないんですか?
829 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:19:04 ] a[4]と宣言できる状態なら、客先の反応が正しいかな。
830 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:24:50 ] >>828 べつに問題ないと思うけど。 固定長で、配列で済むところでmalloc()なんか使うなって意味かな? malloc()禁止だったら、可変長の配列はどうするんだろ。
831 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:31:19 ] >>828 それはそもそもCではエラーなわけだが。そのコードが通るなら、C++なのだからvectorかnewを使うべきだし。
832 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:32:26 ] 「AAA* a = new AAA[4]で保証されていますの」 口調に萌えた
833 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:33:57 ] C99
834 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:35:28 ] >>830 回答ありがとうございます。 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。 すみません。ついでに便乗質問なのですが (1) AAA aaa[30][30]; int x=...; int y=...; aaa[y][x]=...; (2) AAA aaa[30*30]; int x=...; int y=...; aaa[y*30+x]=...; で(2)の使い方をしていたらこれも理解しづらいということで怒られました。 2次元配列のほうが処理的にも良いのでしょうか。
835 名前:デフォルトの名無しさん [2007/11/03(土) 16:36:30 ] ここ見てると自分とのレベルの差が分かるんだが皆学生とかなのか? レベルの差ってのは自分よりすげーってことね
836 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:37:20 ] (1)でいい状況でわざわざ(2)を選ぶ神経がわからない。
837 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:38:02 ] そりゃ、特別な理由がないかぎりa[30][30]と書くべきだろう。
838 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:39:57 ] >>834 (2)が明確に処理的に優れてることを示せないのに(2)を選んだ理由は?
839 名前:デフォルトの名無しさん [2007/11/03(土) 16:40:15 ] 「構造体のmallocなんてありえない!」 callocを使えということかな?
840 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:40:49 ] >>834 いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います。 私のところではパフォーマンスを要求する場合は(2)の形式でかつ、オフセット計算関数を用意することが多く、 そうでない場合には(1)の形式を配列の配列ではなく配列へのポインタ配列の形で使うことが多くなります。
841 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:46:45 ] >>834 > 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。 その担当者は、プログラム知らなさすぎなんじゃね?
842 名前:834 mailto:sage [2007/11/03(土) 16:46:55 ] >>838 処理的には a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で 計算したほうがよいのかなと思いまして。 >>839 担当者いわく、構造体の領域確保はできない、ない、ということらしいです。
843 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:49:51 ] >>842 >841に同意。後学の為に、その担当者の所属企業をお教え願えませんか?w
844 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:51:15 ] >>840 コードの可読性は(1)のほうがいいだろ。 パフォーマンスの問題なら、(2)のほうが何パーセント処理時間が短くなるとか、具体的な数字を見せて説得すれば いいんじゃね?
845 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:51:51 ] >>842 >処理的には >a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で >計算したほうがよいのかなと思いまして。 だからなんで「よい」と思うのか教えてくれ。
846 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:52:00 ] >>842 >a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思い コンパイラの最適化をなめてはいけない。 2次元配列のほうが、より最適化される可能性が高い。
847 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 16:55:06 ] >>840 >いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います >>842 >計算したほうがよいのかなと思いまして 自分なら、思うだけじゃ、可読性を犠牲にする気にはならないな 実測して優位性を証明しる
848 名前:デフォルトの名無しさん [2007/11/03(土) 16:57:59 ] おまいらwwwここ見てみwwwwwww天才降臨wwwww 1 :以下、名無しにかわりましてVIPがお送りします。:2007/11/03(土) 14:02:12.45 ID:o3DHz8v00 id13.fm-p.jp/185/notkephir/ 裏絵バロスwwwwwwwwwwwww やあ、ここのBBSのパス解析できたら明日おにゃのことセックルできるお(^ω^ ) wwwww.2ch.net/test/read.cgi/news4vip/1194066132/698-698
849 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:06:48 ] int a[30][30]; int b[30*30]; int foo(int x, int y) { return a[y][x]; } int bar(int x, int y) { return b[y * 30 + x]; } gcc でコンパイルしたら、foo も bar も同じコードになった。 pushl %ebp movl %esp, %ebp movl 12(%ebp), %ecx movl 8(%ebp), %eax popl %ebp movl %ecx, %edx sall $4, %edx subl %ecx, %edx addl %edx, %edx addl %eax, %edx movl _a(,%edx,4), %eax ;または _b(,%edx,4), %eax ret
850 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:47:38 ] fseekについて教えてください。 fseekでファイルのヘッダ部分を飛ばしたいのですが fseek(fp,???,SEEK_SET); 4行飛ばしたい、というときは第2引数はどうすればいいのでしょうか? 4行をバイトにどう直すのかわからなくて
851 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:54:06 ] ワロタw
852 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:56:39 ] 1行を80バイトとしてCRとLFの2文字分を足して82バイト。 4行だから、82x4=328バイト分seekするというのはどうだろう?
853 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:01:55 ] >>852 ありがとうございます、やってみます >>851 やり方がおかしいのか、おかしいことを言っているのでしょうか? 普通はどうやるんですか?
854 名前:デフォルトの名無しさん [2007/11/03(土) 18:02:31 ] >>822 ありがとうございます。
855 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:11 ] >>853 1行が何バイトかは、その行を読み込んで改行まで数えないとわからないのが普通
856 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:10:58 ] >>853 オイオイw
857 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:20:44 ] でも、データをストリームとして扱うようになったのはUnix以降じゃなかったか? だからそれ以前の人ならそういう発想でも別に変でないかも。
858 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:51:46 ] 何とかできました。 >>855 普通はそうなのですか…結構アナログな感じなのですね ただ、すんません。疑問が増えました。 データをストリームとして扱う、の意味がわかりません
859 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:57:10 ] >> 850 現在位置を取得し、これをAとします。 getsを4回呼び出します。 現在位置を取得し、これをBとします。 fseekで現在位置をAの場所に戻します。 fseekB-Aバイト分現在位置を進めます。
860 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:58:30 ] >>858 「データをストリームとして扱う」というのは、普通にファイルを頭から順に読んでいくこと。 これに対して、「固定長のブロックとして扱う」やりかたがあって、 ひとつひとつのカタマリが同じ大きさの場合に、 fseekを使ってデータの開始位置にシークして、必要なデータのみを直接読み書きすることを言います。
861 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:24:43 ] >>859-860 ありがとうございました。 今まで何も理解せずにプログラムしてたのだと思い知りました。。。
862 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:41:45 ] KOUZOUTAI data[num]; と KOUZOUTAI *data data = (struct Point *)malloc( sizeof(struct Point) * num ); の違いって何なのでしょうか? どちらもnum分の構造体を確保していると思うのですが。 それとポインタの場合で二次元の構造体を確保する方法教えてください。
863 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:42:36 ] >>862 すません。 4行目はPointじゃなくて KOUZOUTAIです。
864 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:59:04 ] int data[10] と int *data = (int *)malloc(sizeof(int)*10) の違いと同じ。
865 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:00:33 ] 質問です。 ファイルの更新時刻を得るのってどうすればいいんでしょうか?
866 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:01:13 ] OS次第
867 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:07:28 ] 右クリック → プロパティ
868 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:17:23 ] >>866 標準ライブラリにそういう関数が入ってたりしないってことでしょうか
869 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:21 ] >>868 ファイルシステムに依存する情報なんで、標準には入ってない
870 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:23:32 ] >>864 んー その、構造体で宣言するのと、ポインタで宣言するのと利点があまりわからず あと2次元の構造体をポインタで確保する方法もお願いします
871 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:27:14 ] まず「二次元の構造体」を詳しく。 構造体の二次元配列をポインタで確保するのなら、普通の変数を二次元に確保するときと同様でいい。
872 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:28:40 ] スコープを跨ぐことができない・できるの違いぐらいじゃない? あと、後者の方が前者と比べると遅そうだけど、これは実装・環境に依存するのかな。
873 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:34:47 ] >>871 KOUZOUTAI data[10][10] のようなことです。 二次元配列をポインタで確保するやり方調べてきます。やったことなくて。 >>872 なるほど。 というと、グローバルでKOUZOUTAI data[10]とするのと同じような感じになるのでしょうか?
874 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:49:42 ] KOUZOUTAI (*data)[10]
875 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:25:23 ] struct e{ int value; }; int main(){ struct e **p,(*q)[5]; int i; //こんな方法とか p = (struct e**)malloc(10 * sizeof(struct e*)); for(i=0; i<9; ++i){ p[i] = (struct e*)malloc(5 * sizeof(struct e)); } //こんな方法がある q = (struct e(*)[5])malloc(5 * 10 * sizeof(struct e)); //こんな風に使う p[0][0] = 0; q[0][0] = 0; //忘れずに解放 for(i=0; i<9; ++i){ free(p[i]); } free(p); //qの方が解放は楽 free(q); return 0; }
876 名前:875 mailto:sage [2007/11/03(土) 23:26:22 ] 繰り返し部分間違えた for(i=0; i<9; ++i) ↓ for(i=0; i<10; ++i)
877 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:38:36 ] **ばっかりでわかりにくいなぁ。
878 名前:デフォルトの名無しさん [2007/11/03(土) 23:42:07 ] だいぶはしょりますが・・・ int i; char b; char a[] = "abcdefg"; scanf("%s",&b); while(b != a[i]) i++; ・・・略 みたいなbで打たせた文字をaの配列から探させるようなプログラムを書くとwhile文のところで、 「char型はchar*型に変換できない」 というエラーが出ます。どうすればbの文字ををaの配列から参照できますか? わかりにくくてごめんなさい
879 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:46:27 ] >>878 >534の下3行。
880 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:49:25 ] >>878 とりあえずそのようなエラーは出なかった
881 名前:デフォルトの名無しさん [2007/11/03(土) 23:50:30 ] >>879 ありがとうございます。%cにすればいいってことですか…?
882 名前:デフォルトの名無しさん [2007/11/03(土) 23:56:23 ] 878ですが、エラーはでなくなったのですがどうやらwhileで無限ループがおきている気がします。 上のプログラムだと、例えばscanfでdを打ったらiが3になった時点でwhile文から出るはずですよね?
883 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:57:23 ] iを0で初期化してる?
884 名前:デフォルトの名無しさん [2007/11/04(日) 00:01:00 ] >>883 しています。無限ループではなく他のどこかがおかしいのかもしれません。 もう一度しっかり見てみます。 ありがとうございました。
885 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:03:57 ] >>884 bにhを入れたらどこで止まると思う?
886 名前:デフォルトの名無しさん [2007/11/04(日) 00:06:17 ] >>885 そうなると無限ですか? でも実際はこの配列はa〜zで、cとかdとかを入れても次の動作にいきません。
887 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:04 ] whileに入る前にbに入ってる文字をprintfで確認したか?
888 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:12 ] 出来る限り、はしょらないで載せてくれ >>883 みたいな細々したことを指摘しないといけなくなるから
889 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:08:54 ] >>886 その実際のソースを書け
890 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:12:11 ] >>878 のソースで「char型はchar*型に変換できない」というエラーが出るというのが気になるんだが…… scanfの%指定ミスでこんなエラー出ないよな? せいぜい実行時エラーであって
891 名前:デフォルトの名無しさん [2007/11/04(日) 00:15:44 ] ごめんなさい #include<stdio.h> int main(void){ char a; char letter[] = "abcdefghijklmnopqrstuvwxyz"; int i = 0; printf("半角英小文字を1文字入力。:"); scanf("%s",&a); while(a != letter[i]) i++; printf("%s",letter[i]); return 0; } です。
892 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:18:27 ] scanf指摘されたところ直ってないじゃん