二次元配列に代入できない
Posted: 2007年7月18日(水) 17:40
以前2次元配列を引数に持つような関数の作成方法を質問したものです.
動的メモリ確保の方法で無事コンパイルを通り安心していましたが,実行時にエラーがでてしまいました.
boxさんにアドバイスしていただいき,以下のプログラムとなりました.
自分なりにデバックしてみたところ,/*ここでエラー生じている*/のところでエラーが生じていました.
具体的には
*map[0][0]にaは代入できてる.
*map[0][1]にaが代入できずにエラーがでていることがわかりました.
しかしなぜjが1の時がだめなのかわかりません.
aは(j=1の時も)ファイルから読み込めています.
OSはWindowsXPでCygwinでgccコンパイルをしています.
原因がわかるようでしたら教えていただきたいです.宜しくお願いいたします.
動的メモリ確保の方法で無事コンパイルを通り安心していましたが,実行時にエラーがでてしまいました.
boxさんにアドバイスしていただいき,以下のプログラムとなりました.
#include <stdio.h>
#include <stdlib.h>
#define LEN (80)
typedef struct param {
int param1;
int param2;
} Param;
typedef struct kind {
char filename[LEN];
char message[LEN];
Param param;
} Kind;
void mapFunction(Kind kind, double ***map);
int main(void)
{
double **map[2];
Kind kind[2] = {
{ "TCOutputTorque.csv", "TCOutputTorque", { 15, 3 }, },
{ "TCInputTorque.csv", "TCInputTorque", { 18, 2 }, },
};
int i, j;
mapFunction(kind[0], &map[0]);
mapFunction(kind[1], &map[1]);
for (i = 0; i < 2; i++) {
for (j = 0; j < kind.param.param1; j++)
free(map[j]);
free(map);
}
return 0;
}
void mapFunction(Kind kind, double ***map)
{
int i, j;
double a;
FILE *file;
printf("%s\n", kind.message);
file = fopen(kind.filename, "r");
if (!file)
fprintf(stderr, "open error\n"), exit(1);
*map = (double **) malloc(sizeof(double *) * kind.param.param1);
if (!*map){
fprintf(stderr, "out of memory\n");
exit(1);
}
for (i = 0; i < kind.param.param1; i++) {
*map = (double *) malloc(sizeof(double) * kind.param.param2);
if (!*map)
fprintf(stderr, "out of memory\n"), exit(1);
for (j = 0; j < kind.param.param2; j++) {
fscanf(file, "%lf,", &a);
*map[j] = a;/*ここでエラーが生じる*/
map[j]=(double *)malloc(sizeof(double));
fscanf(file, "%lf,", map[j]);
printf("map[%d][%d] = %4.1f,", i, j, *map[j]);
}
printf("\n");
}
fclose(file);
}自分なりにデバックしてみたところ,/*ここでエラー生じている*/のところでエラーが生じていました.
具体的には
*map[0][0]にaは代入できてる.
*map[0][1]にaが代入できずにエラーがでていることがわかりました.
しかしなぜjが1の時がだめなのかわかりません.
aは(j=1の時も)ファイルから読み込めています.
OSはWindowsXPでCygwinでgccコンパイルをしています.
原因がわかるようでしたら教えていただきたいです.宜しくお願いいたします.