2011-07-03 9 views
0

私は私のプログラムをコンパイルしようとすると、私は次のエラーを取得する:ヘルプ

main.cpp: In function ‘int main()’: 
main.cpp:67: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)mapSizeY) -  1)) + 1u)]’ to ‘int (*)[10]’ for argument ‘3’ to ‘void initializeMap(int, int, int (*)[10])’ 
main.cpp:68: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)mapSizeY) - 1)) + 1u)]’ to ‘int (*)[10]’ for argument ‘3’ to ‘void paintMap(int, int, int (*)[10])’ 

私のコードは次のようになります。

#include <iostream> 
using namespace std; 

void initializeMap(int mapSizeX, int mapSizeY, int map[][10]) 
{ 
    // Map details: 
    // 0 = # (wall) 
    // 1 = space (free space) 
    // 2 = x (player) 

    for(int x = 0; x < mapSizeX; x++) 
    { 
     map[x][0] = 0; 
    } 

    for(int y = 0; y < (mapSizeY - 2); y++) 
    { 
     map[0][y] = 0; 

     for(int x = 0; x < (mapSizeX - 2); x++) 
     { 
      map[x][y] = 1; 
     } 

     map[mapSizeX][y] = 0; 
    } 

    for(int x = 0; x < mapSizeX; x++) 
    { 
     map[x][mapSizeY - 1] = 0; 
    } 
} 

void paintMap(int mapSizeX, int mapSizeY, int map[][10]) 
{ 
    for(int y = 0; y < mapSizeY; y++) 
    { 
     for(int x = 0; x < mapSizeX; x++) 
     { 
      switch(map[x][y]) 
      { 
       case 0: 
        cout << "#"; 
        break; 

       case 1: 
        cout << " "; 
        break; 

       case 2: 
        cout << "x"; 
        break; 

      } 

      cout << map[x][y]; 
     } 
     cout << endl; 
    } 
} 

int main() 
{ 
    int mapSizeX = 10; 
    int mapSizeY = 10; 
    int map[mapSizeX][mapSizeY]; 
    initializeMap(mapSizeX, mapSizeY, map); 
    paintMap(mapSizeX, mapSizeY, map); 

    cout << endl << endl; 

    return 0; 
} 

私がしようと時間を費やしてきました問題を解決し、約20分は解決策を探します。あなたの誰かが私を助けることができますか?

+1

C++コンパイラとC++標準ライブラリにアクセスできます。なぜあなたはC++コードを書いていませんか? –

+0

http://stackoverflow.com/questions/312116/c-array-size-dependent-on-function-parameter-causes-compile-errors – rwong

+0

興味深いエラーメッセージ。これは、GCCがVLAの使用などをどのようにマークしていますか? –

答えて

5

C++は可変長配列をサポートしていません。これはmapがあなたのコードに含まれています。しかし、コンパイラの中には非標準拡張としてサポートするものがあります。しかし、それは確かに "標準"配列を期待する関数と互換性がありません。

mapSizeXmapSizeYを定数にすると、これが機能します。

1

mapSize[X|Y]をmainメソッドでconstにすると、これはうまくいくはずです。あるいは、各メソッドにディメンションを渡しているときに、int**として行列を渡すのはなぜですか?

1

関数の呼び出しでは、2番目の次元が常に10であることが必要です。あなたのコードは変数(mapSizeY)の次元を持っています。ではなく、であることが保証されています。

mapSizeYからconst intに変更して、コンパイラが最適化できるようにします。

+1

最適化だけではなく、コンパイル時の定数でなければなりません。 –

-1

initializeMap paintMap関数のmap[][10]map[][]または*mapに変更します。

2

mapSizeXおよびmapSizeYconstを宣言する。現状のコードは、配列のサイズ指定子としての定数だけを許すC++言語仕様に従って、基本的には適切ではありません。

エラーメッセージは完全に間違っています。これは、一部のコンパイラがこれを拡張機能としてサポートしており、最新のC言語標準にも含まれているためです。

私はhereをテストしました。

1

問題は可変長の自動配列です。この問題を解決する1つの方法は、initializeMap()とpaintMap()の場合と同じようにitemをmain()で同じに見せることです。私はお勧めしません

int main() 
{ 
    int mapSizeX = 10; 
    // int mapSizeY = 10; 
    int map[mapSizeX][10]; 
    initializeMap(mapSizeX, 10, map); 
    paintMap(mapSizeX, 10, map); 

    cout << endl << endl; 

    return 0; 
} 

ことの一つは、単にMapSizeを宣言していますか?はconstです。それは本当にそうでないとき、配列が可変長であるように見えます。

また、可変長自動配列はC89とC++のGNU拡張であることにも注意してください。