Return int[2] compromis [Résolu]

Messages postés
427
Date d'inscription
mercredi 2 juillet 2014
Statut
Membre
Dernière intervention
19 septembre 2019
-
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
}

je ne comprend pas mes erreurs
dans le cour de open classrooms, il disent bien que pour retourner un pointeur il faut ecrire la variable avec un '&' et pourtant je me retrouve avec des erreurs
https://openclassrooms.com/courses/programmez-avec-le-langage-c/les-pointeurs-1
auriez vous un petit coup de pousse ?
Afficher la suite 

3 réponses

Messages postés
427
Date d'inscription
mercredi 2 juillet 2014
Statut
Membre
Dernière intervention
19 septembre 2019
0
Merci
j'ai déjà trouvé comment régler le problème du retour
int* fonction(void){
 int nbElem = 5,
     retour[2] ;
 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 ;
}

mais reste encore une erreur
Commenter la réponse de ati14
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
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;



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Messages postés
418
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
12 octobre 2019
2
0
Merci
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 :
void fonction( int (&tab)[2] ) {
   tab[0] = 1;
   tab[1] = 2;
}
Encore une fois, une fonction ne peut pas retourner un tableau brut.

Evidemment la solution C++ de cptpingu est de loin l'exemple à suivre.
Commenter la réponse de Dalfab