プロが教えるわが家の防犯対策術!

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

A 回答 (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

の様にすると便利です。
    • good
    • 1

エラーが発生しているのは


grid[0].g = (GRID *)calloc(numY, sizeof(GRID));
の行

grid[0]の実体を定義する為に
GRID_ST *grid;

GRID_ST grid[1];
に変更

ついでに
// fclose(fileW);
と削除(未使用)
    • good
    • 0

では改めて。


コードを見返した結果
GRID_ST *grid;
のあと何の初期化もせずに
grid[0].g = ほにゃらら;
とやっています。grid が指し示す場所が不定のため、 grid[0] にアクセスしようとした時に問題が発生します。

さて、どう直したものか……。
理由があって grid をポインタにしたのだろうし、かといってどのくらいの領域を獲得すればいいのか……上記のコードでは使っていない numX でいいのでしょうか。
ならば、上記二番目の行の前に
grid = (GRID_ST *)calloc(numX, sizeof(GRID_ST));
を挿入してください。
それでも問題が発生するならば、どこでプログラムが終わっているかを補足願います。
    • good
    • 0

#1ですが、すみません。

恥ずかしい読み間違いをもとに間違ったエラそうな回答をしてしまいました。#1の回答はわすれてください。
    • good
    • 0

strtok() の結果を printf("%s") で出力してみましょう。

そうすればどこを間違ったかがわかると思います。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています