2017-10-09 4 views
0

私はポインタ(hw )をトラバースする必要がある15x15の配列を持っています。私はパズルソルバを書いているので、縦方向にいくつかの単語を検索する必要があります。横方向の検索はしましたが、配列列をcolumnでトラバースできません.tmpが終わりに達した後、毎回ptrをtmpに割り当てようとしています。カラム。ポインタを使用して列ごとに多次元配列の列を移動します

void VerticalSearch(char** puzzleArray, searchedWord* word) { 

int len = word->wordLength; 

char **tmp = puzzleArray; 
char *ptr = &puzzleArray[0][0]; 

string s; 

for (int i = 0; i < 15; i++) { 

    **tmp = *ptr; 
    s = ""; 
    for (int k = 0; k < 15; k++) 
    { 
     s += **tmp; 
     (tmp)++;  

    } 
    cout << s << endl; 
    ptr++;   

} 
} 
+3

*を参照してください? (int j = 0; j!= 15; ++ j){foo(puzzleArray [i] [j]); for(int i = 0; i!= 15; ++ i) (int i = 0; i!= 15; ++ i){foo(puzzleArray [i] [j]);}}}および 'for(int j = 0; j!= 15; ++ j) }} 'は両方向であなたの行列をトラバースすることができます。 – Jarod42

+0

"tmpがカラムの終わりに達した後、毎回ptrをtmpに割り当てるようにしています。" 'tmp'には決して割り当てません。 forループの最初の行は、 'tmp'が指し示す最初のポインタが指すcharに代入します。 –

+3

また、可能ならばポインタへのポインタの使用は避けてください。 'std :: array'または' std :: vector'を見てください。彼らはどちらも理由を考えるのがはるかに簡単です。 –

答えて

2

実際に必要なことを行うには、配列がメモリに割り当てられる方法を利用する必要があります。

実際にスタック上に配列を割り当てているとします(char puzzle[15][15]あなたのメインのどこか)。この場合、この関数に渡すと警告が出ます(this answer参照)。

配列が

a1, a2, a3, b1, b2, b3, c1, c2, c3

だから、あなたが実際に

void VerticalSearch(char** puzzleArray, searchedWord* word) { 

    int len = word->wordLength; 

    char** tmp; // initialize the pointer 

    string s; 

    for (int i = 0; i < 15; i++) { 
     tmp = puzzleArray + i; // update with the i-th char of the first row 
     s = ""; 
     for (int k = 0; k < 15; k++){ 
      s += *tmp; 
      tmp += 15; //each time you read a character from the column 
         // go to the next character of the same column 
         // one row far 
     } 
     cout << s << endl;  
    } 
} 
ような何かを行うことができ、メモリに

a1,a2,a3,b1,b2,b3,c1,c2,c3

なることを意味行の主要な形で割り当てられています

これはうまくいくはずです、私はそれを試していません。

ところで、回避策を使用すると、一般的に、特に配列上で、頭痛を引き起こしてバグにつながる可能性があります。 通常の配列インデックスを使用し、コンパイラにこのような処理をさせます。行列がメモリに保存されている方法の詳細については

は、なぜ*「私はポインタを横断する必要がある」this

+0

'tmp = puzzleArray + i; //最初の行のi番目の文字で更新 'この行は、行ではなく列のi番目の文字を更新します。 –

+0

行はchar自体を更新しませんが、 'tmp'ポインタを最初の行のi番目の文字、つまりi番目の列の最初の文字で更新します。 – bracco23

+0

私はtmpポインタを最初の行のi番目の文字で更新せず、行ごとに横断することを意味しました。 –

関連する問題