无法弄清楚如何访问这些元素

时间:2016-09-19 11:04:28

标签: c++ sdl-2

这是我的标题

#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;

我也有绿蓝和阿尔法     }

它表示表达式必须具有类类型。我该如何解决? 我努力想弄清楚。所以我希望我至少得到答案

我确实删除了一些相关代码,因此不会占用太多空间

1 个答案:

答案 0 :(得分: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)。如果在编译时不知道大小 - 您可以使用单个分配(mallocnew[])分配颜色数组。如果在运行时期间大小发生变化,则可能更容易使用vector