动态初始化2D阵列的输出出错

时间:2016-01-18 05:37:04

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

我正在研究用c ++编写的学校项目。我正在尝试根据用户输入生成一组rgb颜色,用于生成分形(不相关)的程序。

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

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

in" global.h"

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

在main.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();
}

in void gen_array(),在main.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语句[现在已注释]中输入的[正确值]输入的数据为this [逐列打印],而给出的O / P为this [已打印]逐行]。

如果需要知道,&#34;尺寸&#34; (在这种情况下)= 2,size_arr = 256和palette [0] = {0,0,255}和palette [1] = {0,255,0}。

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

2 个答案:

答案 0 :(得分:0)

在你用来填充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

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

答案 1 :(得分:0)

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

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

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