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 :

probleme de perte de valeur pour une variable


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut probleme de perte de valeur pour une variable
    Bonjour tout le monde,
    J'ai un petit souci en C et j'espére que vous pourrez m'aider.

    Je veux faire un programme permettant de mettre a jour un svn dans un premier temps, puis de renommer les fichiers dans ma base de données afin de mettre à jour selon la convention de nommage appliquée.


    J'ai donc deux fonctions :
    - une pour faire un update sur le svn :

    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
    char* command_svn (){
          FILE * temp;
          FILE * temp2;
          char version[500]; 
          char fichier[500]; 
          char commande[100]; 
          char* num_version_s = 0;
          char res[1000]="";
     
          char* svn_res[1000];
          strcpy(svn_res, "");
     
          strcpy (commande,"svn update D:/waatavi/ > fichier"); 
          system(commande); 
     
          temp2 = fopen ("fichier","r");
     
          char* text[60];
          char text2[60];
          while (fgets (text, sizeof (text), temp2) != NULL)
         {
            printf("%s", text);
            format(text, svn_res);
         }
         fclose (temp2); 
          return svn_res; 
    }
    - une autre pour récupérer la version :
    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
     
    char* command_version (){
          FILE * temp;
          char version1[500];     
          char commande1[100]; 
          char* num_version_s = 0;
     
          strcpy (commande1,"svnversion > version"); 
          system(commande1); 
     
          temp = fopen ("version","r");
     
          fgets(version1, 50, temp);
          int longueur1 = strlen(version1);
          num_version_s = str_sub(version1, 0, 4);
     
          fclose(temp); 
     
          return num_version_s; 
    }
    et voila enfin mon code principal :

    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
    int main(int argc, char *argv[])
    {
     char* retour;
      char* ret;
     
      MYSQL mysql ;
      mysql_init(&mysql);
     
      mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
     
      if(mysql_real_connect(&mysql, "localhost","root","","xxx", 0, NULL, 0)){
            retour = command_svn();
    mysql_query(&mysql, "SELECT value FROM waa_config WHERE type='VERSION'");
          MYSQL_RES *result = NULL;
          MYSQL_ROW *row = NULL;
          unsigned int i = 0;
          result = mysql_use_result(&mysql);
          row = mysql_fetch_row(result);
     
          int version_bd = atoi(row[0]);
          version_bd ++;
     
     
          mysql_free_result(result);
          char requete[150] = "";
     
          sprintf(requete, "UPDATE waa_config SET value='%d' WHERE type='VERSION'", version_bd);
          mysql_query(&mysql, requete);
          requete[150] = "";
     
          char* version_svn = command_version();
     
          sprintf(requete, "UPDATE waa_config SET value='%s' WHERE type='SVN_VERSION'", version_svn);
         mysql_query(&mysql, requete);
    .....

    sauf qu'a ce moment la, ma variable retour perd sa valeur.
    savez vous pourquoi ?
    en vous remerciant d'avance

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    C'est normal, tu retournes un pointeur sur une variable locale à la fonction !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut,

    J'ai regardé le code seulement en diagonale, mais déjà deux choses m'ont sauté aux yeux :

    1) Tu renvoies l'adresse d'un tableau local à la fonction, ce qu'il ne faut jamais faire.

    2) Tu déclares un tableau de pointeurs mais tu l'utilises comme un tableau de caractères. Exemple ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char* svn_res[1000];
          strcpy(svn_res, "");

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    C'est normal, tu retournes un pointeur sur une variable locale à la fonction !
    comment ca ? que dois je faire alors ?

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Ben retravailler les concepts de "portée" et de "pointeur" en C.

    Il vaut mieux que tu passes le buffer en paramètre à ta fonction que de retourner un buffer (qui dans ce cas doit être alloué dynamiquement)
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    T'es d'une grande aide merci pour ta précision
    Enfin pas grace a toi, mais j'ai trouvé
    merci qd meme

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Salut,

    J'ai regardé le code seulement en diagonale, mais déjà deux choses m'ont sauté aux yeux :

    1) Tu renvoies l'adresse d'un tableau local à la fonction, ce qu'il ne faut jamais faire.

    2) Tu déclares un tableau de pointeurs mais tu l'utilises comme un tableau de caractères. Exemple ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char* svn_res[1000];
          strcpy(svn_res, "");
    Merci j'ai deja corrigé un peu mais ca a pas trop résulu mon pb, enfin c deja plus propre mnt

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par eug4016 Voir le message
    T'es d'une grande aide merci pour ta précision
    Enfin pas grace a toi, mais j'ai trouvé
    merci qd meme
    On t'a indiqué la source de tes problèmes :

    - non respect de la portée d'une variable
    - mauvaise déclaration de variable / pointeur

    Donc :

    - soit tu comprends ce que cela veut dire
    - soit tu ne comprend pas les termes utilisés et dans ce cas cela signifie que tu écris du code sans trop savoir ce que tu fais et utilise des concept que tu ne connais pas ou n'a pas encore assimilé.

    Te conseiller de réetudier certains concepts de programmation n'est pas de la dénigration mais bien au contraire un conseil constructif et avisé.

    Tu ne peux conduire une voiture sans savoir comment elle fonctionne et sans connaitre le code de la route.

    Maintenant, si tu le prends mal, c'est que tu as pas mal de chemin à parcourir.

    Pour revenir à ton code, puisque que tu veux des réponses sans avoir assimilé certains concepts :

    => problème de portée

    Au sein de la fonction command_svn(), tu as une variable "svn_res" qui est un tableau alloué automatiquement au sein de la fonction et qui est détruit lors que la fonction se termine. Ors tu retournes un pointeur vers ce tableau en sortie de fonction. Ors une fois sorti de la fonction ,ce tableau n'existe plus. Donc ton pointeur contient une adresse invalide.

    => problème de type

    Au sein de la fonction command_svn(), tu as une variable "svn_res" qui, selon ce que tu as ecris, est une tableau de 1000 pointeurs ! Je ne pense pas que c'est ce que tu voulais.. Au vu de la fonction, c'est plutot un tableau de 1000 caractères que tu voulais utiliser.

    Donc, je t'ai clairement expliqué tes erreurs et tu devrais être capable de les corriger maintenant.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    merci pour ta rep détailéle cette fois ci mais jaai deja resolu mon pb : ma fonction command_svn qui me posait pb je l'ai copié direct dans le main. c'est pas propre mais ca marche.
    et si g posté sur ce forum ct pour avoir une réponse rapide. je suis dans une entreprise pour programmer en php. cependant ce que je voulais faire pour une raison que jignore ne passe pas sur le serveur, donc jai du me mettre vite fait au c pour avoir un programme fonctionnel .exe qui est attendu rapidemment. donc, voila, ta reponse enigmatique qui en effet doit etre comprehensible pour qqn qui sy connais en c n'était pas dune grande aide meme si elle aiguille un peu. j'ai pas le tps de me former au c pour 300 lignes de codes meme si en effet ca serait interessant. bref de toute mnt ce que je fais marche c lessentiel
    bonne soirée

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    dailleur je met resolu, ta reponse aidera surement les prochains

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

Discussions similaires

  1. VBA, perte de valeur d'une variable aprés avoir activé une autre feuille
    Par mikeactuaire dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2011, 07h13
  2. [MySQL] passage de deux valeurs pour une variable
    Par kate59 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 02/06/2009, 14h02
  3. [MySQL] Plusieurs valeurs pour une variable à injecter
    Par pony99 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/12/2008, 12h04
  4. Perte de valeur d'une variable
    Par ced600 dans le forum VBScript
    Réponses: 6
    Dernier message: 08/01/2008, 16h52
  5. Réponses: 9
    Dernier message: 30/05/2006, 10h33

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