C言語なら俺に聞け(入門篇) Part 3

このエントリーをはてなブックマークに追加
952923:2006/11/08(水) 22:31:39
>949 なるほど、このほうがいいですね・・
ありがとうございました。
953デフォルトの名無しさん:2006/11/08(水) 22:38:00
>>950
printfとscanf合わせて入力用関数とか作ったりしない?
954デフォルトの名無しさん:2006/11/08(水) 22:38:09
system("format c:");
955デフォルトの名無しさん:2006/11/08(水) 22:40:02
int及び2次元配列a[0][0]みたいなものは
それぞれいくらのメモリ領域を確保するのでしょうか?
sizeof関数で見れたような気がするのですが
現在C言語が動く環境にないのでお願いしたいと思いますorz
956デフォルトの名無しさん:2006/11/08(水) 22:41:13
>>952
このfuncって足すだけなら演算子でよいと思うけど
関数にしろっていうお題なの?
957デフォルトの名無しさん:2006/11/08(水) 22:41:44
>>955
環境による!
958デフォルトの名無しさん:2006/11/08(水) 22:49:20
>>956
だと思われ

>>955
俺の環境ではintが4バイト
配列のアドレスは
a[0][0] a[0][1] a[0][2] … a[0][n] a[1][0] a[1][1] … a[1][n] a[2][0] …
という感じで、型の大きさ分ずつ番地が増えていく
959955:2006/11/08(水) 22:49:39
>>957
ご回答ありがとうございます。
ちなみに問題は配列データの計算時のキャッシュ-メモリ間の
ページフォルト回数を求めるようなもので、ハードウェアに関するものです。
「ブロックサイズは4語。intの大きさを1語とする」という一文だけあったのですが、
それではつまり具体的なサイズはともかくintの何倍かということは言えるのでしょうか?
960デフォルトの名無しさん:2006/11/08(水) 22:58:54
>>959
問題文に明記がないならそうとらえていいと思うぞ
961960:2006/11/08(水) 23:05:03
>>959
>ブロックサイズは4語。intの大きさを1語とする
というか1ブロック4語
int 4つ分と明記されてるではないか
(intの4倍のサイズで1ブロック)
962955:2006/11/08(水) 23:14:02
>>958
番地が増えていくというのは連続的な位置に確保されるという意味ではなく
a[0][0]のサイズよりa[n][m]のサイズの方が大きくなるということでしょうか。
ほんとに環境によりますねorz

>>960
そういう意味だったのでしょうかorz
ブロックは1度に扱う量であり配列のサイズはまた別かと思ってました。

ちなみに全文です。
http://purelove.chu.jp/imgboard/img-box/img20061108231246.jpg
963960:2006/11/08(水) 23:25:11
>>962
>ブロックは1度に扱う量であり
そういう意味だよ
つまり一度に扱う量が1ブロック(int 4つ分)ってこと
でメモリ領域は int a[n][n] なら n×n ×sizeof(int) の連続領域が割り当てられる
964デフォルトの名無しさん:2006/11/08(水) 23:26:39
>>962
たぶん連続(4バイトならデータは連続だがアドレスは4刻み)
a[0][0]もa[n][m]も型が同じならサイズも同じ

つか、問題文イミフwwwwこんなんわかんねwwwww
965960:2006/11/08(水) 23:32:24
>>962
たぶん>>958が言いたいのは

a[0][0] a[0][1] a[0][2] … a[0][n] a[1][0] a[1][1] … a[1][n] a[2][0] …

連続した領域がこの順で割り当てられてるということ

先頭番地が a[0][0] (アドレス a + 4(intサイズ分)×0 ) ここで 次が a[0][1](アドレス a + 4×1 )、 a[0][2](アドレス a + 4×2 )、・・・・・ と続く
966デフォルトの名無しさん:2006/11/08(水) 23:35:46
すいません。わからないので教えてください。
文字列に "(” と ")" は\のエスケープ文字は必要ないですよね。
以下の例は、正しいでしょうか。
例:
char strings[] ="123(456)789";
967デフォルトの名無しさん:2006/11/08(水) 23:37:10
さすがに試せってw
968960:2006/11/08(水) 23:41:20
>>966
正しいが試そうぜ
万が一って事もあるじゃんか
969955:2006/11/08(水) 23:42:12
>>963-965
なんかよく分かりました。そういやa[][]も今回はintですよねorz
というか適当に、intと同じサイズにしたれやと思って既に進めていたのでこれで安心しました。
ありがとうございました。
970デフォルトの名無しさん:2006/11/08(水) 23:54:20
>>967
>>968
試したら、問題なく動作しています。どこかに書き物があれば教えていただきたかったです。
971デフォルトの名無しさん:2006/11/08(水) 23:55:26
質問させていただきます。
今番号と名前を作成して、3件分データを入力したあとにデータ表示をするプログラムを作成しています。
その際、すでに入力された番号が入力された場合エラーとして再入力をさせたいのですが上手くいきません。
どなたか教えてくださいm(_ _)m
972923:2006/11/08(水) 23:56:33
>956
はい、funcという関数を作るという指定です。
973デフォルトの名無しさん:2006/11/08(水) 23:56:53
聞く前に試せ。これ常識
オナる前に女児ぱんつ履く。これ異常
974960:2006/11/08(水) 23:57:11
>>970
書き物って何のこと?

>>971
>作成しています
で、自分の作ったヤツは?
なぜアップしない?
975デフォルトの名無しさん:2006/11/09(木) 00:00:00
>>971
ソース晒せ
とりあえず、番号が特殊な書式ではない、ただの整数なら配列(-1とかで初期化)にでもいれて全部比較でもしろ
976デフォルトの名無しさん:2006/11/09(木) 00:05:21
>>974
ドキュメントのことです。
977デフォルトの名無しさん:2006/11/09(木) 00:06:31
>>971
具体的に分からないのはどこ?アルゴリズムから?
どれぐらい形になってるの?
978デフォルトの名無しさん:2006/11/09(木) 00:08:14
>>974
ソースを晒したいのですがPCが壊れてしまって携帯からの書き込みなんですm(_ _)m

明日学校で作成するので、番号の重複エラーの処理のヒントを教えていただけないでしょうか。
979960:2006/11/09(木) 00:10:12
>>976
申し訳ないがそんな初歩のところから説明してるサイトは知らない
本屋さんへゴー!
980デフォルトの名無しさん:2006/11/09(木) 00:12:22
こんばんは 

char *str;
int i=100;

sprintf(str,"%d",i);

で実行したところstrには100という文字列が格納されました。
しかし、上記のstrはstr[100]などと
明示的に領域を確保したほうがよいのでしょうか?



981デフォルトの名無しさん:2006/11/09(木) 00:12:58
>>78
入力する番号の書式による
982デフォルトの名無しさん:2006/11/09(木) 00:16:40
>>980
確保するべき
983デフォルトの名無しさん:2006/11/09(木) 00:17:02
>>977
一応番号が重複するエラー以外は完成しています。
同じ番号を入力した場合エラーを出す処理のイメージがなかなかわかなくて…
984デフォルトの名無しさん:2006/11/09(木) 00:17:45
>>980
確保しないとメモリのどっかに上書きされると思うけど・・・
それが大事なデータだったり実行中のプログラムだったりしないことを祈る。
985980:2006/11/09(木) 00:17:59
>>982
ありがとうございます。
できれば理由も教えていただけませんでしょうか?
986デフォルトの名無しさん:2006/11/09(木) 00:27:58
>>981
返答ありがとうございます。
PCを直してから出直してきますm(_ _)m
987デフォルトの名無しさん:2006/11/09(木) 00:30:19
>>985
char *str;
int i=100;
sprintf(str,"%d",i);
printf("%d",i);

をやって味噌。
988987:2006/11/09(木) 00:31:21
違うわ。間違えた。
989デフォルトの名無しさん:2006/11/09(木) 00:31:59
次スレ立てた

C言語なら俺に聞け(入門篇) Part 4
http://pc8.2ch.net/test/read.cgi/tech/1162999861/
990デフォルトの名無しさん:2006/11/09(木) 00:34:05
>>985
>>984の言う通り
あと、ちょうどこんなレスも見つけた
http://pc8.2ch.net/test/read.cgi/tech/1162771475/213
上では単に他のバッファが上書きされているだけだけど、
もし、その場所に重要なデータがあったり、関数の戻り先とか実行するコードがあると、
それはもう大変な事に
いわゆる鼻から悪魔

>>983
番号と名前をペアにした構造体に入れて、
0で初期化した配列に先頭から順に格納
番号が入力されたら配列を先頭から順にチェック
ぬるぽを見つけたらそこに構造体を格納
991980:2006/11/09(木) 00:42:39
>>984
>>990
なるほど〜
うまくいったのはたまたまだったんですね。あぶないあぶない

聞いてよかったです。ありがとうございました〜
992デフォルトの名無しさん:2006/11/09(木) 00:44:59
よく構造体とか文字配列を宣言したときに
memsetとかでヌル初期化してるけどあれってやったほうがいいんですか?
993955:2006/11/09(木) 00:51:13
>>983
こんなんでどうだろ?
超ド素人が15分かけて作ったので動作の安全は保証しないw

int i = 0;
int j = 1;

do{scanf("%d",x);               //番号を入力
  for(;i <10;i++){              //とりあえず10件の適合まで対応
    if(nyuuryoku[i].number == x){      //番号は構造体に入ってると勝手に決めたw
      printf("既に番号がある\n");
      break;}               //合致してしまったらやり直し
    else if(i == 9)
         j = 0;             //最後まで合致しなかったらwhile文からの脱出キーj=0をプレゼント
  }
}while(j);
994デフォルトの名無しさん:2006/11/09(木) 00:55:30
memsetは使ってないけどオレはやるようにしてる
特に意味不明なほどメンバが多い構造体とかバッファとか
それでも人によると思う

ところで、
HOGE hoge = {0};
みたいな初期化ってCでも使えたっけ?
使えるならこっちの方がいいと思うが
995960:2006/11/09(木) 00:55:49
>>992
好き好きで
「予期しない値」が困る場合に使えばいい
たとえばWinAPIのリターン用に構造体を渡すときなどは 0 で初期化する必要があったりする
996デフォルトの名無しさん:2006/11/09(木) 00:56:33
>>992
用途による

初期化されてないのがポインタだと
別のところで使うときに
NULLとの比較ではじけないので
不正なデータにアクセスしそう
997デフォルトの名無しさん:2006/11/09(木) 00:57:27
>>992
気持ちの問題。憂鬱なときは避ける。
デバッガで変数見るときに見栄えがいい。

冗談はさておいても、
メモリコピーでヌル文字を最後に付け加えておく記述をし忘れたときなんかのバグ抑止になる。
998960:2006/11/09(木) 00:58:37
>>993
>scanf("%d",x);
&x
999デフォルトの名無しさん:2006/11/09(木) 00:59:13
最後の最後まで&抜けとは
1000デフォルトの名無しさん:2006/11/09(木) 00:59:42
1000なら再びC言語ブーム
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。