4

特定の構造体structXと、これらの種類の構造体を保持する 2D 配列があります。

その2D構造体へのポインターを保存して、それを反復できるようにしたい

動的な方法で、つまり、ポインターは anystructXを保持して反復できます。

一般的な行の例:

struct structX *ptr = NULL;

...

  if(i == OK)
    {
        ptr = General_struct_which_holds_others->ptr1;
    }
    else if(i ==NOT_OK)
    {
        ptr = General_struct_which_holds_others->ptr2;
    }

今反復:

if(ptr[x][y] == OK) <----Error, subscripted value is neither array nor pointer
{
...
}

これは非常に一般的だと言っていたので、理解していただければ幸いです。

反復はどのように行うことができますか?エラーが発生しないということですか?

ありがとう!

4

2 に答える 2

2

多次元配列に関するこの記事を準備しておくことをお勧めします。配列を反復処理する場合は、配列の大きさ (動的かどうか) を知る必要があります。動的にしたい場合は、成長する必要があるときにメモリを割り当て、古いメモリを解放する必要があることを意味します。あなたの質問にも問題があります.nullである単一のポインタを宣言し、それを逆参照しようとしましたが、メモリを割り当てませんでした。

メモリを割り当てた場合は、次のように逆参照できます

ptr[x * ROW_WIDTH + y]

ROW_WIDTH を y の最大値に設定した場合。行優先の配列と列優先の配列のどちらを表すかによって、x * 幅の代わりに y * 幅を使用できます。

于 2013-03-04T19:33:03.207 に答える
2

あなたのコードで気付くことができる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);
于 2013-03-04T18:09:01.883 に答える