2016-09-19 7 views
-1

это мой заголовокне может понять, как Acces этих элементов

#include <SDL.h> 
class Grid 
{ 

public: 
int** Cells; 
int x; 
int y; 
SDL_Color* palette[255]; 
Grid(int,int,int); 
~Grid(); 
void DrawGrid(SDL_Renderer*); 
void SetPalette(int c, int r, int g, int b, int a); 
}; 

и это мой источник:

Grid::Grid(int a,int b,int s) 
{ 
std::cout << "grid constructed"; 
x = a; 
y = b; 
Grid::Cells = (int**) malloc(x*s); 
for (int i = 0;i < x;i++) 
{ 
    Grid::Cells[i] = (int*)malloc(y*s); 
} 

    SetPalette(1, 255, 255, 255, 0); 
} 

void Grid::DrawGrid(SDL_Renderer* renderer) 
{ 

     std::cout << Grid::palette[Cells[i][o]].r << " : " << Cells[i][o]; 
     SDL_SetRenderDrawColor(renderer, palette[Cells[i][o]].r, palette[Cells[i][o]].g, palette[Cells[i][o]].b, palette[Cells[i][o]].a); 
     SDL_RenderDrawPoint(renderer, i, o); 

} 

void Grid::SetPalette(int c, int r, int g, int b, int a) 
{ 
palette[c].r = r; 

У меня есть это на зеленый синий и альфа также }

он говорит, что выражение должно иметь тип класса. как я исправить Я очень старался понять это. поэтому я надеюсь, что я получаю ответ, по крайней мере

я сделал удалить некоторые из irellevant кода, чтобы он не займет слишком много места

+0

палитра представляет собой массив указателей, вам необходимо разыменовать перед доступом к членам, изменить любую 'palette [].' To 'palette [] ->'. –

+0

Ваше использование ячеек не соответствует его объявлению. 'Grid :: palette [Cells [i] [o]]' подразумевает 2D-массив целых чисел. Вы указали только двойной указатель на ints. 'int ** Cell;' –

+0

Ячейки - это 2D-массив, и он работает. это было, когда я представил палитру, она запуталась. – Kriso

ответ

0

Вы не выделять память для палитры элементов. Без изменения компоновки данных (которые плохо, смотрите ниже), вы будете нуждаться по крайней мере, выделить элементы в конструкторе (до SetPalette):

for(int i = 0; i != 255; i++) { 
    palette[i] = new SDL_Color; 
} 

(вы также должны освободить эту память, например, в деструкторе) ,

С палитрой, объявленной как SDL_Color* palette[255];, выражение palette[c] есть тип SDL_Color*. Доступ к области структуры с помощью . требует структуры оператора, а не указателя - поэтому прямое решение - palette[c]->r (или разыменовывается вручную и используется ., но это именно то, что делает ->).

Однако распределение большого количества мелких объектов имеет относительно высокую стоимость, и в данном примере нет смысла делать это. Если ваш размер палитры постоянный (как есть), вы можете просто использовать SDL_Color palette[255] и удалить весь код распределения/освобождения (и не будет необходимости ->, так как тип palette[c] теперь SDL_Color). Если во время компиляции размер неизвестен, вы можете выделить массив цветов с одним распределением (malloc или new[]). И если размер изменяется во время выполнения, вероятно, проще использовать vector.

+0

, поэтому я сделал это, но он не работает. если у вас есть время, вы можете мне помочь? – Kriso

+0

Нет, если вы не скажете, что именно «не работает» и что вы сделали. – keltar

+0

нашел работу вокруг. теперь мне нужно ускорить код. Я получил проект vs2015 [здесь] [код], если вы хотите взглянуть. Кстати, я знаю, что код дерьмо. [код]: https://drive.google.com/open?id=0Bz-PYBgWOisTeTQzOVNLMk5HR28 – Kriso

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

  • Нет связанных вопросов^_^