Return int[2] compromis [Résolu]

ati14 425 Messages postés mercredi 2 juillet 2014Date d'inscription 10 juin 2018 Dernière intervention - 10 juin 2018 à 17:12 - Dernière réponse : Dalfab 362 Messages postés dimanche 7 février 2016Date d'inscription 21 octobre 2018 Dernière intervention
- 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 ?
Afficher la suite 

Votre réponse

3 réponses

ati14 425 Messages postés mercredi 2 juillet 2014Date d'inscription 10 juin 2018 Dernière intervention - Modifié par ati14 le 10/06/2018 à 17:23
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
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 10/06/2018 à 20:35
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
Dalfab 362 Messages postés dimanche 7 février 2016Date d'inscription 21 octobre 2018 Dernière intervention - 14 juin 2018 à 14:27
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.