0

Я не уверен, как изменить размер двумерного массива char ** с char ***. Массив char ** 2D передается через эту функцию изменения размера, как показано ниже.Как изменить размер двумерного массива двумерных указателей с помощью массива 3D-символов?

Здесь указанная функция:

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

Это проходит через код ниже. Он печатает символ ***, но не тот размер, который мне нужен. Он должен иметь возможность изменять размер любого заданного размера из приведенных выше функций:

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; 
    } 
} 

Это не дает мне то, что я ищу. Предыдущий символ ** массив печатается следующим образом:

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

мне нужно, чтобы иметь возможность изменить размер, поэтому он может быть позже:

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

Это были мои предыдущие функции, выделенные и заполненные полукокс ** 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' i.e 'd'? – sameerkn

+0

@sameerkn, да, это цель, которую я считаю. Я буду заполнять массив символом, переданным 'wc'. После того, как он будет изменен, он должен иметь предыдущие значения массива вместе с новыми значениями 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.

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 ** and char *** Я попытался изменить типы указателей, но не повезло. –

+0

Извините, это была моя ошибка. Я не смог точно написать то, что вы написали. Я получаю сообщение об ошибке, так как он несовместим с этим параметром resize_canvas (& C, 5, 6, 5, 10, 'e'); '. Это часть проблемы с кодированием, поэтому я не могу ее изменить. –

+0

@AlexSalinas, в этом случае измените тип аргумента с 'char ** & Cp' на' char *** Cp' и выполните пару изменений в функции. –

0

Я думаю, ваша проблема связана с этим:

Cp = new char**[height]; 

Так же, как любой параметр передается по значению, обновляя это повлияет на локальное значение, но не возвращает то, что вы изменили. Эффективно то, что вы сделали, берется затем адрес вашего массива 2D-символов от ранее и отбрасывает его, заменяя его новым локальным массивом 2D-символов. Вам нужно назначить памяти указали на вашего параметра, или:

*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; 
    } 
}