Probleme de developpement c

Résolu/Fermé
hadrien.costa-robert - 2 oct. 2021 à 11:53
 hadrien.costa-robert - 5 oct. 2021 à 17:29
Bonjour,
Je vient vous poser une question portant sur le developpement c avec SDL2
En effet apres avoir codé cette fonction mon programme compile mais crache lorsque je le lance
fonction :

void InitSDL(App app)
{
if (SDL_Init(SDL_INIT_VIDEO) != 0)
SDL_ExitWithError("impossible d'initialiser la bibliotheque SDL2");
printf("L'initialisation de la bibliotheque SDL2 est une reussite !\n");

app->window = NULL;
app->window = SDL_CreateWindow("SDL2",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
SDL_SCREEN_WIDTH,
SDL_SCREEN_HEIGHT, 0);
if (app->window == NULL)
SDL_ExitWithError("impossible de generer la fenetre SDL2");
printf("La generation de la fenetre SDL2 est une reussite !\n");

app->renderer = NULL;
app->renderer = SDL_CreateRenderer(app->window, -1, SDL_RENDERER_SOFTWARE);
if (app->renderer == NULL)
{
SDL_DestroyWindow(app->window);
SDL_ExitWithError("impossible de generer le rendu SDL2");
}
printf("La generation du rendu SDL2 est une reussite !\n");

return;
}

Quellqu'un pourrait t-il m'aider ?


Configuration: Windows / Chrome 94.0.4606.61
A voir également:

5 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
2 oct. 2021 à 12:29
Bonjour,

Une information importante qui manque est : qu'est-ce qu'il y a lors de l'appel à
InitSDL(&app)
?
0
hadrien.costa-robert
2 oct. 2021 à 14:10
la structure est :
typedef struct Application
{
SDL_Window *window;
SDL_Renderer *renderer;
} Application *App;

L'appel de la fonction est:
App app;
InitSDL(app);
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
2 oct. 2021 à 20:37
App
est un pointeur. Tu passes donc un pointeur non initialisé à ta fonction! Le compilateur a du s'étouffer! As-tu lu les warnings?
Le code devrait être:
struct Application  app;
InitSDL( &app );

ou à la rigueur:
App  app = malloc( sizeof(*app) );
InitSDL( app );
0
hadrien.costa-robert
3 oct. 2021 à 15:09
Hey meci pour ta rapidité de reponse.
J'ai recodé mon programme plus proprement et appliqué ta technique.
Elle regle en effet le probleme mais en crée malhereusement un autre.
Maintenant mon code ressemble a ca :
fonction.c
void InitSDL(App app)
{
if (SDL_Init(SDL_INIT_VIDEO) != 0)
SDL_ExitWithError("impossible d'initialiser la bibliotheque SDL2");
printf("L'initialisation de la bibliotheque SDL2 est une reussite !\n");

app.window = NULL;
app.window = SDL_CreateWindow("SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SDL_SCREEN_WIDTH, SDL_SCREEN_HEIGHT, 0);
if (app.window == NULL)
SDL_ExitWithError("impossible de generer la fenetre SDL2");
printf("La generation de la fenetre SDL2 est une resussite !\n");

app.renderer = NULL;
app.renderer = SDL_CreateRenderer(app.window, -1, SDL_RENDERER_SOFTWARE);
if (app.renderer == NULL)
{
SDL_DestroyWindow(app.window);
SDL_ExitWithError("impossible de generer le rendu SDL2");
}
printf("La generation du rendu SDL2 est une reussite !\n");

return;
}

main.c
int main(int argc, char **argv)
{
struct App app;
InitSDL(&app);

while (1)
{
SDL_prepareScene(&app);
SDL_doInput();
SDL_presentScene(&app);
SDL_Delay(16);
}

SDL_CleanApp(&app);
SDL_Quit();
return 1;
}


ERROR:
error: storage size of 'app' isn't known
5 | struct App app
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 5 oct. 2021 à 14:05
Salut hadrien.costa-robert, et salut Dalfab :-)

Tu as ce message d'erreur car
struct App
n'est pas un type connu.

typedef struct Application
{
    SDL_Window *window;
    SDL_Renderer *renderer;
} Application *App;


Si je lis bien ce code complexe, celui-ci contient :
  • une définition d'une struct dont l'étiquette est Application
  • une définition d'un alias de type avec typedef indiquant que
    struct Application
    peut aussi être appelée Application
  • une tentative de déclaration d'un pointeur sur ce type avec une variable pointeur qui s'appelle App


Cette dernière tentative ne fonctionne pas chez moi et donne ceci :

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
} Application *App;


Rectifie ton type en :

typedef struct Application
{
    SDL_Window *window;
    SDL_Renderer *renderer;
} Application;


Ensuite, dans ton main, déclare ta variable pointeur et initialise le. Tu dois initialiser la variable pointeur en lui affectant une adresse mémoire d'un stockage où les informations que tu veux y stocker pourront l'être.

quelque chose comme :

int main(int argc, char **argv)
{
 Application * App;
 App = malloc(sizeof(Application));
 InitSDL(App);
(...)


ou alors :


int main(int argc, char **argv)
{
 Application App;
 InitSDL(&App);
(...)


Vu que tu passes (dois passer) un pointeur sur
struct Application
(ou un pointeur sur le type
Application
qui est juste son alias), le prototype de ta fonction personnelle d'initialisation devrait être :

void InitSDL(Application * app)


et le code dans ta fonction devrait accéder aux membres de la struct avec
->
et non pas
.
, puisque c'est un pointeur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hadrien.costa-robert
5 oct. 2021 à 17:29
Ok merci beaucoup pour cette reponse complexe et bien expliquer.
Ca ma permit de regler le probléme !
0