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 :

Retourner une structure ou -1 si erreur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut Retourner une structure ou -1 si erreur
    Bonjour à tous,

    j'ai une fonction mafonction qui retourne une variable de type t_perso.

    Mon type t_perso étant une structure encapsulant un entier (int), et une chaine de caractères., c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
      int age;
      char nom[MAX_LEN];
    } t_perso;
    Mon problème, c'est que dans t_perso mafonction() je dois renvoyer -1 si erreur, et si tout se passe bien je renvoie la structure correctement remplie.

    Si je met return -1 gcc me renvoie erreur: incompatible types in return. Normal.
    Si j'essaie de caster : return (t_perso) -1 j'obtiens erreur: conversion vers un type non scalaire demandée.

    Est-ce que la solution est d'utiliser une union qui encapsulerait t_perso et un entier?

    Merci.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Une fonction ne peut pas retourner une structure ou un nombre. Elle retourne l'un ou l'autre mais pas les 2 (même si ce n'est pas en même temps).

    ce que tu peux faire, c'est passer en paramètre une structure à renseigner par ta fonction. Cette fonction retourne alors -1 en cas d'erreur (et différent de -1 ca marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int MaFonction(t_perso * Personnel)
    {
       // un test
       if(...)
          return -1;
     
       // c'est tout bon, on peut renseigner la structure
       Personnel.age = 20;
       return 0;
    }
    ou alors un pointeur de structure allouée par la fonction qui vaut NULL en cas d'erreur (mais il faut penser à la libération de la structure)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    t_perso *MaFonction(void)
    {
       // un test
       if(...)
          return NULL;
     
       t_perso * new_perso = malloc(sizeof(*new_perso));
       if(new_perso == NULL)
          return NULL;
     
       // c'est tout bon, on peut renseigner la structure
       new_perso->age = 20;
       return new_perso;    // ne pas oublier de liberer cette structure
    }
    Une autre possibilité est un mélange des 2, la fonction retourne la structure passée en paramètre si c'est bon ou NULL en cas d'erreur (plus de problème de libération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    t_perso *MaFonction(t_perso * Personnel)
    {
       // un test
       if(...)
          return NULL;
     
       // c'est tout bon, on peut renseigner la structure
       Personnel->age = 20;
       return Personnel;
    }
    Voilà, tu as le choix, après, c'est fonction de ton contexte
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut
    J'avais en effet penché pour les solutions 1 et 3. J'essaye de trouver une solution sans modifier la signature de la fonction (qui m'est fournie) si possible. C'est pour celà que j'ai commencé à me renseigner sur les unions, n'ayant jamais eu à en utiliser jusque là.
    Une solution dans cette direction est-elle envisageable?

    Sinon une idée sur pourquoi on ne peut pas caster un entier en t_perso?
    edit: si je comprends bien, on ne peut pas caster vers une structure ou autre type non scalaire.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par micaz Voir le message
    J'avais en effet penché pour les solutions 1 et 3. J'essaye de trouver une solution sans modifier la signature de la fonction (qui m'est fournie) si possible. C'est pour celà que j'ai commencé à me renseigner sur les unions, n'ayant jamais eu à en utiliser jusque là.
    Une solution dans cette direction est-elle envisageable?
    Oui, pourquoi pas mais faut vraiment que tu sois obligé, changer la signature si possible me parait plus sain.

    Citation Envoyé par micaz Voir le message
    Sinon une idée sur pourquoi on ne peut pas caster un entier en t_perso?
    Parce que c'est mal (et pourquoi pas caster un char * en double). Je te rassure, cela va marcher mais 1/ c'est pas beau, 2/ penses au mal de tête du suivant qui va prendre ton code 3/ c'est la porte ouverte à des bugs
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut
    Oui, je pense qu'après discussion avec le chargé de projet je serais autorisé à changer la signature de la fonction, cà sera plus propre. Je marque le sujet comme étant résolu.

    En tous les cas, merci pour ces réponses rapides ram-0000

  6. #6
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    C'est meme curieux que dans un projet on te donne ce type de signature obligatoire et qui n'a pas beaucoup de sens en C. Pour moi la meilleur solution est la 1. De plus c'est typiquement comme cela qu'on code en C on a cas voir les API systeme Linux ou Windows...
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

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

Discussions similaires

  1. [JAXB] Unmarshalling retourne une structure vide
    Par Mat1664 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 07/03/2008, 11h43
  2. retourner une structure pour une fonction
    Par emardjean dans le forum C
    Réponses: 5
    Dernier message: 24/01/2007, 20h36
  3. Retourner une structure
    Par MogDeChNord dans le forum C
    Réponses: 14
    Dernier message: 22/06/2006, 08h08
  4. Réponses: 6
    Dernier message: 14/02/2006, 11h29
  5. Réponses: 7
    Dernier message: 15/03/2005, 14h44

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