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 :

Renvoyer un tableau local


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut Renvoyer un tableau local
    Bonjour, est-ce qu'on peut créer un tableau de char de taille définie dans une fonction, le remplir par indices et renvoyer un pointeur.
    Ce code compile mais donne une erreur de segmentation à l'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const char * f()
    {
    	char * s[2] = {0};
    	*s[0] = 'a'; // erreur de segmentation
    	*s[1] = '\0';
    	 return *s;
    }
    J'ai essayé d'autres possibilités mais rien ne fonctionne, problème de conversion, d'initialisation, ou retour de l'adresse d'une variable locale.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Utilises des vector (ou des string)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::vector<char> f() {
       std::vector<char> tab(2);
       tab[0] = 'a';
       tab[1] = '\0';
       return tab;
    }
     
    // ou vu que tu sembles utiliser des chaines de caractères
    std::string f() {
       return "a";
    }

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Si tu veux a tout prix rester dans du C-like :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char * f()
    {
    	char *s = new char[2];
    	s[0] = 'a';
    	s[1] = '\0';
    	return s;
    }
     
    void tralala()
    {
      char *s = f();
      delete[] s;
    }
    Cependant je pense que la solution proposee par Iradrille est plus adaptee.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Avec cette technique il faut effacer le pointeur de l'extérieur aussi...
    Merci pour les réponses.

  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Je te déconseille de faire ce genre de fonction... Tu ne sais jamais si ton delete sera bien appelé après ton new.
    je vois trois possibilitée:
    1 - Tu encapsules ton tableau dans une classe. Cette classe alloue et delete le contenu automatiquement; cf : RTTI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class s
    {
         char * data;
     
         s(size_t size): data(new (size)){}
         ~s(){ delete data; }
    };
    Mais ici tu dois faire attention lorsque tu copies ta classe s. (Interdire la copie pourrais être une bonne idée)
    2 - Passe les informations nécessaires à ta fonction f():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f(char* data, size_t size)
    {
        data[0] = 'a'; // erreur de segmentation
        data[1] = '\0';
    }
    Et la tu demandes au client de fournir un char* alloué avec la taille nécessaire. C'est lui qui new c'est lui qui delete, pas de 50/50.

    3- Utilise les std::string (Celle que je ferais si j'étais toi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void f(std::string& str)
    {
        str.reserve(2);
        str.push_back('a');
        str.push_back('\0');
    }
    Homer J. Simpson


  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    La seconde est la plus simple, j'avais remarqué que passer la cible était une solution fréquente aussi. Pour les chaînes je garde ça sous le coude pour le moment.
    Merci.

Discussions similaires

  1. renvoyer un tableau à partir d'un recordset
    Par kamalkam dans le forum ASP
    Réponses: 16
    Dernier message: 31/05/2006, 09h53
  2. [Ant]Lire un XML - renvoyer un tableau de valeurs
    Par gael.poffet dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 06/03/2006, 15h32
  3. Réponses: 6
    Dernier message: 18/05/2005, 14h04
  4. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33
  5. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20

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