C言語プログラム初心者です。
下記プログラムで途中でプログラムが止まってしまう理由が分かりません。
どなたか、理由を教えていただけないでしょうか??
なおプログラムは、エラー箇所が分かりやすいよう、一部のみを取り出しています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
/*節点情報格納用構造体*/
typedef struct GRID_tag
{
int gid; /*節点ID*/
double x;
double y;
}GRID;
typedef struct GRID_ST_tag
{
int num;
GRID *g;
}GRID_ST;
/*要素情報格納用構造体*/
typedef struct ELEM_tag
{
int eid; /*要素ID*/
}ELEM;
typedef struct ELEM_ST_tag
{
int num;
ELEM *e;
}ELEM_ST;
main()
{
FILE *fp;
FILE *fileW;
char filename[256]="input.txt";
char buf[256];
char *pt;
int i,j,pos,num0;
double lengthX;
double lengthY;
int numX,numY,numE;
double x0,y0;
GRID_ST *g;
GRID_ST *grid;
ELEM_ST *e;
ELEM_ST *el;
ELEM_ST *elem;
printf("ファイル名を入力してください\n");
scanf("%s" , filename);
if((fp = fopen(filename,"r")) == NULL){
fprintf(stderr,"指定されたファイルを開けません。\n");
exit(-1);
}
pos = 0;
while(fgets(buf,sizeof(buf),fp)){
if(strncmp(buf,"**",2)==0) continue;
pos++;
}
rewind(fp);
num0=pos;
/*情報処理ファイルの読み込み*/
while(fgets(buf,sizeof(buf),fp)){
if(strncmp(buf,"**",2)==0) continue;
pt = strtok(buf,",");
if(strncmp(pt,"nagasaX",7)==0){
pt = strtok(NULL,",");
lengthX = atof(pt);
}
else if(strncmp(pt,"bunkatuX",8)==0){
pt = strtok(NULL,",");
numX = atoi(pt);
}
else if(strncmp(pt,"nagasaY",7)==0){
pt = strtok(NULL,",");
lengthY = atof(pt);
}
else if(strncmp(pt,"bunkatuY",8)==0){
pt = strtok(NULL,",");
numY = atoi(pt);
}
}
x0 = 0;
y0 = 0;
/*最内層節点作成*/
grid[0].g = (GRID *)calloc(numY, sizeof(GRID));
for(i=0; i<numY; i++){
grid[0].g[i].gid = i+1;
grid[0].g[i].x = 0;
grid[0].g[i].y = i*lengthY/numY;
fprintf(stderr,"%d\n",i);
}
fclose(fileW);
fclose(fp);
return(0);
}
************************************
************************************
inputファイルは以下です。
**X方向長さ
nagasaX,5
**X方向分割数
bunkatuX,12
**Y方向長さ
nagasaY,3
**Y方向分割数
bunkatuY,5
No.3ベストアンサー
- 回答日時:
では改めて。
コードを見返した結果
GRID_ST *grid;
のあと何の初期化もせずに
grid[0].g = ほにゃらら;
とやっています。grid が指し示す場所が不定のため、 grid[0] にアクセスしようとした時に問題が発生します。
さて、どう直したものか……。
理由があって grid をポインタにしたのだろうし、かといってどのくらいの領域を獲得すればいいのか……上記のコードでは使っていない numX でいいのでしょうか。
ならば、上記二番目の行の前に
grid = (GRID_ST *)calloc(numX, sizeof(GRID_ST));
を挿入してください。
それでも問題が発生するならば、どこでプログラムが終わっているかを補足願います。
No.5
- 回答日時:
ついでにデバッグ方法
------------------------------------
x0 = 0;
y0 = 0;
printf("sizeof(GRID): %d\n", sizeof(GRID));
printf("lengthX: %lf\n", lengthX);
printf("numX: %d\n", numX);
printf("lengthY: %lf\n", lengthY);
printf("numY: %d\n", numY);
printf("StartA\n");
/*最内層節点作成*/
grid[0].g = (GRID *)calloc(numY, sizeof(GRID));
printf("StartB\n");
for(i=0; i<numY; i++){
grid[0].g[i].gid = i+1;
grid[0].g[i].x = 0;
grid[0].g[i].y = i*lengthY/numY;
// fprintf(stderr,"%d\n",i);
printf("%d\n",i);
}
// fclose(fileW);
fclose(fp);
return(0);
}
------------------------------------
上記の様に随時、変数の内容や実行前・実行後に
メッセージを出力させる。
長いプログラムの場合は
#define DEBUG
#ifdef DEBUG
printf("%d\n",i);
#endif
の様にすると便利です。
No.4
- 回答日時:
エラーが発生しているのは
grid[0].g = (GRID *)calloc(numY, sizeof(GRID));
の行
grid[0]の実体を定義する為に
GRID_ST *grid;
を
GRID_ST grid[1];
に変更
ついでに
// fclose(fileW);
と削除(未使用)
No.1
- 回答日時:
strtok() の結果を printf("%s") で出力してみましょう。
そうすればどこを間違ったかがわかると思います。http://www9.plala.or.jp/sgwr-t/lib/strtok.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
C言語で途中までしか、プログラムが実行されない原因は何が考えられますか? どこまでが実行されたのか確
C言語・C++・C#
-
プログラムが途中で強制終了してしまいます...
C言語・C++・C#
-
printfだと出力されるのにfprintfだと出力されないのはなぜですか?
C言語・C++・C#
-
-
4
ファイル出力で改行を入れたい!
C言語・C++・C#
-
5
C言語のポインターに関する警告
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
C++で指定文字列のカウント方法...
-
C言語のプログラムで、途中で止...
-
#defineが使用するメモリ領域に...
-
リストの作成と出力(C言語)
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
プログラミング初心者です。 Py...
-
「指定されたキャストは有効で...
-
強連結判定を行うプログラムに...
-
有効数字について 以前質問をし...
-
intとlongは同じ?
-
C言語 エラーの原因がわからな...
-
2÷3などの余りについて
-
if と配列の組み合わせ
-
C言語を実行すると-infが出てき...
-
構文エラー";"が型の前にあり...
-
マイナスからプラスへ転じた時...
-
C言語での引数の省略方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
【C言語】全角文字の配列を、全...
-
空白を含んだ文字列がうまく格...
-
char型2つを結合し、short型に...
-
reallocでエラー
-
矢印キーを押下してコンソール...
-
C言語でのCSVファイルの読み出...
-
C++で指定文字列のカウント方法...
-
終了条件Ctrl+zについて,結果表...
-
リストの作成と出力(C言語)
-
ファイル操作で全角空白を消す
-
エラーについて質問です。
-
fscanfの使い方
-
WinInetのInternetOpenUrl関数...
-
C言語のプログラムで、途中で止...
-
構造体メンバの初期化
-
タイムカードのシステムを作り...
おすすめ情報