动态初始化的 2D 数组输出错误

Error in output of dynamically initialized 2D array

本文关键字:输出 错误 数组 2D 初始化 动态      更新时间:2023-10-16

我正在做一个用 c++ 编写的学校项目。我正在尝试根据用户输入为生成分形(无关)的程序生成 rgb 颜色数组。

我发现需要使用指向 2D 数组的指针。指针具有全局作用域,因为它需要在多个函数中跨多个文件进行访问。

指针的声明没有问题。它是这样的:

在"全球.h"中

int **ptr;
int palette[10][3];
//all the statements like #ifndef GLOBAL_H_INCLUDED, etc are present

在主要.cpp

extern int **ptr;
extern int palette[10][3]; 
void gen_array();
int main()
{
     //initialize values of palette
     //palette is basically list of colors that the user selects for the 
     //desired blend of colors to appear on the screen
     gen_array();
}

在 void gen_array() 中,在主.cpp

void gen_array()
{
    int i=0, size=0, size_arr=0;
    //size is a variable helpful in calculating "size_arr", which is the size of the dynamic array to be initialized
    while(palette[i][0]!=256)
    { //calculates "size" }
    for(int i=0; i<size-1; i++)
    {
       //to find "size_arr"
    }
    ptr= new int*[size_arr]();
    for(int i = 0; i < size_arr; ++i)
    {
        ptr[i] = new int[3];
    }
    //the following piece of code enter's values column-wise into the array
    int s=0;
    for(int i=0; i<size-1; i++)
    {
        for(int k=0; k<3; k++)
        {
            int x=-1, a=0, b=0;
            a= palette[i][k] - palette[i+1][k];
            b= palette[i][k];
            if(a<0)
            {
                a= -a;
                x=1;
            }
            for(int j=0; j<=a; j++, s++)
            {
                ptr[i][k] = b;
                //cout<<*(*(ptr+i)+k)<<' ';
                b= b+ x;
            }
            b= b-x;
            for(int j=a+1; j<=diff[i]; j++, s++)
            {
                ptr[i][k] = b;
                cout<<ptr[i][k]<<' ';
            }
            cout<<endl;
        }
    }
    //this output's the array that the pointer points to, on the screen
    for(int i=0; i<size_arr; i++)
    {
        for(int j=0; j<3; j++)
        {
            cout<<ptr[i][j]<<' ';
        }
        cout<<endl;
    }
}

问题是,数据在数组中正确生成和输入[在倒数第二个for循环中],但是当输出它[最后一个for循环]时,我得到了垃圾值。

从 cout 语句 [现在已注释] 获得的输入 [正确值] 的数据是这个 [按列打印],而给出的 O/P 是这个 [按行打印]。

如果需要知道,"size"(在本例中)=2, size_arr=256 和调色板 [0]={0, 0, 255} 和调色板 [1]={0,255,0}。

任何人都可以指出问题是什么,以及它是否与指针初始化有关吗?

即使没有读取所有程序代码,例如

for(int j=0; j<=a; j++, s++)
{
    ptr[i][k] = b;
    //cout<<*(*(ptr+i)+k)<<' ';
    b= b+ x;
}

看起来显然不对劲。在每次迭代中,您都写入ptr[i][k]并且循环不会更改ptrik。这意味着它将在循环期间继续写入相同的位置。

在你用来填充int** ptr的循环中查看你的int i。如果 size = 2,那么您永远不会将 ptr 推进到足以填充数组的程度。考虑像这样填充数组:

for(int i = 0; i < size_arr; ++i){//for every pixel in the main array
  for(int k = 0; k < 3; ++k){//for every subpixel
    int my_value = ...;//calculate the value for this entry
    *(*(ptr+i)+k) = my_value;//assign

更好的是,使用包含 Uint8 r,g,b 的名为 pixel 的结构并分配为 pixel* ptr = new pixel[size] 并迭代像素并分配 ptr[i].r ptr[i].g ptr[i].b