以下のプログラムをコンパイル・実行しようとすると、コンパイルはエラーなくできますが、実行すると「プログラムは動作を停止しました」という表示が出て、エラーになってしまいます。
たぶんatoi()が原因だと思うのですが、何が問題なのでしょうか?
それとも環境の問題でしょうか?
どなたかご存知の方がいらしたら教えてもらえないでしょうか。
<環境>
VISTA、VC++
//------ここから----------
#include <stdio.h>
#include <stdlib.h>
#define AAA atoi(argv[1])
#define BBB atoi(argv[2])
#define CCC atoi(argv[3])
#define DDD atoi(argv[4])
#define EEE atoi(argv[5])
#define FFF atoi(argv[6])
#define GGG atoi(argv[7])
int main(int argc, char **argv)
{
FILE *fo;
int i, j, k, l, m, v, cnt1;
int v_tmp = CCC;
int x_cnt;
int y_cnt = 0;
int cnt = 0;
int arr[8190];
if(argc != 9){
printf("引数の数が違います。\n");
printf("使用法:<プログラム名><AAA><BBB><CCC>\n");
printf("<DDD><EEE><FFF><GGG><出力ファイル名>");
exit(1);
}
if((fo = fopen(argv[8], "w"))==NULL){
printf("can not open file\n");
exit(1);
}
v = v_tmp;
for(l=0; l<AAA; l++){
arr[l] = v;
cnt++;
if(cnt == FFF){
v += DDD;
cnt = 0;
}
}
for(i=0; i<BBB; i++){
m = 1;
cnt1 = 0;
x_cnt = 0;
while(x_cnt < AAA){
fprintf(fo, "%04x", arr[m]);
x_cnt++;
if(!(x_cnt%2))
fprintf(fo, "\n");
cnt1++;
if(cnt1%2){
}else{
m += 3;
}
m -= 1;
}
y_cnt++;
if(y_cnt == GGG){
v_tmp += EEE;
y_cnt = 0;
v = v_tmp;
cnt = 0;
for(l=0; l<AAA; l++){
arr[l] = v;
cnt++;
if(cnt == FFF){
v += DDD;
cnt = 0;
}
}
}
}
fclose(fo);
return 0;
}
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
>たぶんatoi()が原因だと思うのですが
「たぶん」じゃくて、どこまで実行できているのかをまず確認しましょう。
デバッグモードでトレースしてもいいですし、適当なprintfを随所にちりばめるだけでかなりのことがわかりますよ。
デバッグの基本は、エラーの発生個所を絞り込むことからです。
No.6
- 回答日時:
とりあえず、#defineで定義しているatoi()を全てmain()内に展開しましょう。
で、少しずつ動かすのが大事です。
とりあえず、コーディングしたとしても、部分部分をコメントアウトし、どこまで
動作したかぐらいは確認しましょう。
# 因みに printf()等でデバッグ情報出力しようとしても、書込バッファが一杯にならないと
# 出力されないです。
# こまめに調査していくしかないですね。
取り急ぎ、#defineで定義するのは 記号定数(及びそれに対して置き換える定数)・マクロ関数
というのが仕様です。
今回は定数ではなく関数(しかも変数付)を定義しているのがもしかしたら影響しているかもしれないです。
そうだとしたら最初に記述したように #defineで定義しているatoi()をmain()内に
直接記述すれば動作するかと思いますし、それでも動作しないのであれば
ポインタ関連を使用しているのは argv[]ぐらいですので、そこに値が
思った通りに入っていないが疑わしいです。
#この場合は「v_tmp = CCC;」を引数チェックの後に実行すべきですね。
#Cの作法上からしても引数チェック前にこういったポインタの使用は
#さけるべきです。
No.4
- 回答日時:
>#define AAA atoi(argv[1])
・・・
>#define GGG atoi(argv[7])
こういう発想が不可思議です。
どうしてこうしたことが必要と思われたのでしょう?
何かに記載されていたのでしょうか?
No.3
- 回答日時:
まず、プログラム実行開始時に引数の数が3個未満だった場合の不具合について
>> int v_tmp = CCC;
CCCは(atoi(argv[3]))ですが、引数が3個未満だった場合、argc[3]は不定アドレスのポインタです。
そんな箇所を参照すればエラーが起こって当たり前です。
VCのデバッグモードで実行すれば一発で指定した行で止まります。
後世の為に、何でこの不具合が分からなかったのかお教えお願い出来ないでしょうか?
また、defineもこんな使い方はしません。
No.2
- 回答日時:
回答ではないことを先に言っておきます。
自分ならatoiが問題と思った時点でAAAやBBBの値を確認しますね。
問題なければdebugモードで実行してどこまで処理が進むかを確認します。
あとdefineなんて使わずにargcの値を確認したら真っ先にint変数にでもargvの値を代入したほうがいいでしょう。
そうでないとAAAやBBBと記載されている回数だけatoi関数が呼ばれるので処理の無駄です。
参考になれば幸いです。
No.1
- 回答日時:
実行時にどういう引数を与えたときに
そのエラーが出るのですか?
本題とはそれるかもしれませんが、
「#defineをこんな風に使ってはいけない見本」のような気がします。
そんな気がするのは私だけかもしれませんが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Visual Basic(VBA) vbaで色付けされたセルを除外したいのですが 5 2023/01/28 17:22
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
typedef enumの使い方を教えて...
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
main.c:7:43: warning: implici...
-
C++/CLIでネイティブの構造体を...
-
2重定義って??
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
コンパイルすると error C1083 ...
-
C++デバックエラーについて詳し...
-
VC6でlong longでエラー?
-
スレッドのスケジューリングポ...
-
HINSTANCEの型
-
STL vectorの初期化
-
C++ template operator T()
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
変数の型を定義しなかった場合...
-
visualstudio C# テキストボッ...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
enumについて
-
構造体の宣言でエラーが出ます。
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
0除算を判定したい
-
構造体の要素すべてに対する四...
-
値を返り値に返すのと参照渡し...
-
namespace定義の使い方
-
GCCで暗黙の型変換の警告を出し...
おすすめ情報