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

Interfaces de programmation Oracle Discussion :

[PRO*C] pointeur + fonctions


Sujet :

Interfaces de programmation Oracle

  1. #1
    Fabouney
    Invité(e)
    Par défaut [PRO*C] pointeur + fonctions
    Bonjour à tous,

    voila mon souci.

    j'ai une fonctionne qui effectue une requete qui retourne, une chaine de caractere.

    j'ai définie en global les variables utile pour mes requetes.

    dans mon programme principal

    j'ai défini un pointeur qui fait référence à un type char.
    je ne sais pas comment faire pour mettre dans se pointeur la valeur retournée par la fonction.

    je vous met le code utile :


    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
    #include <sqlenv.h>
    #include <sqlutil.h>
    #include <stdio.h>
    #include <sqlcodes.h>
    #include <sqlda.h>
    #include <time.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    EXEC SQL INCLUDE SQLCA ;
     
    EXEC SQL BEGIN DECLARE SECTION;
      char dbname[9] = "THEMAT";
      char msgbuffer[500];
      char gencod[14];
      char titre[255];
      char chap_id[12];
      char req[1000];
      char req1[1000];
      char date_debut[9];
      char date_fin[9];
    EXEC SQL END DECLARE SECTION;
     
    int main (int argc, char **argv)
    {
    char catid[14];
    char *chapid;
     
    retourne_chapid_sujet(catid, date_today, &chapid);
    printf("%s", chapid);
    exit(0);
    }
     
     
    void retourne_chapid_sujet(char *catid, char *date_today, char **chapid)
    {
     
         sprintf(req,"SELECT rtrim(chap_id),date_debut as debut,date_fin as fin FROM www_cat_chaps WHERE cat_id = '%s'",catid);
     
    	EXEC SQL PREPARE s1 FROM :req;
       	EXEC SQL DECLARE c1 CURSOR FOR s1;
       	EXEC SQL OPEN c1;
     
       	EXEC SQL FETCH c1 INTO :chap_id,:date_debut,:date_fin;
       	EXEC SQL CLOSE c1;
     
    	if(date_today >= date_debut && date_today <= date_fin)
    	   {
    	        strcpy(*chapid, chap_id);
    	   }
     
    }

    j'ai une erreur segmentation fault, a cause de mon printf apres l'appel de ma fonction, si je le retire, plus d'erreur, mais je sais pas si je récupérere bien le chap_id.

    donc comment faire pour récupérer le chap_id que retourne ma fonction dans le pointeur chapid de mon programme principal.

    merci de vos réponse à bientot.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Assure-toi que chap_id est terminé par un caractère nul...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Fabouney
    Invité(e)
    Par défaut
    oui, mais sinon, est-ce que ma facon de proceder est correct, car j'ai tout de meme une segmentation fault.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    j'ai une erreur segmentation fault, a cause de mon printf apres l'appel de ma fonction, si je le retire, plus d'erreur, mais je sais pas si je récupérere bien le chap_id.
    Ta déclaration:
    Où se trouve l'allocation avec un malloc ou une affectation à une zone mémoire déjà allouée? Je ne vois rien et après tu t'en sers ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(*chapid, chap_id);
    Ce qui provoque un comportement indéterminé.

    Par contre,
    Citation Envoyé par Médinoc
    Assure-toi que chap_id est terminé par un caractère nul...
    Vu qu'il s'en sert exclusivement avec strcpy, je pense que c'est inutile, strcpy le mettrait directement dedans. Mais il est vrai qu'il faudrait être sûr que la zone mémoire allouée pour chap_id soit assez grande pour contenir chapid.

    Ou est-ce que j'ai loupé quelque chose?
    Jc

  5. #5
    Fabouney
    Invité(e)
    Par défaut
    c'est mon je récupérer bien mon chapid dans le programme principal, en effet il manqué un malloc.

    maintenant autre petit soucis, si la condition de ma fonction se vérifie alors je copi dans chapid la valeur retourner de la requete de chap_id, on est d'accord, et j'ai mi que sinon je copie une chaine vide ("").

    comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(date_today >= date_debut && date_today <= date_fin)
    {
    strcpy(*chapid, chap_id);
    }else{
    strcpy(*chapid, "");
    }
    apparement pas de soucis, qd je fait un puts de chapid, il me met bien une chaine vide, or apres qd je fait un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(chapid == "")
    {
       puts("ok");
    }
    il m'affiche pas ok ... hum étrange.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ah oui, je n'avais pas vu, je m'emmêlais entre chapid et chap_id...

    Déjà, quelques commentaires:
    Tu donnes le même nom à char *chapid et char**chapid : très mauvais.

    Secundo, on ne peut pas comparer des chaînes ainsi (et il en est de même pour tes dates) : Là, tu compares simplement leurs adresses.

    Il te faut utiliser la fonction strcmp() qui retourne zéro si les chaînes sont identiques, 1 ou -1 si l'une est "supérieure" (dans l'ordre des valeurs d'un char) à l'autre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Lorsque tu compares deux chaînes de caractères, tu ne peux pas faire directement un test d'égalité. En effet, l'ordinateur vérifie si les adresses sont identiques et non pas les chaînes.

    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
     
    #include <stdio.h>
    #include <string.h>
     
    void f(char *p, char *q)
    {
    if(p==q) //Attention, on teste la valeur des pointeurs
      {
      printf("Les pointeurs sont égaux\n");
      }
     
    if(strcmp(p,q)==0)
      {
      printf("Les chaînes sont pareilles\n");
      }
    }
     
    int main()
    {
    char a[32];
    char b[32];
     
    strcpy(a,"Hello");
    strcpy(b,"Hello");
     
    f(a,b);
     
    f(a,a);
     
    return 0;
    }
    Jc

  8. #8
    Fabouney
    Invité(e)
    Par défaut
    Merci pour vos réponse pertinentes, en effet je débute en C, est on a tellement l'habitude de se faire assister dans les langage moderne que c pas forcement évident de se familiariser avec cette philosophie de programmation.

    a bientot

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: pointeur + fonctions
    Citation Envoyé par Fabouney
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC SQL INCLUDE SQLCA ;
    C'est pas du C (du Pro*C, probablement)

  10. #10
    Fabouney
    Invité(e)
    Par défaut
    bah en fait l'extension c'est .sqc, mais apres qd je compile il créer un .c et un .bnd (je taff sous linux).

Discussions similaires

  1. Comprendre pointeur --> fonction
    Par FabTheGeek dans le forum Débuter
    Réponses: 9
    Dernier message: 24/09/2009, 10h49
  2. Probléme structure pointeur fonction
    Par babouoles dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 14/05/2008, 17h34
  3. pointeur fonction C
    Par Master C dans le forum Débuter
    Réponses: 4
    Dernier message: 16/02/2008, 16h42
  4. pointeurs, fonctions et modifications...
    Par kw1k dans le forum C
    Réponses: 2
    Dernier message: 01/04/2006, 17h42
  5. pro c appelle fonction connexion
    Par friends dans le forum Oracle
    Réponses: 3
    Dernier message: 10/05/2004, 17h07

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