2016-04-03 7 views
0

TとAからなるchar行列が与えられた宿題として関数を作成する必要があります。この行列上にある島の数はTであり、Aスペイン語で水。私がまだできたことはもう一つ問題があり、私はパラメータとして与えられた行列を修正することができます。私は関数を呼び出す前に行列をコピーして新しい行列を送ることを考えましたが、私はこれを行うことができませんでした。タイトルが書いているように、私は絶対にどんな種類のライブラリ関数(strcopyなど)も必要としません。私は念のために私のコードを渡します:ライブラリ関数を持たないコピー文字行列(char **)

int islands(char** map, int col, int row){ 
char** aux = map;//I don't think this line does anything 
int cont = 0; 
for (int i = 0; i < col; i++) { 
    for (int j = 0; j < row; j++) { 
     char c = aux[i][j]; 
     if (aux[i][j] =='T') { 
      cont++; 
      deleteLand(aux, i,j, col, row); 
     } 
    } 
} 
int a = cont; 
return cont; 
} 


void deleteLand(char** map, int t1,int t2, int col, int row) { 
map[t1][t2] = 'A'; 
for (int i = -1; i <= 1; i++) { 
    for (int j = -1; j <= 1; j++) { 
     if (!(i==0 && j ==0)&&(t1 + i >= 0 && t1 + i < col) && (t2 + j >= 0 && t2 + j < row)) { 
      if (map[t1 + i][t2 + j] == 'T') { 
       int tc = t1+i; 
       int tr = t2 + j; 
       deleteLand(map, tc,tr,col,row); 
      } 
     } 
    } 
} 
} 

そして、それが返すものの例: エントリ:([ 'T'、 'T'、 '' 'A'、 'A' を、 'T' 'A'、 'A'、 '' 'T'、 'T'、 'A']、3、4) 戻り値:2

は、それが十分に明らかであると思います。また、これを書いている間に、私は行列の値を入力して終了時に再びコピーする際にそれを保存することができることを認識しましたが、実際には同じであると思います。助けてくれてありがとう

+0

行列は一般的に2次元配列の同義語です。 'char'のようなものは' 'char'へのポインタへのポインタです。このような構造には使用できません。 2D配列が必要な場合は、 'int(* array2d)[COLS]'を使います。 – Olaf

+0

それは私の行の1つだけを与えるだろうか? –

+0

@BrunoVezoli *私は絶対にライブラリ関数なしでこれをする必要があります* - あなた自身の関数ライブラリ、つまり自分自身の 'strcpy'などを作成するのを止めるものはありません。このすべては 'deleteLand'関数の内部にあります。 – PaulMcKenzie

答えて

1

アレイ(アレイからのデータ)をコピーするには、スペースを割り当てる必要があります。コピーを使用した後、メモリを解放する必要があります。


私は、この場合には、データをコピーする唯一の理由はmapで元のデータを復元することであると仮定します。もしそうなら、はるかに良い解決策は、deleteLandの訪問島を隠すために別の手紙、例えば「B」を使うことでしょう。その後、すべてのBをTに変更した元のマップをすばやく元に戻すことができます。これは、メモリの割り当てと割り当て解除に関するすべての問題を回避します。

EDIT:その間にC++のタグが削除されたため、C++の実際のコードを削除する必要がありました。

+0

「B」に変更することは、ここでのすべての問題を解決するのに最適です。私はちょうど@PaulMcKenzieからの提案で自分のメソッドを作成し終えました。ありがとうポール私はちょうど場合の私のソリューションを投稿しますポール –

+0

質問は、このコメントを書いていたときにC. – Olaf

+0

@Olafタグ付きでした。私はそれを編集する必要がありますか? – ptrj

0

コメントに投稿したとおり、PaulMcKenieの助けを借りて問題を解決できました。誰にとっても便利な場合に備えてコードを投稿します。

char** copyMatrix(char ** mat, int cols) { 
char** newMat = new char*[cols]; 
for (int i = 0; i < cols; i++) { 
    newMat[i] = copyStr(mat[i]); 
} 
return newMat; 
} 

そして、私もcopyStr投稿しますので、私はライブラリ関数を使用することはできません前に私が述べたように:

char* copyStr(char* string) { 
char* copia = new char[strLen(string)]; 
int i = 0; 
while (*string) { 
    copia[i] = *string; 
    *string++; 
    i++; 
} 
copia[i] = *string; 
return copia; 
} 
関連する問題