IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

erreur non comprise en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Par défaut erreur non comprise en C
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exe :main.o fonction.o
        gcc -o exe main.o fonction.o -Wall -lm
        fonction.o:fonction.c
        gcc -c fonction.c
        main.o :main.c fonction.h
        gcc -c main.c
        clean:
        rm *.o exe




    Pour la fonction :"fonction.h"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      #ifndef fonction_h
        #define fonction_h
        int taille(char *s);
        int *initTAB(int n);
        int copie(int *tab,int N);
        #endif





    Pour la fonction :"fonction.c"

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




    Et quand je compile( sous geany, avant de de le "make" ), il m'affiche cet avertissement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          fonction.c:13: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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     #include<stdio.h>
        #include<math.h>
        #include<stdlib.h>
        #include<string.h>
        #include "fonction.h"
        int main()
        {
        int q;
         int n=5;
        int *tab;
        //tab=initTAB(n);
        int source[5]={6,5,4,3,2};
        tab=copie(source,n);
        for(q=0;q<n;q++) printf("tab[%d]=%3d\n",q,*(tab+q));
        return 0;
        }



    le compilateur me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         main.c:13:5: attention : assignment makes pointer from integer without a cast [enabled by default]

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2009
    Messages : 511
    Par défaut
    Citation Envoyé par lavela Voir le message
    Bonjour, je suis débutant en C,
    Welcome !

    Citation Envoyé par lavela Voir le message
    C'est quand je le caste en int (j'ai pas compris le pourquoi!!) que l'erreur disparait!
    C'est le principe du cast en C, tu indique au compilo qu'il doit forcer la valeur dans le type de destination. Si c'est compatible cela passe à la compil mais cela peut faire une erreur à l'exécution. A manipuler avec précaution.

    Citation Envoyé par lavela Voir le message
    le compilateur me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         main.c:13:5: attention : assignment makes pointer from integer without a cast [enabled by default]
    Il s'agit de l'erreur inverse de la précédente.

    Le problème est que ta fonction est de type int et tu cherche à alimenter un tableau d'entier (int *)
    Ce que tu a fait :
    int * (intérieur) => int (la fonction) => int * (tableau dans le main)

    La première erreur était sur la première affectation, maintenant c'est sur la deuxième.

    Pour que cela soit correct ta fonction doit être tu type que tu souhaiter renvoyer à l'appelant, ici int * (int * Copie au lieu de int Copie)

    ainsi
    int* (corps fonction) => int * laFonction => int * (le main)

    ainsi plus d'erreur.
    Bon courage.

  3. #3
    Membre très actif
    Avatar de Snack3r
    Homme Profil pro
    Doctorant à l'Université Cheikh Anta Diop de Dakar
    Inscrit en
    Octobre 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Doctorant à l'Université Cheikh Anta Diop de Dakar
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 118
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include<stdio.h>
    #include<stdlib.h>
     
    int main() {
        int src[5] = {6, 5, 4, 3, 2}, dest[5];
        memcpy(dest, src, sizeof(dest));
        for (int count = 0; count < 5; count++)
            printf("tab[%d] = %d\n", count, dest[count]);
    }

Discussions similaires

  1. erreur non comprise dans script
    Par lebelfortain1 dans le forum Langage
    Réponses: 7
    Dernier message: 22/06/2011, 15h29
  2. Pb d'affichage.erreur non comprise
    Par l_seringa dans le forum C++Builder
    Réponses: 12
    Dernier message: 28/03/2008, 19h25
  3. Erreur non Comprise
    Par Fahmi06 dans le forum Ubuntu
    Réponses: 1
    Dernier message: 12/03/2008, 17h43
  4. Erreur non comprise
    Par PallBreak dans le forum C++
    Réponses: 5
    Dernier message: 28/02/2008, 17h10
  5. erreur non comprise cherche solution
    Par debC++ dans le forum C++
    Réponses: 12
    Dernier message: 17/06/2005, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo