Инициализировать SDL_Surface* в функцию

Я хочу инициализировать весь мой SDL_Surface в функцию, чтобы получить максимально чистое основное, но, похоже, это не работает. Я делаю это так:

void setImages(SDL_Surface* mur, SDL_Surface* caisse, SDL_Surface* caisseOk, SDL_Surface* menu, SDL_Surface* objectif)
{
    mur = IMG_Load("images\\mur.jpg");
    caisse = IMG_Load("images\\caisse.jpg");
    caisseOk = IMG_Load("images\\caisse_ok.jpg");
    menu = IMG_Load("images\\menu.jpg");
    objectif = IMG_Load("images\\objectif.png");
}

И назовите это в основном так:

setImages(mur, caisse, caisseOk, menu, objectif);
SDL_BlitSurface(menu, NULL, screen,&posMenu);
SDL_Flip(screen);

Я протестировал, IMG_Load работает правильно, но, похоже, он не инициализирует SDL_Surface за пределами функции. Есть ли способ сделать это? Я предполагаю, что должен быть способ правильно инициализировать весь мой SDL_Surface за пределами основного...

Точно так же, если я делаю SDL_Init() и SDL_SetVideoMode() в функцию, мой экран также не будет инициализирован, я полагаю? Вот моя функция:

void initVideo(SDL_Surface* screen)
{
    if(SDL_Init(SDL_INIT_VIDEO) <0)
    {
        fprintf(stderr,"Erreur lors de l'initialisation video : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    screen = SDL_SetVideoMode(640,420,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
    if(screen == NULL)
    {
        fprintf(stderr,"Erreur lors de la configuration video : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }
}

И мой звонок в основной:

SDL_Surface *screen = NULL, *menu = NULL, *marioH = NULL, *marioD = NULL, *marioB = NULL, *marioG = NULL,
                *caisse = NULL, *caisseOk = NULL, *objectif = NULL, *mur = NULL;

    SDL_Rect posMenu, posMario;

    initVideo(screen);

Ничто не посылает мне ошибку, но ничего не происходит. И единственное, что я нашел в сети, было: "Почему ты хочешь это делать? Это бесполезно". Это правильно?

1 ответ

Решение

C использует передачу по значению для передачи аргумента функции.

Похоже, твой setImages() Функция изменяет указатели аргумента сама.

внутри setImages() Функция позволяет изменять значения, указанные указателями, а не самими указателями. После возвращения в main()Ваши указатели остаются неизменными [неинициализированными, если были до вызова].

Для достижения желаемой функциональности вам нужно передать указатель на эти указатели [ адрес этих указателей] из вашего main(),

Например, вы можете изменить свой setImages() функция к

void setImages(SDL_Surface** mur, SDL_Surface** caisse, SDL_Surface** caisseOk, SDL_Surface** menu, SDL_Surface** objectif)
{
           //put some NULL check for sanity

    *mur = IMG_Load("images\\mur.jpg");
    *caisse = IMG_Load("images\\caisse.jpg");
   .
   .
}

и позвонить из main() лайк

setImages(&mur, &caisse, &caisseOk, &menu, &objectif);
Другие вопросы по тегам