2013-05-22 3 views
0

J'ai essayé le code ci-dessous pour retourner un tableau avec tous les identifiants de chaîne, mais cela n'a pas fonctionné. La sortie renvoie juste un nombre. Comment puis-je retourner un tableau avec des identifiants?Retour tableau à partir de la fonction en C++

#include <iostream> 
#include <string> 
using namespace std; 

string* getArray() 
{ 
    int nanim; 
cout << "Enter the number of animals: "; 
cin >> nanim; 

string *id = new string[nanim]; 
for (size_t i=0; i < nanim; i++) 
{ 
    cout<< "\nEnter id anim "<< i+1 << ": "; 
    cin >> id[i]; 
    } 
    for (size_t i = 0; i < nanim; i++) 
    { 
    cout << id[i] << endl; 
    } 
return id; 
} 

    int main() 
{ 
int n; 
cin>>n; 
    string* anim[n]=getArray(); 
cout<<anim; 
return 0; 
} 
+3

Vous n'êtes pas retourner un tableau, vous retournez un pointeur vers le premier élément d'un tableau. Vous feriez mieux d'utiliser 'std :: vector'. – chris

+0

Vous ne pouvez pas retourner des tableaux à partir de fonctions (ou passer des tableaux à des fonctions). C'est tout. –

+1

Bien sûr que vous pouvez, vous ne pouvez pas connaître la longueur. – Joel

Répondre

4

Vous renvoyez un pointeur sur le premier élément du tableau.

Pour accéder aux éléments du tableau ayant juste appelé string* arr = getArray();, vous pouvez utiliser arr [0], arr [1], arr [2] etc. pour accéder aux chaînes. N'oubliez pas toutefois de supprimer la mémoire que vous avez allouée dans la fonction; en ce moment vous avez une grosse fuite de mémoire.

Généralement, ce n'est pas une bonne programmation car l'appelant de fonction ne sait pas combien d'éléments il y a dans le tableau retourné. Il serait préférable d'obtenir le nombre d'animaux dans l'appelant et le transmettre dans votre fonction.

Mieux encore, reconstruisez votre code pour utiliser std :: vector car je vois que vous utilisez déjà stl. Ensuite, vous n'avez pas à vous soucier (explicitement) de l'allocation de la mémoire et de la désallocation.

+1

+1. En outre, je suggère de passer n à getArray() comme paramètre et de faire quelques vérifications de santé mentale dessus. – AlexK

+2

Bon point AlexK +1. Personnellement, je n'aime pas non plus le code qui alloue de la mémoire dans une fonction et c'est le travail de l'appelant de le libérer. – Bathsheba

3

Vous n'avez pas besoin de lire le nombre d'éléments deux fois, et le type du anim doit être string*, pas string* []. Malheureusement, ce ne serait pas vous dire le nombre d'éléments dans le tableau, vous devez donc obtenir du getArray, par exemple, comme ceci:

string* getArray(int& nanim) { 
    // Remove the declaration of nanim, and keep the rest of the code unchanged 
    ... 
} 

int main() 
{ 
    int n; 
    string* anim = getArray(n); 
    for (int i=0; i != n; i++) { 
     cout << anim[i] << endl; 
    } 
    delete[] anim; 
    return 0; 
} 

Ce n'est pas une solution optimale C++, si vous serait beaucoup mieux d'utiliser std::vector au lieu d'un tableau, parce que le vecteur se développe dynamiquement, et sa taille est retournée avec le conteneur lui-même. Il n'y aurait pas besoin de delete[] le résultat soit, ce qui simplifierait considérablement votre code:

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

vector<string> getVector() 
{ 
    int nanim; 
    cout << "Enter the number of animals: "; 
    cin >> nanim; 
    vector<string> res; 
    for (size_t i=0; i < nanim; i++) 
    { 
     cout<< "\nEnter id anim "<< i+1 << ": "; 
     string tmp; 
     cin >> tmp; 
     res.push_back(tmp); 
    } 
    return res; 
} 

int main() 
{ 
    vector<string> anim = getVector(); 
    for (size_t i = 0; i < anim.size(); i++) 
    { 
     cout << anim[i] << endl; 
    } 
    return 0; 
} 
+0

+1 pour l'utilisation de vecteur. – Joel

+0

Comment puis-je faire cela en utilisant un vecteur? – user2386222

+0

@ user2386222 Jetez un oeil à la modification. Voici le même code qui s'exécute sur ideone: [link] (http://ideone.com/2xct7B). – dasblinkenlight

Questions connexes