Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1525 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Interface C/Ada + SDL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Interface C/Ada + SDL

n°1872532
exeed
Posté le 13-04-2009 à 20:56:27  profilanswer
 

Bonjour à tous,
 
Dans le cadre d'un projet scolaire je dois programmer un petit jeu en ADA.  
Il se trouve que j'aimerais faire une interface graphique en SDL.
J'ai donc essayé AdaSDL dispo sur les serveurs de l'ensimag mais elle ne comporte beaucoup de fonctions, c'est pourquoi j'ai décidé d'essayer de faire l'interfaçage en C et Ada moi même.
 
ALors voila comment je fais, (suivant un cours trouvé sur le net: http://doc.ubuntu-fr.org/sdl)
 
Je veux appeler du C a partir d'ADa donc je ne crée pas de main() en C sinon erreur de compilation (testée :) )
 
Voici mon code C:

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4. void pause()
  5. {
  6.     int continuer = 1;
  7.     SDL_Event event;
  8.     while (continuer)
  9.     {
  10.         SDL_WaitEvent(&event);
  11.         switch(event.type)
  12.         {
  13.             case SDL_QUIT:
  14.                 continuer = 0;
  15.         }
  16.     }
  17. }
  18. int main_c(int argumentc)
  19. {
  20.     SDL_Init(SDL_INIT_VIDEO);
  21.     SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
  22.     pause();
  23.     SDL_Quit();
  24.     return EXIT_SUCCESS;
  25. }


 
Et voici le code ada :  
 

Code :
  1. with ada.text_io, Ada.integer_text_io, Interfaces.C;
  2. use ada.text_io, Ada.integer_text_io, Interfaces.C;
  3. procedure essaiADA is
  4. function appel_c(input: integer)  return integer;
  5. pragma import(C, appel_c, "main_c" );
  6. result: integer;
  7. begin
  8. result:=appel_c(0);
  9. put(result);
  10. end essaiADA;


 
Au niveau de la syntaxe normalement il n'y a pas de problèmes ayant testé avec une fonction sans appel de fonctions SDL (est ce bien clair ... : :heink: )
 
Ensuite il faut que je cree le fichier objet du prog en C et que je compile mon .adb avec le .o , voici les lignes de commandes:

Code :
  1. gcc -g -c codec.c
  2. gnatmake -gnatf codeada.adb -cargs -g -largs -g codec.o


Et bam erreur de compilation, evidemment SDL pose un probleme.  
J'ai donc fait un autre essai (avec une ligne piquée sur doc.ubuntu-fr.org/sdl)

Code :
  1. gcc `sdl-config --cflags --libs` -g -c codec.c
  2. gnatmake -gnatf codeada.adb -cargs -g -largs -g codec.o


Voici les erreurs de compilation que j'obtiens: (aucun message quoi que je fasse a la création du .o en C)
 
 

Code :
  1. gnatmake -gnatf essaiAda.adb -cargs -g -largs -g codeC.o
  2. codec.o: In function `pause':
  3. codeC.c:20: undefined reference to `SDL_WaitEvent'
  4. codeC.o: In function `main_c':
  5. codeC.c:32: undefined reference to `SDL_Init'
  6. codeC.c:34: undefined reference to `SDL_SetVideoMode'
  7. codeC.c:38: undefined reference to `SDL_Quit'
  8. collect2: ld a retourné 1 code d'état d'exécution
  9. gnatlink: error when calling /usr/bin/gcc-4.3
  10. gnatmake: *** link failed.


 
En fait je crois que je ne comprend rien a la compilation.
 
Quelqu'un est il en mesure de m'aider ?  
 
Merci


Message édité par exeed le 13-04-2009 à 21:00:40
mood
Publicité
Posté le 13-04-2009 à 20:56:27  profilanswer
 

n°1872561
Elmoricq
Modérateur
Posté le 13-04-2009 à 23:16:10  profilanswer
 

-l<les bibliothèques SDL à inclure> ?

n°1872562
exeed
Posté le 13-04-2009 à 23:21:30  profilanswer
 

mais si il manque des librairies a la compilation du code C, ne devrait il pas y avoir une erreur ?

Message cité 1 fois
Message édité par exeed le 13-04-2009 à 23:23:55
n°1872565
exeed
Posté le 13-04-2009 à 23:30:23  profilanswer
 

bon j'ai trouvé quelque chose,
Si je mets une fonction main (une vraie) et que j'essaye de compiler pour de "vrai" (cad pas juste un fichier objet) ça fonctionne (j'ai un exécutable), cependant si je ne met pas de fonction main ça ne compile pas.  
 
Donc peut être qu'il ne crée pas correctement le fichier objet car bug a la compilation. (pas de main)
 
Qu'en pensez vous ? Que faire ?


Message édité par exeed le 13-04-2009 à 23:46:36
n°1872766
Elmoricq
Modérateur
Posté le 14-04-2009 à 13:08:52  profilanswer
 

exeed a écrit :

mais si il manque des librairies a la compilation du code C, ne devrait il pas y avoir une erreur ?


Non. Par définition, la compilation ne fait pas d'édition de lien, tout ce dont le compilateur a besoin ce sont les fichiers #include pour avoir la définition des symboles.


Message édité par Elmoricq le 14-04-2009 à 13:09:06
n°1873219
exeed
Posté le 15-04-2009 à 11:42:06  profilanswer
 

D'accord et qu'entends tu par les bibliothèques SDL ? Pendant la compilation du C ou de l'Ada ?

n°1873243
Elmoricq
Modérateur
Posté le 15-04-2009 à 12:08:02  profilanswer
 

Les bibliothèques qui contiennent les symboles SDL_* qu'il te manque au link.

 

Par ailleurs, il faut distinguer deux étapes lors de la construction d'un livrable.
En très gros :
1. compilation (génération d'un .o) => transformation d'un code source en objet utilisable par le l'éditeur de lien
2. édition de lien => transforme des objets en binaire compréhensible par l'OS.

 

Lors de la compilation, le compilo se moque de ne pas trouver les symboles, tout ce dont il a besoin c'est de leur définition pour pouvoir construire ses fichiers .o. Ces symboles sont définis dans les fichiers include (les .h)
Par contre, l'éditeur de lien, lui, a besoin de la présence physique des fonctions utilisées : c'est la résolution de noms.
D'où l'utilisation de l'option "-l" pour lui indiquer le ou les bibliothèques à prendre en compte pour l'édition de lien.


Message édité par Elmoricq le 15-04-2009 à 12:08:38
n°1873259
exeed
Posté le 15-04-2009 à 12:38:48  profilanswer
 

Ok merci ça fonctionne.  
 
J'ai d'abord mis cela:  
 

Code :
  1. gnatmake -gnatf essaiAda.adb -cargs -g -largs -lSDL -lSDLmain -g codeC.o


Mais en fait gnatlink ne prenait pas en compte les librairies (surement une erreur d'écriture de ma part) donc j'ai fait pas a pas:

Code :
  1. gnatbind -x essaiAda.ali


puis  

Code :
  1. gnatlink -lSDL -lSDLmain essaiAda.ali -g essaiC.o


 
Voila, merci Elmoricq, je pense que j'aurais bientôt d'autres questions.


Message édité par exeed le 15-04-2009 à 12:39:12
n°1874651
exeed
Posté le 18-04-2009 à 13:01:48  profilanswer
 

Nouvelle question :
 
Est ce possible d'avoir un programme dans lequel du C appelle de l'Ada et de l'Ada appelle du C ?  
 
Le probleme a mon avis se situe (encore) a la compilation.  
Les différentes instructions de compilation pour les deux cas sont a la page 15 et 18 du document suivant :
http://www.cours.polymtl.ca/inf630 [...] l/pres.pdf
 
Est ce possible de mixer les deux ?  
 
Merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Interface C/Ada + SDL

 

Sujets relatifs
[C#] aide sur un regex.[C] Comment éviter les warnings pour "déclaration implicite de"
pointeur et fonction langage Cexercice pointeur et fonction langage C
exercice pointeur et fonction langage CC++ et pointeurs, problème pour désalouer...
[C] Initialisation d'un tableau constant[C] Parser un fichier texte
[C - librairie Gtk] mettre en place une GtkListStore 
Plus de sujets relatifs à : Interface C/Ada + SDL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR