Return int[2] compromis

Résolu
ati14 Messages postés 426 Date d'inscription mercredi 2 juillet 2014 Statut Membre Dernière intervention 7 décembre 2019 - Modifié le 10 juin 2018 à 17:14
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 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
}

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 ?

3 réponses

ati14 Messages postés 426 Date d'inscription mercredi 2 juillet 2014 Statut Membre Dernière intervention 7 décembre 2019
Modifié le 10 juin 2018 à 17:23
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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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;


0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 11
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 :
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.
0
Rejoignez-nous