2016-03-28 7 views
0

下に私のプログラムのための未完成のコードがありますが、現段階ではエラーが発生しています(Xcodeログ:Subscripted value is not array, pointer or vector)。私はメモリ割り当てと関係があると思います。このエラーは、1の値を(*map[x2][y2]).existに、そしてmap[x1][y1] = NULL;に代入しようとすると、if文で発生します。そのような変数に値を割り当てる適切な方法を示してください。Cでの動的メモリ割り当て:なぜエラーが発生するのですか?

ありがとうございます! X2とY2が規定値を持っていない他に

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int num; 
    _Bool exist; 
}name; 

int main(void){ 

name* map[10][10]; 
name* guy; 

guy = (name*)malloc(10*sizeof(name)); 

int x1, y1, x2, y2; 
int m, n, o; 

for(m = 0; m < 10; m++){ 
    for(n = 0; n < 10; n++){ 
     map[m][n] = NULL; 
    } 
} 

for(o = 0; o < 10; o++){ 

    (*(guy+o)).num = rand() % 4; 
    (*(guy+o)).exist = 1; 

    do{ 
     m = rand() % 10; 
     n = rand() % 10; 
    }while (map[m][n] != NULL); 
    map[m][n] = guy + o; 
} 

if(map[x2][y2] == NULL){ 

    name *map = malloc(10*10*sizeof(name)); 
    (*map[x2][y2]).exist = 1; 
    map[x1][y1] = NULL; 

} 

return 0; 
} 
+0

あなたは間違っていると思います。あなたが意図するものを説明する(* map [x2] [y2]) 'to * do *? – WhozCraig

+0

@WhozCraig私は1の値を '(* map [x2] [y2]) 'に代入したい – user6115697

+0

@WhozCraigフィールドを移動して障害物を回避する必要があるゲームを作っています – user6115697

答えて

0

- 彼らは0にデフォルト設定はありませんし、あなたのif文の外にマップを非表示にあなたのif文のマップ変数、あなたはどのように理解することで問題を抱えているように見えますメモリを割り当てたり、割り当てられた後にアクセスすることができます。

最初にguy変数を修正し、その経験を使ってmap変数に適用することをお勧めします。

あなたが書いたようにguy変数は、10の名前構造を保持できるメモリブロックを指しています。それはそこに10の名前の構造があることを意味するものではなく、10の名前の構造を保持するのに十分な大きさのメモリのブロックであることを意味します。ブロックは、名前構造に対するポインタを10個保持するサイズではなく、実際の名前構造に10個のポインタを保持するサイズになっていることに注意してください。

(guy+o)のような男の変数で算術演算を行うと、guyは名前のサイズではなく名前のサイズではないので、メモリブロックにo名前構造を移動しません。あなたのシステム上のポインタのサイズが4バイトで、名前の構造が8バイトであれば、正しいバイト数をブロックに移動していないので、正しい場所を指さない。

もし10人の名前を男に初期化したいのであれば、ポインタで本当にうまくいくまであなた自身を好意してください。名前のポインタの配列として男の変数を作成してください。

だから、男の定義は

name* guy[10]; 

になり、男は、今のポインタとして認識されますので、男では10名の初期設定ではなく

guy = (name*)malloc(10*sizeof(name)); 

for (m = 0; m < 10; m++) { 
     guy[m] = malloc(sizeof(name)); 
     if (guy[m]) { 
     guy[m]->num = rand() % 4; 
     guy[m]->exist = 1; 
     } 
    } 

なり(guy + o)のような算術演算を行うと、名前ポインタの配列に別の名前構造体へのポインタを使用します。しかし、私はあなたの人生を楽にするためにそれを避けるでしょう。 guy[o]を使って、guy配列のその位置にあるポインタにアクセスしてください。

コードを動作させるためにマップするのに同じルールを適用できるはずです。

関連する問題