【问题标题】:How can I resize a double pointer 2D char array by using a 3D char array?如何使用 3D 字符数组调整双指针 2D 字符数组的大小?
【发布时间】:2023-03-23 14:15:01
【问题描述】:

我不确定如何从 char*** 调整 char** 2D 数组的大小。 char** 2D 数组通过此调整大小函数传递,如下所示。

这里是说功能:

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

它没有给我我正在寻找的东西。之前的 char** 数组打印出这样的:

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

我需要它能够调整大小,以便以后可以这样:

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

这些是我之前分配和填充 char** 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);

}

【问题讨论】:

  • 在新数组中你想用旧的wcd 填充所有old_width * old_height 元素吗?
  • @sameerkn,是的,这就是我相信的目标。我将用传递给wc 的字符填充数组。调整大小后,它必须具有以前的数组值,以及调整后的数组中的新 char 值。我在我的帖子中提供了一个例子。看起来原始值仍然存在,但调整大小的数组中的值填充了新添加的插槽。

标签: c++ arrays pointers multidimensional-array function-pointers


【解决方案1】:

由于您使用的是 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;
};

【讨论】:

  • 我试过了,但我得到的 newArray 和 oldArray 的指针类型不兼容。 char** 和 char*** 我尝试改变指针类型,但没有成功。
  • 对不起,这是我的错。我没能准确地写出你写的东西。我现在收到一个错误,因为它与 resize_canvas(&amp;C, 5, 6, 5, 10, 'e'); 不兼容。这是编码挑战的一部分,所以我无法更改它。
  • @AlexSalinas,在这种情况下,将参数类型从 char**&amp; Cp 更改为 char*** Cp 并在函数中进行一些更改。
【解决方案2】:

我认为您的问题源于此:

Cp = new char**[height];

就像任何按值传递的参数一样,更新它会影响本地值,但不会返回您所做的更改。实际上,您所做的是从之前获取 2D char 数组的地址并将其丢弃,用新的 local 2D char 数组替换它。您需要通过参数分配给指向的内存,或者:

*Cp = new char*[height];

【讨论】:

    【解决方案3】:

    既然您已经拥有了必要的功能,那么请重新利用它们。

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

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多