IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

retour de pointeur par une fonction


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut retour de pointeur par une fonction
    Bonjour,
    J'etudies en ce moment le c++ et dans un des exercices ke je dois rendre, une fonction a pour role de copier certaines valeur de deux tableaux distincts dans un tableau de plus grande taille.Dans l'énoncé on indique que le prototype de la fonction doit etre " dans u j'ai un prototype de fonction qui m'est fourni " int * vecCat(int * vec1,int * vec2); " et je ne comprend pas comment faire, je crois que la fonction renvoie un pointeur sur un int mais donc est ce que le pointeur renvoyé pointera vers la premiere case de mon tableau je comprends pas trop.
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Tu peux aller dire à ton prof que c'est un con, il n'y a aucun moyen de connaitre la taille des trois tableaux avec un prototype pareil.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut
    Nan mais les tableaux censés etre passés en parametre dans la fonction sont declarés dans le main(avec taille fixé sans utiliser l'allocation dynamique de mémoire) donc je connais la taille des tableaux ceux sont deux tableaux de 200 int chacun,donc le nouveau tableau doit normalement etre de 400 int voila
    Mais le probleme c'est que je ne sais pas comment utiliser la fonction donnée précedemment pour résoudre la question,est ce que vecCat sera un pointeur sur la premiere case de ce nouveau tableau?

    je vous montre quand meme ce que j'ai fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int * vecCat(int * vec1,int * vec2)
    {
    	int i;
    	for (i=0;i<vecLen(vec1);++i)
    		*(vecCat+i)=*(vec1+i);
        for (       ;i<=vecLen(vec1)+vecLen(vec2);++i)
    		*(vecCat+i)=*(vec2+i);
     
    }
    Voila ca c'est la définition de la fonction mais ca me donne erreur de compilation donc je ne sais pas.
    Sinon vecLen c'est une fonction qui renvoie la taille du tableau en parametre donc dans ce cas vec1 ou vec2.
    Merci

  4. #4
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    1 - Tu as raison, tu devra renvoyer l'adresse de la première case du nouveau tableau.
    2 - Ta fonction doit renvoyer quelque chose, ce qui n'est pas le cas dans ton code
    3 - Tes vecCat partout, c'est louche.
    4 - Encore un devoir scolaire.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut
    Je sais que ma fonction ne renvoie rien pour l'instant, sa définition n'est pas terminée mais justement c'est ma question, si je met "return vecCat;" ca me renverra l'adresse de quoi je pige pas trop tout ca jusque là je travaillez pas sur des retours de fonctions pareils.

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Tu peux aller dire à ton prof que c'est un con, il n'y a aucun moyen de connaitre la taille des trois tableaux avec un prototype pareil.
    +1

    Pour faire ça proprement, il faut passer la taille des tableaux en plus... Ou alors prendre un std::vector, mais là on sort complètement du domaine de compétence du prof !


  7. #7
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par poukill
    Pour faire ça proprement, il faut passer la taille des tableaux en plus... Ou alors prendre un std::vector, mais là on sort complètement du domaine de compétence du prof !
    Ben, il faut comprendre aussi le prof, c'est un exercice.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut
    Bah le prof est docteur en informatique il sait ce qu'il fait.
    Je vous donne l'énoncé:
    Il ya une fonction nommé vecInput qui permet de remplir un tableau avec des valeurs jusqu'a qu'on insere une valeur négative.
    Donc la structure du tableau est:
    1)premiere partie de nombre positifs
    2)un nombre négatif
    3)puis des valeur présentes en memoire(car pas d'initialisation)
    Maintenant si j'ai deux tableaux comme cela, on me demande dans une question de copier ces nombres positifs de chaque tableau dans un troisieme tableau,donc la structure du troisieme tableau est:
    1)premiere partie nombres positifs issus du premier tableau
    2)deuxieme partie nombres positifs issus du deuxieme tableau
    Il s'agit de réaliser cette tache à l'aide d'une fonction dont le prototype est
    int * vecCat(int * vec1,int * vec2);
    voila
    si quelqu'un a une solution.
    Merci

  9. #9
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par Miko95
    si quelqu'un a une solution.
    Normalement, c'est toi qui devrais trouver la solution (tout seul), sinon, ce ne serait pas TON devoir, ici, on te donne simplement un petit coup de pouce.

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut
    Je suis daccord mais là j'ai bien cherché et je ne vois pas de solution donc si quelqu'un a une idée

  11. #11
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    à mon humble avis il ne faut pas manipuler le nom de la fonction.


    il faut créer un tableau temporaire pendant la fonction, tu le remplis comme il faut, et tu retourneras en effet l'adresse du premier élément (c'est à dire un pointeur vers le premier élément dans ton cas).

    (NB : un nom de tableau est un pointeur vers le premier élément de celui ci)

    maintenant attention. Apparemment le tableau à 400 places sera crée pendant la fonciton.

    si tu crées simplement un tableau : int monTableauTemporaire[400]; et que tu retournes un pointeur vers le premier élément, tu auras des résultats extrêmement bizarre lorsque tu voudras acceder à ton tableau (et probablement des erreurs à l'exécution).

    En effet, lorsque tu pars de la fonction, toutes les variables déclarées dedans sont détruites (c'est la visibilité des variables, ou "variable scope"), y compris ton tableau. Donc le pointeur pointera sur rien du tout (ou plutot une adresse mémoire qui ne contiendra plus ton tableau).

    Pour créer un tableau (ou n'importe quelle variable) pendant une fonction, et faire en sorte qu'il persiste même après la fonction, il faut le créer dynamiquement avec new [].

    qqchose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    // pas sur que ça compile comme ça mais qqchose dans le genre.
    int * monTableauTemporaire = new int[400];
     
    ...
     
    return monTableauTemporaire;
    Je ne vois que ça comme intéret de l'exercice, utiliser new pour créer des tableaux dynamiques dans une fonction.


    Par contre attention. Il faut ABSOLUMENT détruire ce tableau crée avec new [] en utilisant delete [] dans ton main. (avec des crochets, sinon tu ne détruit que le premier élément du tableau)

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut
    Merci pour la réponse j'avais pensé à ca,mais le probleme est que l'on n'a pas appris encore l'allocation dynamique de mémoire(je l'ai appris seul j'aime bien m'avancer) donc je ne pense pas qu'il faut utiliser ca,bien que ca peut etre possible.Sinon sans utiliser l'alloc dynamique, il n'y aurait pas un moyen de déclarer le tableau dans la fonction de sorte à ce que celui ci ne soit pas detruit en sortant de la fonction?(sans utiliser l'alloc dynamique bien sur)
    Merci

  13. #13
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par Miko95 Voir le message
    Merci pour la réponse j'avais pensé à ca,mais le probleme est que l'on n'a pas appris encore l'allocation dynamique de mémoire(je l'ai appris seul j'aime bien m'avancer) donc je ne pense pas qu'il faut utiliser ca,bien que ca peut etre possible.
    Je suis d'accord avec toi, sans l'avoir vu je ne vois pas comment il peut te demander de l'utiliser. (ou alors en effet ton prof est un c** )

    Citation Envoyé par Miko95 Voir le message
    Sinon sans utiliser l'alloc dynamique, il n'y aurait pas un moyen de déclarer le tableau dans la fonction de sorte à ce que celui ci ne soit pas detruit en sortant de la fonction?(sans utiliser l'alloc dynamique bien sur)
    Merci
    toute variable déclarée n'est accessible que depuis le bloc ou elle a été déclarée (portée), c'est à dire fonction, bloc divers commme boucles, if, ... ou au niveau global si déclarée hors d'une fonction.

    Elle est bien détruite (c'est à dire la mémoire qui correspond n'est plus allouée au programme) après le bloc. Donc ton pointeur existera toujours (il pointera vers l'adresse ou le tableau est crée), mais tu auras beau remplir le tableau comme tu veux, si le tableau est crée dans la fonction, à la sortie il n'y aura plus les valeurs que tu y auras mises.

    Ou plutot : il peut très bien y avoir encore les valeurs de ton tableau dans cette zone de mémoire, mais tu n'as aucune garantie que ce soit le cas, car la mémoire est désallouée (il ne me semble pas que je dis de bêtises, mais si c'est le cas n'hésitez pas à me le signaler). Le système d'exploitation pourrais très bien utiliser ce morceau de mémoire pour autre chose.

    Donc c'est une pratique très très dangereuse et complétèment déconseillée.

    Par contre il est possible d' *ajouter* les éléments de deuxième qu'il faut au premier tableau, si celui si est assez grand pour les contenir. Mais dans ce cas je ne vois pas l'intéret de faire que la fonction retourne un pointeur, puisqu'il n'y a pas de nouveau tableau crée.

  14. #14
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Et toujours concernant la dernière question, un petit ajout qui pourrait être la solution :

    On peut utiliser un tableau static dans la fonction. ce qui fait que la variable conserve son contenu entre les appels (bien qu'on ne puisse pas y accéder directement hors de la fonction, mais avec un pointeur ça commence à prendre du sens).
    Personnellement je ne trouve pas cette méthode très propre mais c'est faisable.

    as-tu appris ce qu'était une variable static ?

  15. #15
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Points : 74
    Points
    74
    Par défaut
    Non on a pas encore appris mais finalement il me parait louche cet exercice je verrai avec le prof.Sinon merci pour votre aide à tous,meme si le probleme n'est pas résolu j'en aurai appris des choses.
    Merci tout le monde.

  16. #16
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Et puisque c'est un exercice, pourquoi ne pas la faire tout simplement globale?

  17. #17
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par zabibof Voir le message
    Et puisque c'est un exercice, pourquoi ne pas la faire tout simplement globale?


    oui bien sur c'est plus simple.

    mais ça ne nous dit toujours pas pourquoi la fonction doit retourner un pointeur.

    Par curiosité, monsieur l'Auteur du Post, si tu repasses par là explique nous ce que c'était

  18. #18
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Miko95 Voir le message
    Bah le prof est docteur en informatique il sait ce qu'il fait.
    Ca ne prouve rien...

    Comme remarquais je ne sais plus qui, tous les thésards scientifiques de sa connaissance utilisaient un ordinateur la majeure partie de leur temps, sauf un seul : Un qui faisait une thèse d'informatique...

    Etre un bon thésard en informatique ne demande pas tant d'être un bon développeur, mais d'être un bon théoricien. Après, rien n'empêche d'être aussi bon codeur, mais c'est annexe.

Discussions similaires

  1. Réponses: 13
    Dernier message: 26/03/2011, 07h31
  2. Réponses: 9
    Dernier message: 22/02/2010, 13h49
  3. Réponses: 11
    Dernier message: 07/01/2008, 19h47
  4. [Système] retour de résultats par une fonction
    Par maximenet dans le forum Langage
    Réponses: 7
    Dernier message: 18/09/2006, 21h32
  5. [POO] Retour de données par une fonction (return)
    Par webrider dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2006, 21h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo