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 des chaines de caractères et des fonctions


Sujet :

C

  1. #1
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut Problème avec des chaines de caractères et des fonctions
    Salut à tous,

    Je dois faire un analyseur avec yacc et j'ai un probleme.
    Je dois créer un nouveau dossier en générant son nom automatiquement mais je n'y arrive pas. A mon avis j'écris des adresses au lieu d'écrire les chaines mais je n'y arrive plus. Ca fait longtemps que je n'ai pas fait de C...
    Pouvez-vous m'aider?

    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
     
    // Ici c'est ou j'appel mes fonctions dans le programme principal
    char nomScene[11];
    genereNomSceneDefaut(nomScene);
    printf("%s",nomScene);
    miseEnPlaceScene(nomScene);
     
    // Ca c'est ma fonction pour créer un dossier avec un nom passé en parametre
    void miseEnPlaceScene(char *nomScene){
    		//Creation du dossier
                    if(!(mkdir(nomScene,0777))){
    		              /* RESTE DU CODE PAS DE PROBLEME ICI :D 
                         EN FAIT JE CREE DES FICHIERS*/
                    }
    }
     
    // Là c'est la fonction avec laquelle je veux generer mon nom de fichier
    void genereNomSceneDefaut(char *nomChaine){
      int i = 1;
      nomChaine = malloc(11 * sizeof(char));
      strcpy(nomChaine,"newScene");
      while(mkdir(nomChaine,0777) == EEXIST){
        i++;
        sprintf(nomChaine,"%s%d","newScene",i);
      }
    }
    Bon y'a ptet des erreurs autres paske il me créer un dossier newScene (surement dans la fonction genereNomSceneDefaut ) et en plus il me crée un dossier avec un nom tout chelou >> ���x�.��. Celui-ci se crée surmenent dans la fonction miseEnPlaceScene car le code d'après (créations de fichiers) est réalisé pour ce dossier.


    J'espère que je suis assez clair et que vous pourrez m'aider.
    Pour toutes questions n'hésitez pas...

    MERCI ENORMEMENT A TOUS!!!!

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    ton erreur vient d'ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void genereNomSceneDefaut(char *nomChaine){
    tu fais une alloc, mais tu n'as passe que le pointeur, pas l'ADRESSE du pointeur.. Donc comme l'alloc te retournes une adresse, tu ne peux pas la faire remonter...

    Ton interface doit donc etre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void genereNomSceneDefaut(char **nomChaine){

  3. #3
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    AHHH ok!!!

    MERCI
    MERCI
    MERCI
    MERCI
    MERCI
    MERCI
    MERCI
    MERCI
    MERCI
    MERCI
    MERCI

    En gros c'est un pointeur sur le tableau (qui est lui aussi un pointeur??) C'est pour ca que je doit mettre ** et pas *
    Chui sur que c'est une des bases en plus... :'( J'ai pas fini de galerer moi :p

    Bon maintenant j'ai un truc qui marche...

    Et si j'auvais voulu retourner une chaine de caractere j'aurais du faire comment??? MERCI D'AVANCE
    (promis apres j'met mon ptit "resolu")

  4. #4
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Bon allez en fait je vais chercher, je ne vais pas pourrir le forum plus longtemps...

    A ciao tt le monde et encore merci

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Et si j'auvais voulu retourner une chaine de caractere j'aurais du faire comment???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char *genereNomSceneDefaut(void){
      int i = 1;
      char *nomChaine = NULL ;
     
      if ( (nomChaine = malloc(11)) != NULL )
       {
          strcpy(nomChaine,"newScene");
          while(mkdir(nomChaine,0777) == EEXIST)
             i++;
          sprintf(nomChaine,"%s%d","newScene",i);
      }
      return nomChaine ;
    }

  6. #6
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    J'avais eu un warning avec ca, je crois. Comme quoi je retournais une variable locale... enfin j'avais du mal faire
    Paske j'avais testé avant,quand même.

    Mais merci

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    J'avais eu un warning avec ca, je crois. Comme quoi je retournais une variable locale... enfin j'avais du mal faire
    Paske j'avais testé avant,quand même.

    Mais merci
    Cen'est pas le cas dans le code présenté par souviron34.

    NomChaine est bien une variable locale dont il retourne la valeur. Ce n'est pas interdit. Ce qui l'est est de retourner l'adresse d'une variable locale puisque celle-ci est détruite en sortie de fonction et qu'on se retouve avec l'adresse de quelque chose qui n'existe plus. Ici, on a l'adresse du bloc alloué par malloc et ce bloc existe encore en sortie de la fonction.
    Le code suivant est donc pervers et interdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *genereNomSceneDefaut(void){
      char nomChaine[11]  ;
    ....
        return nomChaine ;
    }
    mais celui-ci, non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *genereNomSceneDefaut(void){
      char * nomChaine = malloc(11) ;
    ....
        return nomChaine ;
    }

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

Discussions similaires

  1. [débutant] Problême avec les chaines de caractères
    Par Micky_du_57 dans le forum C++
    Réponses: 2
    Dernier message: 03/06/2007, 19h03
  2. Réponses: 2
    Dernier message: 13/05/2007, 18h34
  3. Réponses: 8
    Dernier message: 06/05/2007, 21h47
  4. Réponses: 5
    Dernier message: 26/07/2006, 11h13

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