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 chaine de caractère


Sujet :

C

  1. #1
    Membre du Club Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut problème chaine de caractère
    bonjour, je suis en train de faire une dll en c que je dois appeler dans windev. Celle-ci doit me renvoyer une chaine de caractère de la forme suivante : "AAAAMMJJHHSSCC000", mais lorsque je l'exécute je ne récupère que "A", quelqu'un voit-il d'où cela pourrait venir, merci
    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
    extern "C" __declspec(dllexport) char RecupererHeure(int nbh, time_t t)
    {
    #include <time.h>
     
    /* Déclarations des données */
    //int nbh;
    char dte[100];
     
    /* date et heure d'aujourd'hui */
    //time_t t = time(0L);
     
    /* nbh: nombre d'heures à soustraire */
    t -= 3600*nbh;  
     
    /* Calcul du jour recherché */
    tm *tm = localtime(&t);
     
    /* Concaténation des différentes valeurs (jour,mois,année,heure,minute)*/
    sprintf(dte,"%04d%02d%02d%02d%02d000",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min);
     
     
    return *dte;
    //system("pause");
    }

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Normal, regarde bien la signature de ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char RecupererHeure(int nbh, time_t t)
    sous cette forme elle renvoie simplement un char et non un char * donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * RecupererHeure(int nbh, time_t t)
    De même pour ton tableau, ici c'est un tableau local que tu veux renvoyer ... pas bien, il faut renvoyer un pointeur donc ton tableau au lieu de:
    sera:
    il faut alors allouer cet espace soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dte = malloc (100);
     
    if (dte != NULL)
    {
       /* ton code */
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre du Club Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Maintenant, j'ai modifié l'appel de la fonction *RecupereHeure et la valeur de retour (dte au lieu de *dte)

    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
     
    extern "C" __declspec(dllexport) char *RecupererHeure(int nbh, time_t t)
    {
     
    #include <time.h>
    #include <string.h>
     
    /* Déclarations des données */
    //int nbh;
    char dte[100];
     
    /* date et heure d'aujourd'hui */
    //time_t t = time(0L);
     
    /* nbh: nombre d'heures à soustraire */
    t -= 3600*nbh;  
     
    /* Calcul du jour recherché */
    tm *tm = localtime(&t);
     
    /* Concaténation des différentes valeurs (jour,mois,année,heure,minute)*/
    sprintf(dte,"%04d%02d%02d%02d%02d000",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min);
     
    /* Renvoi de la valeur */
    cout << dte << endl;
    system("pause");
    return dte;
     
    }
    Cela ne m'envoie plus "2" mais une valeur "1240760", je pense que la mauvaise interprétation dit venir de windev et pas du C, je vais voir! Et il me donne toujours cette valeur quelque soit la date !merci beaucoup

  4. #4
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Cela viens de comment sont gérés les chaînes de caractères en C.
    En langage C, il n'y à pas de type "string". Le seul moyen est d'utiliser à la place un tableau de caractères. Le type caractère étant le "char".

    Dans ton code dte est bien un tableau de char. Tout va bien. Par contre ta fonction renvoi un "char", cad un seul caractère. C'est pourquoi tu n'obtient que 'A'.

    Ce que tu voudrais c'est renvoyer le tableau dte dans son intégralité. Maintenant, le problème est que dte est stockée dans une zone mémoire qui n'existe que le temps de l'appel RecupererHeure. Autrement dit, quand RecupererHeure se termine, dte n'existe plus. Donc le code suivant sera faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern "C" __declspec(dllexport) char* RecupererHeure(int nbh, time_t t) {
    ...
     
    return dte;
    }
    Le seul moyen d'y arriver et d'allouer une "string" depuis ton programme appellant en windev, de la passer en paramètre, de la modifier. Le paramètre sera alors en entrée/sortie de ta fonction. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern "C" __declspec(dllexport) void RecupererHeure(int nbh, time_t t, char *dte) {
    ...
    sprintf(dte, ...);
    // pas de return
    }
    EDIT : arf ... pas assez rapide
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Franck.H
    il faut renvoyer un pointeur donc ton tableau au lieu de:
    sera:
    il faut alors allouer cet espace soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dte = malloc (100);
     
    if (dte != NULL)
    {
       /* ton code */
    }
    Je vois mal un codeur Windev s'embêter avec des blocs à libérer... Je passerais plutôt l'adresse du premier élément d'un tableau de char et sa taille à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int RecupererHeure(char *text_out, size_t size, int nbh, time_t t)
    et dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      if (size >= sizeof "AAAAMMJJHHSSCC000")
      {
          /* OK */
          sprintf(...);
      }
      else
      {
          /* retourner un code d'erreur... */
      }
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre du Club Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    J'ai essayé et en fait ca marchouille! Lorsque je fais un trace sous windev (pour ceux qui connaissent pas c'est comme un printf), il me donne la valeur attendue, mais quand j'essaye juste après de récupérer cette valeur il me donne juste "2" et en plus cela bloque l'exécution du programme!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fabpeden
    J'ai essayé et en fait ca marchouille! Lorsque je fais un trace sous windev (pour ceux qui connaissent pas c'est comme un printf), il me donne la valeur attendue, mais quand j'essaye juste après de récupérer cette valeur il me donne juste "2" et en plus cela bloque l'exécution du programme!
    Tu as essayé quoi ? Parce que si tu t'obstines à retourner l'adresse d'une variable locale, le comportement est indéfini. C'est une certitude. Il peut arriver n'importe quoi. On t'a indiqué 2 alternatives.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [MySQL] problème chaines de caractères
    Par berti dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/02/2009, 15h36
  2. Probléme chaine de caractéres
    Par kiooik dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 30/07/2008, 16h25
  3. Problème chaine de caractère sous vista
    Par pinguipacman dans le forum Visual C++
    Réponses: 1
    Dernier message: 22/02/2008, 16h34
  4. [Débutant]Problème chaine de caractères
    Par olivier1209 dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 04/05/2007, 10h10
  5. [Format]Problème chaine de caractère
    Par e040098k dans le forum Access
    Réponses: 4
    Dernier message: 16/04/2007, 22h17

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