erreur non comprise

erreur non comprise - C - Programmation

Marsh Posté le 19-10-2013 à 10:04:07    

Bonjour, je suis débutant en C, et  j'ai voulu crée un programme qui fait  une copie d'un tableau d'entier de taille N vers un autre, pour cela , j'ai crée 4 fonctions: fonction.h  fonction.c   le Makefile et  main.c , dont les voici  .Mais ,à chaque fois que je compile, le compilateur m'affiche :
Pour le Makefile

Code :
  1. exe :main.o fonction.o
  2. gcc -o exe main.o fonction.o -Wall -lm
  3. fonction.o:fonction.c
  4. gcc -c fonction.c
  5. main.o :main.c fonction.h
  6. gcc -c main.c
  7. clean:
  8. rm *.o exe


 
Pour la fonction :"fonction.h"

Code :
  1. #ifndef fonction_h
  2. #define fonction_h
  3. int taille(char *s);
  4. int *initTAB(int n);
  5. int copie(int *tab,int N);
  6. #endif


 
 
Pour la fonction :"fonction.c"
 

Code :
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<string.h>
  5. int copie(int *tab,int N)
  6. {
  7.  int *t=(int*)malloc(N*sizeof(int)); // c'est ce talbeau qui sera en "return"!!
  8.  int k;// l'incrementation
  9.  for (k=0;k<N;k++)
  10.  {
  11.  *(t+k)=*(tab+k);
  12.  }
  13.  return(t); //     t, c'est le tableau retourné
  14. }


 
Et quand je compile( sous geany, avant de de le "make" ), il m'affiche cet avertissement:

Code :
  1. fonction.c:14:3: attention : return makes integer from pointer without a cast [enabled by default]


 
C'est quand je le caste en int  (j'ai pas compris le pourquoi!!) que l'erreur disparait!
 
Idem pour la fonction main.c :

Code :
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include "fonction.h"
  6. int main()
  7. {
  8. int q;
  9.  int n=5;
  10. int *tab;
  11. //tab=initTAB(n);
  12. int source[5]={6,5,4,3,2};
  13. tab=copie(source,n);
  14. for(q=0;q<n;q++) printf("tab[%d]=%3d\n",q,*(tab+q));
  15. return 0;
  16. }


 
le compilateur me dit:

Code :
  1. main.c:16:5: attention : assignment makes pointer from integer without a cast [enabled by default]


 
Je n'arrive pas à voir d'où provient mon erreur!!


---------------
Mohamed ABDEREMANE
Reply

Marsh Posté le 19-10-2013 à 10:04:07   

Reply

Marsh Posté le 19-10-2013 à 11:27:17    

Bonjour

 

Tout d'abord, vous avez dit que la fonction copie retourne un int et non int*, donc vous ne pouvez pas écrire ensuite :

Code :
  1. int *t=(int*)malloc(N*sizeof(int)); // c'est ce talbeau qui sera en "return"!!


pour corriger cet erreur, vous avez deux choix, soit :

  • copie retournera un tableau de int (int*)
  • ou bien void et elle prendra en argument 3 paramètres : la source, la destination et la taille du tableau.

en retournant un pointeur vers int il faut être prudent quand même pour ne pas tomber dans le cas où vous retournez une adresse locale qui n'est plus "utilisable"  !
Sinon, la façon la plus simple de faire c'est d'utiliser la fonction memcpy comme ceci :

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main() {
  4.     int src[5] = {6, 5, 4, 3, 2}, dest[5];
  5.     memcpy(dest, src, sizeof(dest));
  6.     for (int count = 0; count < 5; count++)
  7.         printf("tab[%d] = %d\n", count, dest[count]);
  8. }

Message cité 1 fois
Message édité par snack3r le 19-10-2013 à 11:52:14

---------------
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
Reply

Marsh Posté le 20-10-2013 à 10:10:30    

Bonjour,
 
  les syntaxes *(tab+k) sont à proscrire car inutilement "obfuscatrice" : la syntaxe tab[k] est bien plus lisible...

Reply

Marsh Posté le 20-10-2013 à 21:17:38    

lavela a écrit :

Code :
  1. int copie(int *tab,int N)
  2. {
  3.      int *t=(int*)malloc(N*sizeof(int)); // c'est ce talbeau qui sera en "return"!!
  4.      int k;// l'incrementation
  5.      for (k=0;k<N;k++)
  6.      {
  7.         *(t+k)=*(tab+k);
  8.      }
  9.      return(t); //     t, c'est le tableau retourné
  10. }


dreameddeath a écrit :

Bonjour,
 
  les syntaxes *(tab+k) sont à proscrire car inutilement "obfuscatrice" : la syntaxe tab[k] est bien plus lisible...



Bonjour
 
Ta fonction "copie" est prévue pour renvoyer un int or elle renvoie "t" qui est un "int étoile". D'ailleurs tu le dis toi-même, tu renvoies le "talbeau". Or un "talbeau" ce n'est pas un int mais une adresse. Dommage que tu aies mis des commentaires sans ensuite en tenir compte...
 
Sinon pour la remarque de dreameddeath c'est exact. Il n'y a absolument aucun avantage à écrire *(t+x) au lieu de t[x]. Je pense que t'as essayé de mettre en application une règle qui dit que passer par un pointeur c'est plus rapide que déréférencer un "talbeau" ; ce qui est vrai à condition alors de passer par un pointeur et non par un calcul
 
Exemple

Code :
  1. int* copie(int *tab,int N)
  2. {
  3.      int *t=(int*)malloc(N*sizeof(int)); // c'est ce talbeau qui sera en "return"!!
  4.      int i;// l'incrementation
  5.      int *src;    // Le pointeur source
  6.      int *dest   // Le pointeur destinataire
  7.      for (i=0, src=tab, dest=t;i<N;i++)
  8.         *dest=(*src);
  9.      return(t); //     t, c'est le tableau retourné
  10. }


Est-ce que tu vois la différence ? Je m'adresse à des pointeurs qui ont la bonne adresse et non à des adresses que je dois calculer à chaque itération...
 

snack3r a écrit :


en retournant un pointeur vers int il faut être prudent quand même pour ne pas tomber dans le cas où vous retournez une adresse locale qui n'est plus "utilisable"  !


Là ça va puisque c'est une adresse allouée. Simplement l'appelant devra prendre soin, lui, de libérer l'allocation une fois qu'il n'en a plus besoin...
 

snack3r a écrit :

Sinon, la façon la plus simple de faire c'est d'utiliser la fonction memcpy comme ceci :


Je pense qu'il veut s'exercer pour apprendre et comprendre et non passer par un outil déjà tout fait...


Message édité par Sve@r le 20-10-2013 à 21:24:00

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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