C,SDL:错误:无法转换' SDL_Surface *'到' SDL_Surface *(*)[15]

时间:2017-08-28 16:42:40

标签: c sdl

所以我正在编写一个用表面填充屏幕的代码;这是代码:

的main.c

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif

#include <SDL/SDL.h>
#include <SDL_image.h>
#include "maploader.h"

#define W 510
#define H 510
#define SIZE 34

void pause();

int main ( int argc, char** argv )
{
    SDL_Surface *screen = NULL;
    SDL_Surface *surfaces[15][15];



    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(W, H, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("demon game", NULL);
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    mapload(screen, surfaces[15][15], NULL);

    SDL_Flip(screen);
    pause();
    SDL_QUIT;
    return EXIT_SUCCESS;
}


void pause()
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
            continuer = 0;
        }
    }
}

maploader.c

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif

#include <SDL/SDL.h>
#include <SDL_image.h>
#define W 510
#define H 510
#define SIZE 34



SDL_Surface *surfaces[15][15];


void mapload(SDL_Surface *screen, SDL_Surface *surfaces[][15], int lvl)
{
    FILE *level = NULL;
    char elements[125];
    int i, j, k = 0;
    SDL_Rect elementposition = {0,0};


    level = fopen("level.txt", "r");
    if (level == NULL)
    {
        exit(0);
    }
    fgets(elements, 125, level);
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    for (i=0; i<15; i++)
    {
        for (j=0; j<15; j++)
        {
            if (elements[k] == "0")
            {
                surfaces[i][j] = IMG_Load("mur.jpg");
            }
            else if (elements[k] == "1")
            {
                surfaces[i][j] = IMG_Load("caisse.jpg");
            }
            else if (elements[k] == "2")
            {
                surfaces[i][j] = IMG_Load("objectif.png");
            }
            else
            {
                surfaces[i][j] = NULL;
            }
            k++;

        }

    }

    for (i=0; i<15; i++)
    {
        for (j=0; j<15; j++)
        {
            SDL_BlitSurface(surfaces[i][j], NULL, screen, &elementposition);
            elementposition.x += SIZE;
        }
        elementposition.y += SIZE;
    }




}

我从编译中得到的唯一错误如下:&#34;无法转换&#39; SDL_Surface *&#39;到&#39; SDL_Surface *()[15]&#39;争论&#39; 2&#39; to&#39; void mapload(SDL_Surface ,SDL_Surface *(*)[15],int)&#39; |&#34;

显然,错误是从mapload函数的第二个参数初始化的,但我并不清楚错误到底是什么。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

此,

mapload(screen, surfaces[15][15], NULL);

应该是

mapload(screen, surfaces, NULL);

但现在你应该问问自己,如果你当时不知道,

  • void mapload(SDL_Surface *screen, SDL_Surface *surfaces[][15], int lvl)的签名完全错误。
  • 您需要研究中的数组及其与指针的关系。

请注意,surfaces[15][15]表示第16个指针数组的第16个元素,其中没有一个存在,因为您只分配了15个。因此,您需要了解中的数组,它们的分配方式以及如何使用动态数组。

另外,你告诉编译器一个函数期望一个数组的事实在这个函数中并不是很相关,所以语法SDL_Surface *surfaces[][15]对于c程序员来说似乎很奇怪。

最后,由于surfaces是一个全局变量,你不需要将它作为参数传递,但是你应该问自己,它应该是一个全局变量