2017-11-22 11 views
0

私の主な機能では、私は動的な3D配列を作成し、それを配置します。私はこのようにそれを渡すC - 動的に割り当てられた3Dマトリックスを関数に渡す

void readPuzzle(int board[][MAX][MAX], int *dimension, int counter,const char *); 

int ***board = (int ***)malloc(counter * sizeof(int **)); 
    for(int i = 0; i < counter; i++){ 

     board[i] = (int **) malloc(dimension[i] * dimension[i] * sizeof(int)); 
    } 

それから私のように定義された関数に渡すワン

readPuzzle(board, dimension, counter, argv[1]); 

しかし、私はこのエラーを取得しておく、私はそれで検索しましたそれを修正することはできませんでした!

main.c: In function ‘main’: 
main.c:22:13: warning: passing argument 1 of ‘readPuzzle’ from  incompatible pointer type [-Wincompatible-pointer-types] 
readPuzzle(board, dimension, counter, argv[1]); 
     ^~~~~ 
In file included from main.c:4:0: 
headers.h:7:6: note: expected ‘int (*)[100][100]’ but argument is of type  ‘int ***’ 
void readPuzzle(int board[][MAX][MAX], int *dimension, int counter, const char *); 
+2

2次元配列のポインタは、ポインタのポインタに関するポインタではありません。それらは異なるタイプです。 3星のプログラマについても読んでください:http://wiki.c2.com/?ThreeStarProgrammer –

+0

私はそれが2次元配列の配列であることを望んでいましたが、3スターのプログラマについて少し読んだ後、私は魔法のように私がより良い方法を持っている物事をする!私はちょうど少しステップアップ!ありがとう – NickProg36

+0

コードのどの部分を変更できないのですか?関数インタフェースが固定されている場合は、メモリ割り当てを劇的にやり直す必要があります。 mainのメモリ割り当てが固定されている(私はそれが立っていても修正が必要だと思うが、やや接線です)、関数のインタフェースを変更する必要があります。あなたは相容れないものを和解することはできません。何かが変化しなければならない。 (あなたの最後のコメントから、まだこれについて助けが必要かどうかは不明です。) –

答えて

0

あなたの2Dアレイは変数の次元を持っている場合は、あなたがint ***を必要とするが、それは2次元配列の配列ではなく、トリプルを必要とするので、このプロトタイプ

void readPuzzle(int board[][MAX][MAX], int *dimension, int counter, const char *); 

int ***として渡されたboardと互換性がありませんポインタ。

だから、そのようにそれを修正:

void readPuzzle(int ***board, int *dimension, int counter, const char *); 

それでも各「スライス」の次元を追跡する必要があります。 2Dアレイは、寸法が固定されている場合

代替、MAX*MAX、このような2次元配列の配列を割り当てることである。

int (*board)[MAX][MAX] = malloc(counter*sizeof(*board)); 

今はint board[][MAX][MAX]としてboardを渡すことができます。もちろん、すべてのデータが使用されているわけではない場合でも、どこかで最大次元を追跡する必要があります。

関連する問題