ati14
Messages postés423Date d'inscriptionmercredi 2 juillet 2014StatutMembreDernière intervention 7 décembre 2019
-
Modifié le 10 juin 2018 à 17:14
Dalfab
Messages postés704Date d'inscriptiondimanche 7 février 2016StatutMembreDernière intervention19 mai 2023
-
14 juin 2018 à 14:27
Bonjour, je suis dans le développement d'une fonction qui dois renvoyer une liste
je me débrouille mais j'ai un problème, je dois renvoyer un pointeur par un int
je m'explique:
j'ai une fonction disons fonction qui possède une liste et un int
nbElem c'est le nombre d’élément dans ma liste
ptrElem c'est le pointeur sur la liste d’éléments
je voudrais que ma fonction retourne un vecteur de 2 int avec dans la première case le nombre d’élément et dans l'autre case le pointeur des éléments
int fonction(void){
int nbElem = 5,
retour[2] ; //variable de retour
string *ptrElem ;
ptrElem = new string[nbElem] ;
for(int i=0;i<nbElem;i++){
ptrElem[i] = i ;
}
retour[0] = nbElem ;
retour[1] = &ptrElem ; //erreur
delete ptrElem ;
ptrElem = NULL ;
return &retour ; //erreur
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023124 Modifié le 10 juin 2018 à 20:35
Bonjour.
Je vois du "delete", donc c'est censé être du C++. Dans ce cas pourquoi ne pas utiliser les std::vector, tout simplement ?
Sinon pour répondre techniquement à ta question, la syntaxe est bonne mais ça ne peut pas fonctionner. En effet, tu déclares une variable locale (donc qui sera détruite au sortir de la fonction), mais tu renvoies l'adresse de celle-ci (qui je le rappelle sera déjà détruite au moment de la récupérer).
De même, dans ta fonction corrigée, tu delete ptrElem, donc ça ne va pas bien se passer pour qui voudra l'utiliser. C'est à l'utilisateur de la supprimer, mais pas à la fonction.
En mode "C" (bof):
std::string* fonction(int* nbElem)
{
*nbElem = 5,
std::string* ptrElem = new string[nbElem];
for (int i = 0; i < *nbElem; ++i)
ptrElem[i] = i ;
return ptrElem;
}
int nbElem = 0;
std::string* tab = fonction(&nbElem);
std::cout << nbElem << std::endl;
delete[] tab;
En mode "C" (un peu moins bof):
std::pair<std::string*, int> fonction()
{
std::pair<std::string*, int> p;
p.second = 5,
p.first = new string[nbElem];
for (int i = 0; i < p.second; ++i)
p.first[i] = i ;
return p;
}
std::pair<std::string*, int> pair = fonction();
std::cout << p.second << std::endl;
delete[] p.first;
En mode "C++" (mieux):
std::vector<std::string> fonction()
{
std::vector<std::string> tab;
for (int i = 0; i < 5; ++i)
tab.push_back(i);
return tab;
}
std::vector<std::string> tab = fonction();
std::cout << tab.size() << std::endl;
Dalfab
Messages postés704Date d'inscriptiondimanche 7 février 2016StatutMembreDernière intervention19 mai 202311 14 juin 2018 à 14:27
Une des raisons qui fait que l'on ne doit pas utiliser les tableaux bruts est :
un tableau brut n'est pas un objet, il est impossible de le transmettre en paramètre (sauf par référence) et il est impossible de le transmettre par retour de fonction.
On peut faire remplir un tableau brut par une fonction en écrivant :