2016-01-18 2 views
0

Я работаю над школьным проектом, написанным на C++. Я пытаюсь создать массив цветов rgb на основе пользовательского ввода, для программы, которая генерирует фракталы (нерелевантные).Ошибка в выходе динамически инициализированного 2D-массива

Я нашел необходимость использовать указатель на 2D-массив. Указатель имеет глобальную область видимости, потому что к нему нужно обращаться через несколько файлов, используя несколько функций.

Нет никаких проблем с объявлением указателя. Это, как, например:

в "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(); 
} 

в ничтожной 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 loop] Я получаю ненужные значения.

Данные, введенные [правильные значения], как полученные из утверждений COUT [которые в настоящее время прокомментированных] является this [напечатаны по столбцам], тогда как O/P выдается в this [напечатаны построчно].

Если требуется знать «размер» (в данном случае) = 2, size_arr = 256 и палитру [0] = {0, 0, 255} и палитру [1] = {0,255,0} ,

Может кто-нибудь указать, в чем проблема, и связано ли это с инициализацией указателя?

+0

Опубликованный код не компилируется. Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+1

'while (palette [i] [0]! = 256)' '' i' неинициализирован. – PaulMcKenzie

+0

@PaulMcKenzie -it сделано в int main() –

ответ

0

Даже не читая весь программный код, как

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

выглядит явно не так. На каждой итерации вы записываете ptr[i][k], и цикл не изменяется ptr, i или k. Это означает, что он будет продолжать писать в том же месте во время цикла.

+0

Да, это должно было быть 's' вместо' i' ['k' осталось, как есть], а затем мне понадобилось еще 2 части кода, чтобы заставить его работать. Спасибо. –

0

Посмотрите на свой int i в цикле, который вы используете, чтобы заполнить int ** ptr. Если 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 г, г, б и выделить в качестве пикселя * PTR = новый пиксель [размер] и перебирать пикселей и назначить PTR [я ] .r PTR [я] .g PTR [я] .b

+0

'i = 0; I <1; i ++ '; цикл выполняется один раз, а именно количество раз, которое нужно выполнить для заполнения деталей. И выполнение 'i

+1

Вы не итерируете каждый элемент вашего массива. Посмотрите, как вы индексируете массив, когда вы назначаете значения. '* (* (ptr + i) + k)', если i равно 1 или 2, как вы проходите весь массив? Вам нужно пройти каждый указатель, который вы выделили в 'ptr = new int * [size_arr];', а затем перейдите через каждое выделение для следующих объектов: for (int i = 0; i ghjdgfh

Смежные вопросы