あなたのコードで気付くことができる2つの問題if(ptr[x][y] == OK)
(1):
ptr
構造体 (single *) へのポインターです。double インデックスは使用できない[][]
ため、次の場所でエラーが発生します。if(ptr[x][y] == OK)
エラー、添字付きの値は配列でもポインタでもありません。ptr[][]
(2):
エラー:スカラーが必要な場所で使用された構造体型の値は、を意味し if(struct are not allow)
ます。
if(should be a scalar value )
スカラー値は、に変換できることを意味します0/1.
2D 構造体配列 C へのポインター
struct structX matrix2D[ROW][COL];
そのポインター
struct structX (*ptr2D)[ROW][COL];
ptr2D = &matrix2D;
わかりました、次のような配列構造にアクセスします:
struct structX i;
(*ptr2D)[r][c] = i;
関数を渡したい場合は、次のようにします。
void to(struct structX* ptr2D[][COL]){
struct structX i;
ptr2D[][COL] = i;
}
void from(){
struct structX matrix2D[ROW][COL];
to(matrix2D);
}
簡単なコードを書いたことを確認するために、 の使用方法を示しますptr2D
。お役に立てば幸いです:
#include<stdio.h>
#define ROW 10
#define COL 5
typedef struct {
int a;
char b;
} structX;
void to(structX ptr2D[][COL], int r, int c){
printf("in to: %d %c\n", ptr2D[r][c].a, ptr2D[r][c].b);
}
int main(){
structX matrix[ROW][COL];
structX (*ptr2D)[ROW][COL];
ptr2D = &matrix;
structX i;
i.a = 5;
i.b = 'a';
int r = 3;
int c = 2;
(*ptr2D)[r][c] = i;
printf("%d %c\n", (*ptr2D)[r][c].a, (*ptr2D)[r][c].b);
to(matrix, r, c);
}
そしてその作業、出力:
5 a
in to: 5 a
編集
私は2つのトリックを示したかったのですが、今は統一されたメソッドを提供する必要があると思います(あなたがコメントしたように):したがって、ここにコードがあります:
#include<stdio.h>
#define ROW 10
#define COL 5
typedef struct {
int a;
char b;
} structX;
void to(structX (*ptr2D)[ROW][COL], int r, int c){
printf("in to: %d %c\n", (*ptr2D)[r][c].a, (*ptr2D)[r][c].b);
}
int main(){
structX matrix[ROW][COL];
structX (*ptr2D)[ROW][COL];
ptr2D = &matrix;
structX i;
i.a = 5;
i.b = 'a';
int r = 3;
int c = 2;
(*ptr2D)[r][c] = i;
printf("%d %c\n", (*ptr2D)[r][c].a, (*ptr2D)[r][c].b);
to(&matrix, r, c);
}
出力
5 a
in to: 5 a
編集:
エラー:スカラーが必要な場所で使用された構造体型の値は、を意味し if(struct are not allow)
ます。
if(should be a scalar value )
あなたは好きにすることはできませんif((*ptr2D)[r][c]);
しかし、これは許可されています:
if((*ptr2D)[r][c].a == 5);
また
if((*ptr2D)[r][c].b == 'a');
また
if((*ptr2D)[r][c].a == 5 && (*ptr2D)[r][c].b == 'a');
また
structX i;
if((*ptr2D)[r][c] == i);