トップページ⇒tech
1001コメント306KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/03/27(金) 02:16:57
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題片付けます 124代目
http://pc12.2ch.net/test/read.cgi/tech/1235927586/
もしくは
 C/C++の宿題片付けます 125代目
(現時点でまだ立っていません)

・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 46
http://pc12.2ch.net/test/read.cgi/tech/1235918203/

過去スレ
http://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
01531362009/04/05(日) 12:52:42
いやマジで答えろよ
質問してんだろうが。
0154デフォルトの名無しさん2009/04/05(日) 12:54:08
>>153
だからそういうのは宿題スレでお願いしなさい
0155デフォルトの名無しさん2009/04/05(日) 12:54:18
>>153
暴言吐くなら鼬害。
0156デフォルトの名無しさん2009/04/05(日) 12:55:23
>>152
そうですね。
01571502009/04/05(日) 13:07:14
>>151
わかりました
ありがとうございます
0158デフォルトの名無しさん2009/04/05(日) 13:14:35
>>138
【1】以外全部0でおk
【1】は空

べ,べつにあんたの単位なんてどうでもいいんだからね・・・///
0159デフォルトの名無しさん2009/04/05(日) 16:49:24
stdboo.h

見苦しくしてまで一文字省略する意味がわからない
0160デフォルトの名無しさん2009/04/05(日) 17:04:24
ごめんただのtypo
0161デフォルトの名無しさん2009/04/05(日) 17:30:03
標準ブーイング
0162デフォルトの名無しさん2009/04/05(日) 17:54:59
スタンド・ブーイング
0163デフォルトの名無しさん2009/04/05(日) 20:02:18
ブーイングするためにだけ存在するのか。
0164デフォルトの名無しさん2009/04/06(月) 17:57:44
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9016.txt

1000×1000の行列ベクトル積の計算プログラムが課題として出たのですが、デバッグするとよくわからないエラーが出て困っています。

'行列ベクトル積.exe': 'C:\Documents and Settings\管理者\My Documents\Visual Studio 2005\Projects\行列ベクトル積\debug\行列ベクトル積.exe' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\msvcrt.dll' を読み込みました。シンボルが読み込まれていません。
行列ベクトル積.exe の 0x00411ab7 で初回の例外が発生しました: 0xC00000FD: Stack overflow
行列ベクトル積.exe の 0x00411ab7 でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow
プログラム '[10012] 行列ベクトル積.exe: ネイティブ' はコード 0 (0x0) で終了しました。

;が無いとかで怒られたことはありますけどこういう形のエラーは初めてです。
プログラムを組むのが1年ぶりくらいなので、もしかしたら基本的な見落としをしているのかもしれませんがさっぱり原因がわかりません。
どうかよろしくお願いします。
0165デフォルトの名無しさん2009/04/06(月) 18:00:18
>>164
原因は書いてあるそのまま。
Stack overflow
01661502009/04/06(月) 18:04:53
>>164
問題はこれ
int a[1000][1000];
int x[1000];
int b[1000] = {0};

前にもスタックにdoubleの配列を大量に確保しようとしてたやついたな
メモリの確保については教えてくれないのか?>ちぇんちぇえ
0167デフォルトの名無しさん2009/04/06(月) 18:07:03
うわw
なんか名前書き込んでもた
0168デフォルトの名無しさん2009/04/06(月) 18:34:19
int a[1000][1000]; はintが4バイトだから4x1000x1000で約4メガバイト
exeってなってるからVisualC++あたりと想定して、
デフォルトのスタックサイズは1MBだから、スタックオーバーフローですな。

スタックに置かないか、スタックサイズを大きくするかだな。
自動変数はスタックに置かれる。
0169デフォルトの名無しさん2009/04/06(月) 18:35:42
stack size を大きくするか
stack を使わないように static にしたり
動的確保でヒープ領域を使ったり
0170デフォルトの名無しさん2009/04/06(月) 18:36:01
static int a[1000][1000];
static int x[1000];
static int b[1000] = {0};

とりあえずはこれでOK?
0171デフォルトの名無しさん2009/04/06(月) 18:36:51
staticつけると0クリアしてくれるんだっけ?
static int b[1000];
これでいいか
0172デフォルトの名無しさん2009/04/06(月) 19:07:59
static と auto は使い分けだな

auto は関数内でしか使わない変数向き
関数内 static は関数内で静的に確保したいとき
グローバル static はプログラムが動いてる間確保したいとき

本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば
緊急避難的に関数内 static を使うのがいいんジャマイカ
0173デフォルトの名無しさん2009/04/06(月) 19:16:01
>>172
で、マルチスレッド対応時に あー ってなると
01741642009/04/06(月) 19:45:33
皆さんどうもありがとうございました。
>>170さんの通りにしたらきちんと動くようになりました。

ところで結果表示の時に701〜999、までしか表示されないのは単に表示行数の問題でしょうか。
0175デフォルトの名無しさん2009/04/06(月) 19:57:07
>>174
コンソールアプリだとウインドウが管理できる行数がデフォルトで
決まってるので最後の方の結果だけが残ってる可能性が

コンソールウインドウの設定を変えてログ行数増やすとかしないとだめかな?
0176デフォルトの名無しさん2009/04/06(月) 20:11:14
> 本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば

無駄??
0177デフォルトの名無しさん2009/04/06(月) 20:38:12
>>175
わかりました。ありがとうございます。
結果の表示はしなくてもいいのでとりあえず無くすことにします。
0178デフォルトの名無しさん2009/04/06(月) 20:47:42
MSCの頃はスタック最大で64KBしか取れなかったけどさw
0179デフォルトの名無しさん2009/04/06(月) 22:44:42
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9017.txt
身長の入力をするとループして先に進めないです
どこが間違っているのか指摘をお願いします
0180デフォルトの名無しさん2009/04/06(月) 22:46:43
>>179
1(one)でなくてl(ell)
0181デフォルトの名無しさん2009/04/06(月) 22:50:02
>>180
!!
ありがとうございます。目が疲れていたようですw
0182デフォルトの名無しさん2009/04/06(月) 22:59:33
scanfでdouble型を受け取るときは%lf
これ常識
0183デフォルトの名無しさん2009/04/07(火) 00:44:25
>>182
%le とかもあるがな
0184デフォルトの名無しさん2009/04/07(火) 10:24:37
>>178
デフォルトだと2KBだったよねえ
0185デフォルトの名無しさん2009/04/07(火) 12:26:03
手元にあるQuickC Ver.2.0の入門書で確認したらデフォルト2KBだった
スタックオーバーフローしたら無闇に増やすより
真っ先にスタックから静的変数領域に追い出したな
0186デフォルトの名無しさん2009/04/07(火) 13:39:02
for(;;){
printf(":");
if((command = getchar()) == 'a')
addlist();
else if(command == 'b')
delete();
else if(command == 'c')
showlist();
else if(command == 'q')
exit(0);
else
puts("Illegal command");

puts("");
};

上記はmain関数内の繰り返しで、結果が以下のように出力されます。

******************************************************** <---ここから
:a <---for(;;){}内のプロンプトが表示されaddlist()を実行した
>34 <---addlist()のプロンプトが表示され34を入力した

:Illegal command <---ここが原因のわからない表示

: <---addlist()実行後に復帰してfor(;;){}内のプロンプトが再び表示される
******************************************************** <---ここまで
実行環境:cygwin gcc versin 3.4.4

どうやら実行後に復帰したプロンプトが表示される前に、一回多く繰り返しを行っているようなのですが、
なぜ繰り返しが起こるのか、原因の見当がつきません。
このようなことが起こる原因がわかる方がいたらどうぞ教えてください。
0187デフォルトの名無しさん2009/04/07(火) 13:51:15
ttp://ja.wikipedia.org/wiki/Scanf
scanfの問題点と回避方法
改行文字の取り扱い
0188デフォルトの名無しさん2009/04/07(火) 15:05:36
>>187
ありがとうございます。
解決しました:-)
0189デフォルトの名無しさん2009/04/09(木) 01:35:45
俺の上司、コーディングとデバッグを分けているらしく、コーディング工程の間は一切プログラムの動作確認をしない。
プログラム全体を一気に書き換えた後に、デバッグ工程の俺にプログラムが送られてくるわけだが動作どころかコンパイルすら通らない。
このやり方では確実に見つけにくいバグが紛れ込むと思うんだがこういう手法って一般的なんだろうか。
0190デフォルトの名無しさん2009/04/09(木) 01:37:16
>>189
日本はそうやってゼネコンが作ったシステムのまねをして分業化する。
だからIT土方と言われる
0191デフォルトの名無しさん2009/04/09(木) 02:32:32
>>189
上司の名前を使って、バグだらけのコードをわざと書いて
デバッグ工程に回すのが吉

それで上司が文句を言ってきたら、「責任を人になすり付ける会社」
としてさっさとその会社に見切りをつけることが吉。
0192デフォルトの名無しさん2009/04/09(木) 02:43:42
>191は何をしたいのか判らんが、会社に見切りをつけると言う点では同意。
0193デフォルトの名無しさん2009/04/09(木) 03:01:17
>>189
たとえデバッグを他人に押し付けても
自分が一番作った気になれる部分じゃん
本人はそれで満足したいんだよ
0194デフォルトの名無しさん2009/04/09(木) 03:57:28
>>189
そもそもコンパイルが通っていないなら、コーディングが済んだとは言えんだろ。
0195デフォルトの名無しさん2009/04/09(木) 09:33:48
そもそも普通の会社なら、単体デバッグはコーダーの仕事だ。
0196デフォルトの名無しさん2009/04/09(木) 09:34:26
コーダーどころか入力だけならパンチャーレベル
0197デフォルトの名無しさん2009/04/09(木) 13:19:52
他所でやれ
0198デフォルトの名無しさん2009/04/09(木) 22:46:43
>>189
それで仕事になっているということは、
君がすごいんじゃないか?
普通に考えて、デバッグのがしんどいだろ。
他人のデバッグなんてホントに難しいってか…(ry
0199デフォルトの名無しさん2009/04/09(木) 23:00:01
やっぱりうちの会社って普通じゃないんだな…転職考えるか。
0200デフォルトの名無しさん2009/04/09(木) 23:23:49
是非弊社に。適職フェアでお待ちしてます。
0201デフォルトの名無しさん2009/04/10(金) 02:39:44
御社はプロのデバッガをお望みという事ですね
とても関心いたします
0202デフォルトの名無しさん2009/04/10(金) 03:08:25
他人が動作確認もしないで適当に書いたコードを修正できるなら、
最初からその人が書いたほうが早いんじゃねーか?
0203デフォルトの名無しさん2009/04/10(金) 03:13:56
>>202
そう思わない駄目上司がいるからIT業界は概ねブラックで
そういうシステムだからこそIT土方と言われるんだし・・・
02041982009/04/10(金) 07:02:09
>>202
俺のレスの
>他人のデバッグなんてホントに難しいってか…(ry
この
…(ry
の部分がまさに君の
>最初からその人が書いたほうが早いんじゃねーか?
だ。同意。
0205デフォルトの名無しさん2009/04/10(金) 09:15:37
つまり、そんな阿呆な上司のコードをデバッグできる>189は意外に使えるかもしれないってことか。
02061982009/04/10(金) 17:28:26
>>205
そうそう。
優秀なプログラマだ。
0207デフォルトの名無しさん2009/04/10(金) 20:27:13
プロジェクトとして考えたら、他人のプログラムをテストしデバッグすることはよくあること。
コードはプロジェクトの共有物なんだから
0208デフォルトの名無しさん2009/04/10(金) 21:26:48
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int sum;
int table[10]={1,2,3,4,5,6,7,8,9,10};
int i;
double ave;
i=0;
ave=0;
sum=0;
for(i=0;i<10;i++)
{
sum+=table[i];
}
ave=sum/10;

printf("%d",ave);


system("PAUSE");
return 0;
}
これをコンパイルして実行しても結果が0にしかなりません。
どこがおかしいのでしょうか?
教えてください
0209デフォルトの名無しさん2009/04/10(金) 21:28:48
%dだから?
書式を調べたほうが
0210デフォルトの名無しさん2009/04/10(金) 21:29:51
http://www9.plala.or.jp/sgwr-t/c/sec05.html
この辺なんか

0211デフォルトの名無しさん2009/04/10(金) 21:32:03
>>208
あと、aveをdoubleにしても、ave=sum/10.0; とかにしないと、少数が切り捨てられる。
0212デフォルトの名無しさん2009/04/10(金) 21:38:09
答えてくださった方ありがとうございましたpwq
無事に実行できました。わからなく、モヤモヤしてたので助かりました。
ホントにありがとでした><
0213デフォルトの名無しさん2009/04/10(金) 23:08:11
>>210
そこはなかなか読んでダメになるサイトですね。前にも他のページで指摘しているけど、今回はこれを見つけた。
>\' 文字としての ' 2C
asciiの0x2cはいつからシングルクォートになったんだかw
0214デフォルトの名無しさん2009/04/11(土) 03:33:18
>>207
こんな理解力の無い奴もプログラマやってんのかな
0215デフォルトの名無しさん2009/04/11(土) 11:34:47
>>207 = >>189の上司
0216デフォルトの名無しさん2009/04/11(土) 11:36:26
#include <stdio.h>

main(){
int a,b;
scanf("%d",&a);
scanf("%d",&b);

printf("%d + %d = %d",a,b,a+b);
return 0;
}
を実行したとき、数字以外を入力すると
1 + 256 = 257
となります。

数字以外が入力された際、エラーメッセージを表示して再入力を促すようにしたい場合
どうしたらよいでしょうか?
0217デフォルトの名無しさん2009/04/11(土) 11:41:43
#include <stdio.h>

main(){
int a,b;
do{
scanf("%d",&a);
scanf("%d",&b);
}while(a<'0'||'9'<a||b<'0'||'9'<b);
printf("%d + %d = %d",a,b,a+b);
return 0;
}
0218デフォルトの名無しさん2009/04/11(土) 12:00:50
if (scanf("%d", &a) != 1) {
printf("error\n");
continue;
}
0219デフォルトの名無しさん2009/04/11(土) 12:05:09
2chでタブってどうやって入力するの
0220デフォルトの名無しさん2009/04/11(土) 12:08:41
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0221デフォルトの名無しさん2009/04/11(土) 15:30:28
scanfで値を受け取って、その値を配列の要素数にしたいときはどうすればいいんでしょうか?
要素数には定数しか使えないと解説書にあったのですが・・・
0222デフォルトの名無しさん2009/04/11(土) 15:33:18
malloc
0223デフォルトの名無しさん2009/04/11(土) 15:40:34
std::vector
0224デフォルトの名無しさん2009/04/11(土) 15:43:59
>>223
スレ違い
0225デフォルトの名無しさん2009/04/11(土) 16:01:32
>要素数には定数
あれ?いまどきのCは変数で配列のサイズ確保できたんじゃね?
ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719
0226デフォルトの名無しさん2009/04/11(土) 16:05:15
>>225
C99なら
0227デフォルトの名無しさん2009/04/11(土) 16:06:27
>>225
それが使えない環境が広く普及してる
0228デフォルトの名無しさん2009/04/11(土) 16:11:21
>それが使えない環境
って何?古い環境で保守、ってこと?
0229デフォルトの名無しさん2009/04/11(土) 16:11:44
>>222
ぐぐり方が足りないようでした
DOOMすいませんでした
0230デフォルトの名無しさん2009/04/11(土) 16:21:59
>>228
VCが対応していないしな。
いまだに新規開発でもC90を使っているところが多いんじゃないかな。
0231デフォルトの名無しさん2009/04/11(土) 16:23:12
VC++2008は古くないと思うな
0232デフォルトの名無しさん2009/04/11(土) 16:29:35
というかC自体が・・・
0233デフォルトの名無しさん2009/04/11(土) 16:38:45
C++がCの拡張とは言え、C言語はまだ根強く残って使われる。
それだけ使いやすい言語だという事だよ、ワトソン君。
0234デフォルトの名無しさん2009/04/11(土) 16:51:01
C99はC++とも相性が悪い。
0235デフォルトの名無しさん2009/04/11(土) 20:22:42
>>218
それやったら無限ループだな。
0236デフォルトの名無しさん2009/04/11(土) 20:28:31
読み飛ばさないと駄目だな。

それと>>217もひどすぎるw
0237デフォルトの名無しさん2009/04/11(土) 20:36:27
scanf()は使うなってアドバイスするのが正解。
0238デフォルトの名無しさん2009/04/11(土) 20:38:45
>>216
Cは使うな
0239デフォルトの名無しさん2009/04/11(土) 20:44:01
初心者はCを使うべき
0240デフォルトの名無しさん2009/04/12(日) 15:14:43
scanfが完全にだめだと思う奴は素人。使い方次第。
0241デフォルトの名無しさん2009/04/12(日) 15:23:48
>>240
そりゃまあ使い方次第だが。。。
そんな言い方したらgoto文も同じだよね。
0242デフォルトの名無しさん2009/04/12(日) 15:27:39
全然違う
0243デフォルトの名無しさん2009/04/12(日) 15:29:13
>>242
どう違う?
0244デフォルトの名無しさん2009/04/12(日) 15:49:16
scanfは全く使うべきでないがgotoはそうではない。
02452412009/04/12(日) 15:52:08
>>244
ああ、つまり
君は>>240とは別人だったのか。
0246デフォルトの名無しさん2009/04/12(日) 15:55:29
scanf()で悩んでる初心者に、それは使わないほうがいいよって
アドバイスするときに添える理由。

・他の入力関数にくらべて挙動に癖があって初心者には使いにくい。
・がんばって挙動に精通しても実践の場で使うことはほとんどない。
0247デフォルトの名無しさん2009/04/12(日) 16:01:07
scanfが使い方次第だと思う奴は素人。完全にだめ。
0248デフォルトの名無しさん2009/04/12(日) 16:09:10
scanf()はパンチカード時代の遺物
キーボードとは相性が悪い
0249デフォルトの名無しさん2009/04/12(日) 16:12:57
でも入門書にはscanfしか載ってないけど・・・
0250デフォルトの名無しさん2009/04/12(日) 16:16:18
>>249
入力と数値の変換を同時にやるから、説明が簡単だっておもっちゃうのかね。
教わる側からすると、エラーリカバリとかやろうとするととたんに難しくなるな。
0251デフォルトの名無しさん2009/04/12(日) 16:19:58
>>247
素人乙。お前みたいな固定概念しかない奴は応用力がない。
一生あれもこれも欠点を持ち出して駄目だといい続けてな。
現に、お前が使っている言語もOSさえも、完璧なものはない。
0252デフォルトの名無しさん2009/04/12(日) 16:21:21
そもそも、どういった場面でscanfは駄目か?について
まったく説明ができないくせに、駄目だとされるものがあれば
もうそれは駄目。自動車で悲惨な事故が起こる、航空機は墜落したら
大惨事、人間は生きているだけで老化してやがて死ぬから駄目
といっているようなもの。進歩のない奴はいつまでも発展しないまま
情報弱者のくせして知ったかぶりでこの世を去るんだろう。
■ このスレッドは過去ログ倉庫に格納されています