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 :

Question de débutant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut Question de débutant
    Bonjour,
    je suis un tutoriel pour me former à C et j'ai un souci pour gérer les tableaux. Voila mon code :
    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
    17
    18
    #include <stdio.h>
    #include <stdlib.h>
     
    int sommeTableau(int *tableau, int tailleTableau){
    	int s=0,i=0;
    	for(i=0;i<=tailleTableau;i++) {
    		s=s+tableau[i];
    	}
    	return s;
    }
     
    int main()
    {
    int t[4]={1,2,3},i=0;
    printf("%d\n",sommeTableau(&t,4));
     
    return 0;
    }
    et voila l'erreur quand je compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    main.c: In function ‘main’:
    main.c:15:1: attention : passing argument 1 of ‘sommeTableau’ from incompatible pointer type [enabled by default]
    main.c:4:5: note: expected ‘int *’ but argument is of type ‘int (*)[4]
    C'est où que je me trompe ?
    Merci.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Deux petites remarques :
    • La variable i est non utilisée.
    • Ton initialisation ne comportement que 3 éléments, le 4e sera donc égal à 0.


    Pour ton problème, tu lui donnes &t qui n'est pas de type int*.

    --> t est converti automatiquement en &t[0], donc en pointeur sur int.

    --> il y a la même conversion implicite mais tu utilises en plus l'opérateur & donc tu te retrouves avec l'adresse d'un pointeur.

    Comme t n'est pas un pointeur de type int* mais un tableau de 4 éléments, le warning te dit que tu lui passes un int(*)[4] : pointeur sur tableau de 4 int.

    D'où l'erreur

    Si tu déclares t comme un tableau, je te conseille l'appel suivant pour donner la taille réelle du tableau et non la taille supposée (si tu utilises un vrai pointeur un malloc() puisque tu ne peux pas connaitre la taille allouée à partir du pointeur seul) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sommeTableau(t,sizeof t / sizeof t[0])

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut
    OK, j'ai tout compris.
    La variable i est utilisée pour une boucle et j'ai oublié de l'enlever en isolant ce que je voulais.
    J'ai fait exprès de n'initialiser que 3 valeurs pour "voir".
    Merci pour l'explication.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu peux jeter un oeil ici : http://gradot.wordpress.com/2012/09/...ructures-en-c/

    En gros, si tu as un initialisateur trop court, tout ce qu'il reste est mis à zéro. Si tu n'en as pas, aucune initialisation n'est fait et la mémoire contient des données "poubelles", sauf pour les variables globales qui sont toutes par défaut mise à zéro. C'est valable pour les structures et les tableaux.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut
    Maintenant, j'ai essayé de séparer le code en plusieurs fichiers. Dans mon répertoire, j'ai
    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <stdlib.h>
    #include "tableau.h"
     
    int main()
    {
    int t[4]={1,2,3};
    printf("%d\n",sommeTableau(t,4));
     
    return 0;
    }
    tableau.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    int sommeTableau(int *tableau, int tailleTableau){
    	int s=0,i=0;
    	for(i=0;i<=tailleTableau;i++) {
    		s=s+tableau[i];
    	}
    	return s;
    }
     
    int main() {}
    tableau.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int sommeTableau(int *tableau, int tailleTableau);
    Lorsque je fais gcc main.c, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp/cccUC3HI.o: dans la fonction « main »:
    main.c:(.text+0x63): référence indéfinie vers « sommeTableau »
    collect2: erreur: ld a retourné 1 code d'état d'exécution
    Cette fois c'est quoi, la bêtise ?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par binome-x Voir le message
    Lorsque je fais gcc main.c, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp/cccUC3HI.o: dans la fonction « main »:
    main.c:(.text+0x63): référence indéfinie vers « sommeTableau »
    collect2: erreur: ld a retourné 1 code d'état d'exécution
    Cette fois c'est quoi, la bêtise ?
    C'est une erreur à l'édition de liens, tu as oublié de compiler et de linker avec tableau.c

    Essaye "gcc main.c tableau.c"
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Attention ! tableau.c ne doit pas contenir int main() {} :O

    On ne rappelle le prototype d'une fonction f() que si elle est utilisée dans le fichier en cours, pour que les fonctions de ce fichier sachent que cette fonction f() existe et comme elle s'utilise. Ici, main() n'est pas utilisée.

    De plus, int main() {} définie une nouvelle fonction à cause des accolades. C'est une fonction qui ne fait rien et tu auras un warning du compilateur car elle ne renvoie rien alors qu'elle est censée renvoyer un int. A l'édition des liens, tu risques même d'avoir une erreur "duplicated function main()".

    Enfin, la fonction main() est une fonction très spéciale. Tu ne dois jamais l'appeler, donc tu n'as jamais besoin d'y faire référence. Le compilateur la connait sans tu es besoin de lui dire.

  8. #8
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Citation Envoyé par binome-x Voir le message
    J'ai fait exprès de n'initialiser que 3 valeurs pour "voir".
    Tu avais été prévenu avant que j'ajoute ma réponse !
    Mais maintenant tu as "vu" que ça fait n'importe quoi en effet !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Par défaut
    Ah oui, cette fonction ne renvoie rien. C'est bizarre que le compilateur ne crie pas "Ô scandale !".
    Merci.

  10. #10
    Membre chevronné
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Par défaut
    Ah oui, cette fonction ne renvoie rien.
    Vrai et faux:
    Elle est en void donc elle ne renvoie rien effectivement.
    Mais elle comprend un printf() donc tu affiches sur la sortie standard des trucs.
    Ces trucs étant le numero de la case (1 à 6) et la valeur qu'elle contient (1,2,3,0,0,0).

    C'est bizarre que le compilateur ne crie pas "Ô scandale !".
    J'avoue!

    printf("%d\n",afficheTableau(t,6));
    Tu changes juste cette ligne par:

    afficheTableau(t,6);
    printf("\n");
    Et tu devrais avoir ce que tu cherchais à faire

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/06/2005, 10h56
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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