プロが教える店舗&オフィスのセキュリティ対策術

先ほども同じような質問をしたのですが、C言語でプログラムを書いているのですがどうしても解決しない問題があるので質問させてください。

(x座標 y座標 その座標における物理量)の順でスペースで区切られてまとまっているファイル(xyc_l.txt)があります。
1. 1. -0.006183877
2. 1. -0.00614342
3. 1. -0.0062423

・ ・ ・
・ ・ ・
51. 1. -0.0232342
1. 2. -0.00234223
2. 2. -0.00644444
3. 2. -0.0061876
・ ・ ・
・ ・ ・
51. 2. -0.0061
1. 3. -0.54545454
・ ・ ・
・ ・ ・
・ ・ ・
49. 51. -0.0061111
50. 51. -0.00686545
51. 51. -0.00618452
-----ファイル(xyc_l.txt)の説明-----
上記の説明だとみにくいので
x座標=1 y座標=1 その座標における物理量=8
x座標=2 y座標=1 その座標における物理量=2
x座標=3 y座標=1 その座標における物理量=2
・・・
x座標=51 y座標=1 その座標における物理量=2
x座標=1 y座標=2 その座標における物理量=8
x座標=2 y座標=2 その座標における物理量=2
x座標=3 y座標=2 その座標における物理量=2
・・・
x座標=51 y座標=2 その座標における物理量=5
となっています。
x座標の範囲が[1:51]、y座標の範囲が[1:51]、その座標に対応する物理量(範囲はなし)が記されています。
------目標--------
このファイル(xyc_l.txt)の3列目に当たる座標に対応した物理量をファイルから読み込んで対応する座標に代入したいです。
例えば、座標(x=3,y=1)に対応している物理量2をcoordinate[3][1]=2というように、coordinate[][]とする変数に代入する作業をfor文を用いて51×51分行いたいということです。

自分で作ってみたプログラムを以下に示しておきます。
調べながら作ってみましたがIllegal instruction: 4がエラーとして返されるなどの問題も解決できず
うまく対処できずに困っています。
どなたプログラムに慣れている方、ご教授お願いします。
#include<stdio.h>

#define MAX 51

int main(void) {
FILE *fp;
const char fname[] = "xyc_l.txt";
double x,y;
double data,coordinate[MAX][MAX];

if( (fp = fopen(fname, "r")) == NULL ) {
printf("%s file not open!\n", fname);
return -1;
}

while(fscanf(fp, "%lf %lf %lf", &x, &y, &data) != EOF) {
coordinate[x-1][y-1]=data;
printf("%f %f %f \n", x,y,coordinate[x-1][y-1]);
}

return 0;
}

-----生成されるエラー-----

error: array subscript is not an integer
coordinate[x-1][y-1]=data;
^~~~
error: array subscript is not an integer
printf("%f %f %f \n", x,y,coordinate[x-1][y-1]);
^~~~
2 errors generated.

もう手に負えません。

A 回答 (3件)

配列の添え字は整数のみ可能です。


座標系は実数表記でも整数として扱かってよいならば、以下で如何でしょうか。

#include <math.h>
...
int a, b;
...
while(fscanf(fp, "%lf %lf %lf", &x, &y, &data) != EOF) {
a = (int) round(x) - 1;
b = (int) round(y) - 1;
coordinate[a][b] = data;

もし座標系も実数で扱う必要があるならば、
単純な二次元配列では対応できないので、
実装量がとても多くなってしまいます。
    • good
    • 0

double x,y; → int x,y;


に変更して、

併せて
while(fscanf(fp, "%lf %lf %lf", &x, &y, &data) != EOF) {

while(fscanf(fp, "%d. %d. %lf", &x, &y, &data) != EOF) {
のように整数読み込みに変更すればよいと思います
(適当に書いたの書式でエラーが出ると思うので正しい書式に治してください)
    • good
    • 0

パッと見ただけですが。

。。
二元配列coordinateの位置を指定する変数xとyは整数(int)でないといけない、、、と思いませんか?
エラーメッセージはまざにそう言っています。

array subscript is not an integer → 配列の添え字が整数でない

参考まで。
    • good
    • 0

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