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

  FORUM HardWare.fr
  Programmation
  C

  erreur non comprise

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

erreur non comprise

n°2207315
lavela
Posté le 19-10-2013 à 10:04:07  profilanswer
 

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
mood
Publicité
Posté le 19-10-2013 à 10:04:07  profilanswer
 

n°2207324
snack3r
Mohamed AHMED
Posté le 19-10-2013 à 11:27:17  profilanswer
 

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
n°2207377
dreameddea​th
Posté le 20-10-2013 à 10:10:30  profilanswer
 

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

n°2207439
Sve@r
Posté le 20-10-2013 à 21:17:38  profilanswer
 

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.

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

  erreur non comprise

 

Sujets relatifs
xls erreur sur code "If Target =" lors d'insertion de lignegestion d erreur, rollback
Erreur 500 NullPointerExceptionerreur MSQL sur mon site
[VBS] Erreur lancement script VBSerreur de segmentation sur matrice
A supprimer : doublonsBoucle while en erreur
PHPExcel erreur ddl client version 
Plus de sujets relatifs à : erreur non comprise


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