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 de portée de variable


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Par défaut Problème de portée de variable
    Bonjour,

    Pour commencer voici 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct vecteur vecteur;
    struct vecteur
     
    {
        char nom[20];
        int *tab;
        int n;
    };
     
    vecteur allocation_zero (vecteur  vect)
    {
     
        int i;
     
        printf("Donnez le nom du vecteur");
        scanf("%s", vect.nom);
     
     
     
        printf ("Donnez la taille du vecteurs %s:", vect.nom);
        scanf ("%d", &vect.n);
     
     
     
        vect.tab=(int*)malloc(vect.n*sizeof(int));
     
        for(i=0; i<vect.n; i++)
        {
            vect.tab[i]=0;
        }
        /*  for(i=0; i<vect.n; i++)
        {
            printf("%d\n", vect.tab[i]);
     
        }printf("\n");*/
        return vect;
    }
     
    void affichage_vecteur (vecteur vect)
    {
        int i;
     
     
        for(i=0; i<vect.n; i++)
        {
            printf("%d\n", vect.tab[i]);
     
        }
    }
     
    int main ()
    {
        vecteur v1;
     
        allocation_zero(v1);
        printf("%s\n", v1.nom);
        printf("v1.n=%d\n", v1.n);
        affichage_vecteur(v1);
    }

    Le problème est que je n'arrive pas à récupérer la sortie de la fonction allocation_zero, qui est censée initialiser un vecteur et le remplir 0.
    Ma structure vecteur est déclarée en dehors de la fonction allocation, je ne comprend pas pourquoi je ne peux pas récupérer le vecteur créé pour l'afficher avec ma seconde fonction par exemple.

    j'ai mis les deux "printf" de la fin juste pour tester si je peux récupérer des champs de ma structure rentrés dans la fonction "allocation_zero", pour être sur que le problème ne vient pas de la fonction "affichage" mais ça ne fonctionne pas! Comment faire pour récupérer des champs de la structure vecteur afin de les utiliser dans d'autres fonctions ?

    J'ai aussi un problème avec code blocks, je n'arrive pas à compiler mon code, lorsque je compile, j'ai un message qui dit "It seems that this file has not been built yet" et dans le build log j'ai le message suivant "Execution of 'mingw32-g++.exe -o C:\Users\MA\Documents\Untitled1.exe C:\Users\MA\Documents\Untitled1.o' in 'C:\Users\MA\Documents' failed." Pourtant j'ai installé la version de code blocks avec mingw, et j'ai essayé plusieurs manipulation trouvée sur internet sans succès...

    Merci pour votre aide
    Clément

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Les parametres d'une fonction sont passé par copie. Donc, le "vect" dans allocation_zero est une copie du v1 de main.
    Cette copie est encore copiée par le "return vect", puis oubliée.

    Pour résoudre ton problème, il te faut le récupérer.
    essaie v1 = allocation_zero(v1);Tu arrives alors à deux possibilité.
    • passer par un pointeur et retourner void,
    • retourner le vecteur, mais ne pas le prendre en argument.


    Je te suggère une fonction: vecteur allocation_zero(const char* nom, int taille);Ainsi, tu pourras sortir la saisie utilisateur de l'opération d'allocation.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Bonjour,

    Tu confonds le C et les références C++. Ceci ne peut pas fonctionner :

    Citation Envoyé par clemclem76 Voir le message
    Bonjour,

    Pour commencer voici 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    typedef struct vecteur vecteur;
    struct vecteur
     
    {
        char nom[20];
        int *tab;
        int n;
    };
     
    vecteur allocation_zero (vecteur  vect)
    {
        …
        scanf("%s", vect.nom);
        …
        scanf ("%d", &vect.n);
        vect.tab=(int*)malloc(vect.n*sizeof(int));
        …
        return vect;
    }
     
    int main ()
    {
        vecteur v1;
     
        allocation_zero(v1);
        …
        affichage_vecteur(v1);
    }
    Tous les arguments et retours de fonctions en C sont passés par valeur.

    Quand tu appelles « allocation_zero(v1); », l'argument reçu par ta fonction est une copie de v1, considérée comme une variable locale. C'est donc cette variable locale que tu initialises. Pas le « v1 » de ta fonction main.

    En outre, tu es censé renvoyer une structure « vecteur » en sortie de ta fonction d'allocation, chose que tu fais avec return. Seulement, tu ne récupères pas ce résultat dans ta fonction main. Normalement, ça devrait plutôt ressembler à « v2 = allocation_zero (v1); » sachant qu'en plus, dans les faits, v1 ne sert à rien ici. Et au passage, tu as fait un malloc mais que le contenu de ton vecteur est perdu, tu as une fuite de mémoire.

    Si tu veux procéder comme tu le fais, c'est-à-dire faire en sorte que « allocation_zero() » remplisse la structure v1 déjà existante, il faut passer un pointeur à ta fonction. Donc « void allocation_zero (vecteur * vect); », puis appel avec « allocation_zero(&v1); ».

    Et bien sûr, il faut corriger la syntaxe en conséquence à l'intérieur de « allocation_zero() » en plaçant les « & » nécessaires et en utilisant « -> » à la place « . » là où il le faut.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Salut

    Je ne comprends pas pourquoi ta fonction allocation_zero (qui ne fait que remplir un vecteur déjà existant) est sensée retourner ledit vecteur...

    Voici 2 exemples

    Le premier remplit un vecteur déjà existant
    Code c : 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
    19
    20
    21
    22
    23
    24
    typedef struct {
        char nom[20];
        int *tab;
        int n;
    } t_vecteur;
     
    void allocation_zero (t_vecteur *vect)
    {
        …
        scanf("%s", vect->nom);
        …
        scanf ("%d", &vect->n);
        vect->tab=(int*)malloc(vect->n*sizeof(int));
        …
    }
     
    int main ()
    {
        t_vecteur v1;
     
        allocation_zero(&v1);
        …
        affichage_vecteur(&v1);
    }

    Le second crée le vecteur et le remplit avant de le renvoyer
    Code c : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    typedef struct {
        char nom[20];
        int *tab;
        int n;
    } t_vecteur;
     
    t_vecteur *allocation_zero ()
    {
        t_vecteur *vect;
        vect=malloc(sizeof(t_vecteur));
        if (vect == NULL) return NULL;
     
        scanf("%s", vect->nom);
        …
        scanf ("%d", &vect->n);
        vect->tab=(int*)malloc(vect->n*sizeof(int));
        …
        return vect;
    }
     
    int main ()
    {
        t_vecteur *v1;
     
        v1=allocation_zero();
        …
        if (v1 == NULL) {
            // Gestion du cas
            exit(1);
        }
        affichage_vecteur(v1);
        free(v1);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Le second crée le vecteur et le remplit avant de le renvoyer
    Code c : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    typedef struct {
        char nom[20];
        int *tab;
        int n;
    } t_vecteur;
     
    t_vecteur *allocation_zero ()
    {
        t_vecteur *vect;
        vect=malloc(sizeof(t_vecteur));
        if (vect == NULL) return NULL;
     
        scanf("%s", vect->nom);
        …
        scanf ("%d", &vect->n);
        vect->tab=(int*)malloc(vect->n*sizeof(int));
        …
        return vect;
    }
     
    int main ()
    {
        t_vecteur *v1;
     
        v1=allocation_zero();
        …
        if (v1 == NULL) {
            // Gestion du cas
            exit(1);
        }
        affichage_vecteur(v1);
        free(v1);
    }
    Merci pour vos réponses.
    Je pensais qu'il fallait que la fonction allocation retourne le vecteur "initialisé" pour pouvoir l'utiliser après.

    J'ai juste une question, sur les lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        vect=malloc(sizeof(t_vecteur));
        if (vect == NULL) return NULL;
    a quoi servent-elles ? la première fait une allocation de mémoire de la taille d'un élément de la structure vecteur ??

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Citation Envoyé par clemclem76 Voir le message
    a quoi servent-elles ? la première fait une allocation de mémoire de la taille d'un élément de la structure vecteur ??
    Oui. Mais comme cette allocation est une demande faite au système pendant l'exécution et qu'elle peut échouer, il faut envisager ce cas en vérifiant si ce qu'a renvoyé malloc() est valide. Et s'il ne l'est pas, alors il faut terminer immédiatement la fonction et surtout ne pas essayer d'écrire dans un endroit qui n'est pas valide.

Discussions similaires

  1. Problème de portée de variables (VBS)
    Par befast dans le forum Windows
    Réponses: 0
    Dernier message: 18/09/2007, 09h40
  2. [Mail] problème de portée de variables
    Par xclam dans le forum Langage
    Réponses: 2
    Dernier message: 12/04/2007, 09h35
  3. Problème de Portée de Variable
    Par Julien_C++ dans le forum C++
    Réponses: 7
    Dernier message: 18/09/2006, 10h13
  4. [VBA-E] Problème de portée de variable [débutant]
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/03/2006, 18h28
  5. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34

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