【问题标题】:Error in output of dynamically initialized 2D array动态初始化二维数组的输出错误
【发布时间】:2016-04-23 05:19:29
【问题描述】:

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

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

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

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

在 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 [按行打印] .

如果需要知道,“大小”(在这种情况下)=2,size_arr=256 和调色板[0]={0,0,255} 和调色板[1]={0,255,0}。

谁能指出问题出在哪里,是否与指针初始化有关?

【问题讨论】:

  • 发布的代码无法编译。请发帖Minimal, Complete, and Verifiable example
  • while(palette[i][0]!=256) i 未初始化。
  • @PaulMcKenzie - 在 int main() 中完成
  • @Sh.A 在 int main() 中完成 -- 不,不是。 igen_array 中的一个局部变量。
  • @PaulMcKenzie - 我改变了它[我的错]。我在发布问题时犯了一个错误。

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


【解决方案1】:

即使没有像阅读所有程序代码

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

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

【讨论】:

  • 是的,它必须是 s 而不是 i [k 保持原样],然后我只需要再添加 2 段代码就可以让它工作。谢谢。
【解决方案2】:

在你用来填充 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 并分配为 pixel* ptr = new pixel[size] 并遍历像素并分配 ptr[i].r ptr[i].g ptr[ i].b

【讨论】:

  • i=0; i&lt;1; i++ ;循环运行一次,这正是它需要运行的次数以填充细节。并且执行i&lt;size_arr 不会执行所需的操作。
  • 您没有遍历数组中的每个元素。查看分配值时如何对数组进行索引。 *(*(ptr+i)+k) 如果 i 是 1 或 2,你是如何遍历整个数组的?您需要检查在ptr= new int*[size_arr]; 中分配的每个指针,然后检查来自以下位置的每个分配:for(int i = 0; i
猜你喜欢
  • 2012-01-27
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2013-10-04
  • 1970-01-01
  • 2020-10-30
  • 2012-07-12
相关资源
最近更新 更多