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 :

Problème avec un fonction qui modifis un tableau à l'aide d'un pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut Problème avec un fonction qui modifis un tableau à l'aide d'un pointeur
    Bonjour tout le monde,

    Je veut faire un fonction qui modifis un tableau de char.
    Le tableau de char est déclaré dans la fonction WinMain, et la fonction est écrite dans un autre fichier que celui dans lequel est WinMain.
    J'ai donc essayé en envoyant l'adresse du tableau à la fonction puis de bosser avec les pointeurs dans la fonction, mais ça ne marche pas ... :

    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
     
    // La déclaration du tableau et l'appel de ma fonction dans WinMain :
     
        char listeLecteurs[27]={0};
     
        ListeLecteurs(LireValeur(), &listeLecteurs);
     
    // La fonction en question :
     
    void ListeLecteurs (int valeurRegistre, char *pointeur)
    {
            [...]
                    ++*pointeur[0];
            [...]
    }
    Donc, quand je veut faire une opération sur le tableau, le compilateur renvois :
    - dans la fonction : error: invalid type argument of `unary *'
    - dans le WinMain : error: cannot convert `char (*)[27]' to `char*' for argument `2' to `void ListeLecteurs(int, char*)'

    Quelle est mon erreur ?

    Merci.
    A+, Pierre.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    L'étoile devant pointeur[0] est de trop.
    Le & devant ListeLecteurs est de trop.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut
    Merci Médinoc.

    Pour l'adresse du tableau j'avais oublié que son nom pointais à l'adresse de la première valeur ... par contre, pour l'étoile, je ne comprend pas, normalement, pour accéder à la valeur à partir du pointeur, c'est bien *nomDuPointeur=.....; ? ou c'est différent parce que dans ce cas c'est un tableau ?

    Enfin, en appliquant les modifications que tu m'a dis, il ne veut pas compiler et ne renvoit pas d'erreur ni de warnings, voilà le log :
    Linking executable: .\Cache lecteur 2.exe
    obj\fonctions.o:fonctions.cpp: (.text+0x0): multiple definition of `LireValeur()'
    obj\main.o:main.cpp: (.text+0x0): first defined here
    obj\fonctions.o:fonctions.cpp: (.text+0x110): multiple definition of `ListeLecteurs(int, char*)'
    obj\main.o:main.cpp: (.text+0x110): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings

    Merci.
    A+, Pierre.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut
    Je viens de rajouter l'option "Produce debuging symbols" (-g) au compilateur, et maintenant il me donne des précisions sur l'erreur :

    D:\Fichiers\Programation C-C++\C\Cache lecteur 2\fonctions.cpp:6: multiple definition of `LireValeur()'
    obj\main.o: D:\Fichiers\Programation C-C++\C\Cache lecteur 2\fonctions.cpp:6: first defined here
    D:\Fichiers\Programation C-C++\C\Cache lecteur 2\fonctions.cpp:34: multiple definition of `ListeLecteurs(int, char*)'
    obj\main.o: D:\Fichiers\Programation C-C++\C\Cache lecteur 2\fonctions.cpp:34: first defined here
    :: === Build finished: 4 errors, 0 warnings ===

    Donc apparament, ce qui ne va pas c'est que j'aurais définis plusieurs fois les deux fonction ... Je ne vois pas d'où ça peut venir, j'ai inclus le fichier qui contient les fonctions dans celui où il y a la WinMain avec #include "fonctions.cpp", il n'y a qu'un fonction avec le même nom, et j'ai mis ça pour voir si il essayais de l'inclure plusieurs fois :
    #ifndef ABCD
    #define ABCD
    [les fonctions]
    #endif

    Donc, je ne vois pas d'où ça peut venir ... vous avez une idée ?

    Merci.
    A+, Pierre.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    #include "fonctions.cpp",
    C'est à éviter absolument.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut
    OK, merci pour ces réponses.

    Je savais bien qu'au niveau des inclusion il y a quelques notions que je n'ai pas.
    Dans les cours que j'ai lus ce point particulier n'est j'amais détaillé, donc pouvez vous m'expliquer le principe ?

    On inclus pas de .cpp, donc dans main.cpp on inclus par exemple fonctions.h et dans fonctions.h on inclus fonctions.cpp ?

    Mais, c'est plutôt une règle que tout le monde se fixe, je ne pense pas que ça influs sur quelque chose à la compilation, exacte ?
    Dans mon cas, j'inclus fonctions.cpp avant WinMain, donc pas besoin de déclarer mes fonctions, donc pas théoriquement pas besoin de .h, même si apparament c'est comme ça que ça se fait, exacte ?

    Sinon, pour l'extension .c ou .cpp, le compilateur choisis entre compiler en C ou en C++ seulement en fonction de l'extension ?

    Pour diagnostiquer mon problème de définition mutliple, vous voulez le code source entier ?

    Merci beaucoup.
    Pierre.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Pierre.g
    Pour l'adresse du tableau j'avais oublié que son nom pointais à l'adresse de la première valeur ... par contre, pour l'étoile, je ne comprend pas, normalement, pour accéder à la valeur à partir du pointeur, c'est bien *nomDuPointeur=.....; ? ou c'est différent parce que dans ce cas c'est un tableau ?
    Le paramètre est de type pointeur. Il permet d'accéder à la donnée soit avec *, soit avec des [], mais pas les deux !
    Enfin, en appliquant les modifications que tu m'a dis, il ne veut pas compiler et ne renvoit pas d'erreur ni de warnings, voilà le log :
    Linking executable: .\Cache lecteur 2.exe
    obj\fonctions.o:fonctions.cpp: (.text+0x0): multiple definition of `LireValeur()'
    obj\main.o:main.cpp: (.text+0x0): first defined here
    obj\fonctions.o:fonctions.cpp: (.text+0x110): multiple definition of `ListeLecteurs(int, char*)'
    obj\main.o:main.cpp: (.text+0x110): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Les fonctions sont définies plusieurs fois, ou inclues plusieurs fois. Montre tout ton code.

    Rappel :
    • Pour compiler en C, l'extension des sources est .c et non .cpp.
    • On n'inclue pas de .c
    • On ne définit pas de fonctions dans un .h

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/12/2013, 22h17
  2. [XL-2007] Problème avec la fonction Split et un tableau
    Par flo1411 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 15/04/2013, 09h56
  3. problème avec une fonction qui affiche une page blanche
    Par piotrowski-s dans le forum Langage
    Réponses: 3
    Dernier message: 16/11/2012, 18h25
  4. [GD] Problème avec des fonctions qui créent des éléments dans une image.
    Par magnus2229 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 13/07/2011, 09h38
  5. Problème avec une fonction qui supprime un dossier
    Par Mo_Poly dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2008, 18h39

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