0

char ** 2D配列をchar ***からサイズ変更する方法がわかりません。 char ** 2D配列は、以下のようにこのサイズ変更関数を渡されます。ここ3D char配列を使用してダブルポインタ2D char配列のサイズを変更するにはどうすればよいですか?

を関数と言われている。

resize_canvas(&C, 5, 6, 5, 10, 'e'); 

これは、以下のコードを通過します。それは私がそれが欲しかったサイズではなく、char ***を印刷しています。上記の関数から任意のサイズにリサイズできる必要があります:

void resize_canvas(char*** Cp, int old_width, int old_height, int new_width, int new_height, char wc){ 

    int height = new_height; 
    int width = new_width; 
    int depth = 1; 

    Cp = new char**[height]; 

    for(int i = 0; i < height; i++){ 
     Cp[i] = new char*[width]; 

     for(int j = 0; j < width; j++){ 
      Cp[i][j] = new char[depth]; 
      for(int z = 0; z < depth; ++z){ 
       Cp[i][j][z] = wc; 
       cout << Cp[i][j][z]; 
      } 
     } 
     cout << endl; 
    } 
} 

私が探しているものは私に与えられていません。前回のchar **配列は、このプリントアウト:これらの文字を割り当てられ、満たされた私の以前の機能

// C: 
    // ddddddeeee 
    // ddddddeeee 
    // ddddddeeee 
    // ddddddeeee 
    // ddddddeeee 

た:私はそれは後で、このことができますサイズを変更できるようにする必要があります

// C: 
    // ddddddd 
    // ddddddd 
    // ddddddd 
    // ddddddd 
    // ddddddd 
    // ddddddd 

を** 2D配列:

char** allocate_canvas(int width, int height){ 

    char **array; 
    char temp = 'A'; 
    array = (char **)malloc(height* sizeof(char *)); 
    for (int i = 0; i < height; i++){ 
     array[i] = (char*)malloc(width* sizeof(char)); 
    } 

    return array; 

} 

void wash_canvas(char** C, int width, int height, char wc){ 

    for(int i = 0; i < height; i++){ 
     for(int j = 0; j < width; j++){ 
      C [j][i] = wc; 
     } 
    } 

} 

void deallocate_canvas(char** C, int width){ 

    for(int i = 0; i < width; i++){ 
     free(C[i]); 
     C[i] = NULL; 
    } 

    free(C); 

} 
+0

新しい配列では、すべてのold_width * old_height要素を古い 'wc'すなわち' d'で埋めたいですか? – sameerkn

+0

@ sameerkn、そう、それは私が信じる目標です。 'wc'に渡されたcharで配列を埋めていきます。サイズ変更後、サイズ変更された配列の新しいchar値とともに、以前の配列値を持たなければなりません。私は私のポストに例を挙げました。元の値が残っているように見えますが、サイズ変更された配列の値は新しく追加されたスロットを埋めます。 –

答えて

0

あなたはC++を使用しているので、ポインタへの参照を渡すことができます。 resize_canvasを実装する方法は次のとおりです。

void resize_canvas(char**& Cp, 
        int old_width, int old_height, 
        int new_width, int new_height, char wc) 
{ 
    int height = new_height; 
    int width = new_width; 
    int depth = 1; 

    // Allocate memory for the new array. 
    char** newArray = new char*[height]; 
    for(int i = 0; i < height; i++) 
    { 
     newArray[i] = new char[width]; 
     for(int j = 0; j < width; j++){ 
     newArray[i][j] = wc; 
     } 
    } 

    // Deallocate the old array. 
    char** oldArray = Cp; 
    for(int i = 0; i < old_height; i++) 
    { 
     delete [] oldArray[i]; 
    } 
    delete [] oldArray; 

    // Return the new array to the calling function. 
    Cp = newArray; 
} 

これは言いましたが、Canvasを表すクラスを使用する方がよいでしょう。

Cp = new char**[height]; 

ただ、値によって渡されたパラメータと同様に、それはローカルな値に影響を与えますが、あなたが変更したものを返しません更新:

class Canvas 
{ 
    public: 

    Canvas(int width, int height, char wc); 

    void wash(char wc); 

    void resize(int new_width, int new_height, char wc); 

    private: 

    // Private data can take different forms. 
    // Best to use std::vector. 
    std::vector<std::vector<char>> data; 
}; 
+0

これを試してみましたが、newArrayとoldArrayに互換性のないポインタ型があります。 char **とchar *** 私は周りのポインタタイプを変更しようとしましたが、運はありません。 –

+0

申し訳ありませんが、それは私のせいでした。私はあなたが書いたものを正確に書くことに失敗しました。この 'resize_canvas(&C、5、6、5、10、 'e');と互換性がないので、今エラーが発生しています。それはコーディングの課題の一部なので、変更することはできません。 –

+0

@AlexSalinas、その場合、引数の型を 'char **&Cp'から' char *** Cp'に変更して、関数のいくつかの変更を行います。 –

0

私はあなたの問題は、この由来だと思います。実際に行ったことは、以前の2D char配列のアドレスを取ってそれをスローし、新しいローカル 2D char配列に置き換えます。あなたは、パラメータによってに向けメモリに割り当てる必要がある、または:

*Cp = new char*[height]; 
0

すでにで動作するように必要な機能を持っているので、それらを再利用するので。

//assuming that resize means (new_width > old_width) and (new_height > old_height) 
void resize_canvas(char*** Cp, int old_width, int old_height, int new_width, int new_height, char wc) 
{ 
    //char*** Cp : here Cp is address of existing 2D array. 


    //[1] Allocate the new array 
    char **C_new = allocate_canvas(new_width, new_height); 

    //[2] if the (new_width > old_width) and (new_height > old_height) then fill old elements with corresponding 'Cp[i][j]' and all the extra elements with 'wc'. 

    int i, j; 

    char **C_old = *Cp; // now 'C_old' will point to you existing 2D array. 

    //filling old elements 
    for(i = 0; i < old_height; ++i) 
    { 
     for(j = 0; j < old_width; ++j) 
     { 
      C_new[i][j] = C_old[i][j]; 
     } 
    } 

    //[3] Deallocate the existing array 
    deallocate_canvas(C_old, old_width); 

    //[4] assign new array to old array 
    *Cp = C_new; 

    //filling new elements 
    for(; i < new_height; ++i) 
    { 
     for(; j < new_width; ++j) 
     { 
      C_new[i][j]= wc;    
     } 
     cout << endl; 
    } 

    //check the array by printing 
    cout << endl; 
    for(i = 0; i < new_height; ++i) 
    { 
     for(j = 0; j < new_width; ++j) 
     { 
      cout << C_new[i][j]; 
     } 
     cout << endl; 
    } 
} 
関連する問題