invalid preprocessing directive #p

invalid preprocessing directive #p - C++ - Programmation

Marsh Posté le 18-04-2003 à 20:09:00    

void inserer (int x) {
 printf("Veuillez saisir une liste de valeurs au clavier\n" )
 scanf("%d", &x);
 while (x != -1) {
  inserer (x)
  scanf("%d", &x)
  }
 }
 
 
int sortir (int *p) {
 printf("La liste triee obtenue est\n" )
 while (p != 0) {
  sortir (&p)
  printf("%d", p)
 }
 
int main ()
 {int x;
         int p;
 inserer (x);
 sortir (*p)}
 
 
j aimerais savoir si mon main est correct, vu le reste du prog


Message édité par theorie du chaos le 22-04-2003 à 19:14:47
Reply

Marsh Posté le 18-04-2003 à 20:09:00   

Reply

Marsh Posté le 18-04-2003 à 20:12:03    

de l'interet du x en paramètre?
 
p != 0) ? tu veux dire NULL ou *p!=0 ??

Reply

Marsh Posté le 18-04-2003 à 20:14:14    

Code :
  1. ...
  2. int p;
  3. ...
  4. sortir (*p)

Comment tu peux déréférencer p qui n'est qu'un entier :??:

Reply

Marsh Posté le 18-04-2003 à 20:15:06    

sinon, un compilo ça peut servir aussi :ange:

Reply

Marsh Posté le 18-04-2003 à 20:16:16    

je voudrais dire
 
valeur stockee a l adresse p non nulle

Reply

Marsh Posté le 18-04-2003 à 20:16:18    

Ton code en plus jolie :

Code :
  1. void inserer (int x)
  2. {
  3.     printf("Veuillez saisir une liste de valeurs au clavier\n" )
  4.     scanf("%d", &x);
  5.     while (x != -1)
  6.     {
  7.         inserer (x)
  8.         scanf("%d", &x)
  9.     }
  10. }
  11. int sortir (int *p)
  12. {
  13.     printf("La liste triee obtenue est\n" )
  14.     while (p != 0)
  15.     {
  16.         sortir (&p) ;
  17.         printf("%d", p) ;
  18.     }
  19. }
  20. int main ()
  21. {
  22.     int x;
  23.     int p;
  24.     inserer (x);
  25.     sortir (*p) ;
  26. }


Juste pour ton main, au niveau semantique de reference, il y un petit problème.
Tu declare p en entier, et tu dois passer un pointeur sur entier a sortir, donc la syntaxe est sortir (&p).
Après, le tout me parait louche, je vois pas bien, c'est peut être normal...

Reply

Marsh Posté le 18-04-2003 à 20:17:11    

Theorie du chaos a écrit :


 
void inserer (int x) {
 printf("Veuillez saisir une liste de valeurs au clavier\n" )
 scanf("%d", &x);
 while (x != -1) {
  inserer (x)
  scanf("%d", &x)
  }
 }
 


 
C'est quoi l'interet de la recursion dans ce cas ?


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 18-04-2003 à 20:18:40    

Je te conseille de faire le tout en itératif, ils ont du t'apprendre a programmer en recursif sous Ada dans ton école nan ?

Reply

Marsh Posté le 18-04-2003 à 20:18:46    

le compilo m aidera pas...
notre prof de logiciel de base nous a "explique" le C pendant 3 heures...
et on est censes pouvoir programmer :D
 
je v chercher un cours...

Reply

Marsh Posté le 18-04-2003 à 20:21:35    

inserer et sortir sont fournis par mon prof en "pseudo C"
je peux pas trop y toucher (a part pour les fautes de syntaxe)

Reply

Marsh Posté le 18-04-2003 à 20:21:35   

Reply

Marsh Posté le 18-04-2003 à 20:22:27    

Tetragrammaton IHVH a écrit :


 
C'est quoi l'interet de la recursion dans ce cas ?

ca appelle un programme en assembleur...
faut il differencier les noms?

Reply

Marsh Posté le 18-04-2003 à 20:24:50    

Theorie du chaos a écrit :

ca appelle un programme en assembleur...
faut il differencier les noms?


 
Bah oui [:spamafote]


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 18-04-2003 à 20:30:21    

new version
 
void insere (int x) {
 printf("Veuillez saisir une liste de valeurs au clavier\n" )
 scanf("%d", &x);
 while (x != -1) {
  inserer (x)
  scanf("%d", &x)
  }
 }
 
 
int sort (int *p) {
 printf("La liste triee obtenue est\n" )
 while (p != 0) {
  sortir (&p)
  printf("%d", p)
 }
 
int main ()
 {int x;
 int *p;
 insere (x);
 sort (&p)}
 
 
Comment je fais pour designer la valeur a l adresse p?

Reply

Marsh Posté le 18-04-2003 à 20:40:19    

Theorie du chaos a écrit :


 
Comment je fais pour designer la valeur a l adresse p?


 
int entier; // un entier
int* ptr;  // un pointeur sur un entier (non initialisé)
ptr = &entier;  // ptr pointe sur un entier
*ptr = 3;   // affecte la valeur pointée par ptr
 
Au final entier contient 3


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 18-04-2003 à 20:48:15    

merci :)
 
autre question
 
je programme sortir en assembleur...
il rend un de ses resultats dans eax
 
comment je fais pour designer et utiliser eax dans le programme en C?

Reply

Marsh Posté le 18-04-2003 à 20:48:38    

A propos :

Code :
  1. sort (&p)


 
plantera à la compil puisque tu lui passes un int** alors que le proto de la fonction sort() est défini comme  

Code :
  1. sort(int*)


 
En gros ça veut rien dire.


Message édité par Tetragrammaton IHVH le 18-04-2003 à 20:49:02

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 18-04-2003 à 20:51:58    

Theorie du chaos a écrit :

merci :)
 
autre question
 
je programme sortir en assembleur...
il rend un de ses resultats dans eax
 
comment je fais pour designer et utiliser eax dans le programme en C?


 
oula, tu te mets à la programmation ASM alors que tu connais à peine le C ?  :heink:  
Tu as 2 solutions:
* push sur la stack de eax et tu déclares l'import de la fonction avec une valeur de retour de type long int
* tu codes ta fonction en ASM dans le programmes C avec les mots clé asm {}
 


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 18-04-2003 à 20:54:34    

en fait on a deja rendu un tp uniquement en assembleur

Reply

Marsh Posté le 18-04-2003 à 20:56:33    

vu le sujet c est la solution 1 ...
 
je vais en rever cette nuit de ce TP :d

Reply

Marsh Posté le 18-04-2003 à 21:23:15    

apres mure reflexion...
je passe a ca...
 
int main (){
 printf("Veuillez saisir une liste de valeurs au clavier\n" )
 scanf("%d", &x);
 while (x != -1) {
  inserer (x)
  scanf("%d", &x)
  };  
 int a = 1; /*eax, liste non vide au debut*/
 printf("La liste triee obtenue est\n" )
 while (a != 0) {
  sortir (&x)
  printf("%d", x)
  a = eax
  }
 }
 
en sachant que pour le eax c faux... mais bon
on y va doucement :D

Reply

Marsh Posté le 19-04-2003 à 11:00:57    

une fonction peut elle renvoyer plusieurs resultats?
 
sortir me renvoit une adresse et modifie un resultat dans eax
 
ou alors on peut declarer l import d une variable?
 
de la facon
 
 
long int fin_de_liste

Reply

Marsh Posté le 19-04-2003 à 13:54:34    

Theorie du chaos a écrit :

vu le sujet c est la solution 1 ...
 
je vais en rever cette nuit de ce TP :d


Sous visual (a conformer pour els autres compilo) :
 
fonction retourne un entier : resultat dans EAX
fonction retourne un flottant : st(0)
fonction retourne une struct de 8octets: resultat dans EDX:EAX
fonction retourne une struct de + de 8 octets : merdique on va laisser ca de coté:D
 
Donc comme toi tu tombe dans la premiere catégorie a priori t'aurais rien a faire, appelle juste ta fonction asm et zou. Par contre fait gaffe au convention d'apelle si ta fonction prends des params en entrée
 
eg : ta fonction prends des params via la pile et effectue le nettoage de la pile avant de sortir : _stdcall
ta fonction prends des params en entrée via la pile mais ne fait aucune nettoyage : _cdecl
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 19-04-2003 à 13:56:42    

Theorie du chaos a écrit :

une fonction peut elle renvoyer plusieurs resultats?
 
sortir me renvoit une adresse et modifie un resultat dans eax
 
ou alors on peut declarer l import d une variable?
 
de la facon
 
 
long int fin_de_liste


 
une fonction en peut retourner qu'un seul element (int/float, structure.....) par "return"
 
Si jamais tu as besoin de renvoyer plusieurs valeur alors il te faut passer par ls params out/inout
 
en c pour faire ca t'as besoins des pointeurs (la hantise du debutant), t'as vu ca en cours ?
 
 
 
 

Reply

Marsh Posté le 19-04-2003 à 15:03:05    

j ai pas vu in out en C :/
 
en fait mon prog "sortir" en assembleur met un entier a l adresse x et modifie eax
 
s il est declare en  
int sortir (int *p);
 
c est possible de recupere eax et l entier?

Reply

Marsh Posté le 19-04-2003 à 15:03:22    

j ai pas vu in out en C :/
 
en fait mon prog "sortir" en assembleur met un entier a l adresse x et modifie eax
 
s il est declare en  
int sortir (int *p);
 
c est possible de recupere eax et l entier?

Reply

Marsh Posté le 19-04-2003 à 15:08:57    

comment je fais pour recuperer les parametre du programe C dans mon prog assembleur
pour inserer (x) par exemple...
 
est ce que le x est mis dans la pile?

Reply

Marsh Posté le 19-04-2003 à 15:46:16    

yep, les parametres sont empilé de droite a gauche

Reply

Marsh Posté le 19-04-2003 à 15:48:07    

Theorie du chaos a écrit :

j ai pas vu in out en C :/
 
en fait mon prog "sortir" en assembleur met un entier a l adresse x et modifie eax
 
s il est declare en  
int sortir (int *p);
 
c est possible de recupere eax et l entier?


 
modifie eax, ca veut dire quoi ? il ecrit dans eax et tu aimeras recup cette valeur en C ? ca oui c possible


Message édité par chrisbk le 19-04-2003 à 15:48:39
Reply

Marsh Posté le 19-04-2003 à 16:07:05    

chrisbk a écrit :


 
modifie eax, ca veut dire quoi ? il ecrit dans eax et tu aimeras recup cette valeur en C ? ca oui c possible

comment? :love: :love:
 
declaration de variable globale?

Reply

Marsh Posté le 19-04-2003 à 16:13:33    

Theorie du chaos a écrit :

comment? :love: :love:
 
declaration de variable globale?


 
non  
le compilo s'attends a recevoir le resultat de ton operation sur EAX. Donc si tu ecris sur eax, tu quitte ta fonction, le prog c revenant ira piocher le resultat dans eax
 

Reply

Marsh Posté le 19-04-2003 à 16:15:30    

si je mets ca:


void main (){
 int eax ;
 printf("Veuillez saisir une liste de valeurs au clavier.\n
  Chaque valeur doit etre inferieure a 2^31-1." );
 scanf("%d", &x);
 while (x != -1) {
  inserer (x)
  scanf("%d", &x)
  };  
 eax = 1 /*eax, liste non vide au debut*/
 printf("La liste triee obtenue est\n" )
 while (eax != 0) {
  eax = sortir (&x)
  printf("%d\n", x)
  }

 
 
c est bon?

Reply

Marsh Posté le 19-04-2003 à 16:17:34    

theoriquement oui ;)

Reply

Marsh Posté le 19-04-2003 à 16:18:22    

merci :)

Reply

Marsh Posté le 19-04-2003 à 17:06:56    

est ce qu il faut un main dans le programme assembleur contenant inserer et sortir?
 
inserer et sortir doivent-ils etre dans deux fichiers differents?
 
que mettre dans le main pour utiliser les parametres donnes dans le programme C avec sortir et inserer?
 
mon main du moment...
 
main:
 pushl %ebp
 movl %esp,  %ebp
 call inserer
 addl $4,  %esp
 call sortir
 addl $4,  %esp
 jmp fin
 
y a pas de parametres :cry:

Reply

Marsh Posté le 19-04-2003 à 17:08:59    

hola, alors a partir de maintenant c merdique en diable, et la fo qu'un specialiste du gcc vienne t'aider. fo compiler tes .asm en .obj (ou equivalent) et les utiliser pour le link....
Sous vc je peux te dire comment, mais sous gcc aucune idée

Reply

Marsh Posté le 19-04-2003 à 17:10:27    

j ai les commandes d assemblage et de compilation

Reply

Marsh Posté le 19-04-2003 à 17:11:02    

et il faut un main dans le prog asm?

Reply

Marsh Posté le 19-04-2003 à 17:11:25    

ben tu convertis tes asm en obj par la commande ad hoc et tu link avec. Neanmoins faudra ptet changer le nom de ets fonctions asm (eg rajouter un "_" devant)
 
un main dans la partie asm ? pkoi faire ?
tes trucs asm, c juste des fonctions que tu appelle depuis le C, non ?


Message édité par chrisbk le 19-04-2003 à 17:11:53
Reply

Marsh Posté le 19-04-2003 à 17:12:56    

chrisbk a écrit :

ben tu convertis tes asm en obj par la commande ad hoc et tu link avec. Neanmoins faudra ptet changer le nom de ets fonctions asm (eg rajouter un "_" devant)
 
un main dans la partie asm ? pkoi faire ?
tes trucs asm, c juste des fonctions que tu appelle depuis le C, non ?

oui :)

Reply

Marsh Posté le 19-04-2003 à 17:15:22    


 
alors tout va bien ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed