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 :

Taille de tableau variant au passage dans une fonction


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut Taille de tableau variant au passage dans une fonction
    Salut !
    Voilà mon problème, lorsque je définis un tableau et que je le passe dans une fonction, sa taille à l'intérieur de la fonction n'est plus la même, comme s'il était vide, alors que, même dans la fonction, ses élements sont inchangés.

    Ex :
    void probleme(double t[])
    {
    cout<< (sizeof(t))<<endl;
    }

    void main()
    {
    double t[]={15.,12.};
    probleme(t);
    cout<<(sizeof(t))<<endl;
    }

    Cette fonction renvoie 4 et 16 et pourtant, dans la fonction, le tableau est bien {15,12} et on peut accéder à ses éléments.
    Cela pose problème car je veux me servir de la taille pour calculer le nombre d'éléments du tableau dans ma fonction.
    Celle-ci servira à convertir un tableau en vecteur, qui est plus simple à utiliser dans les fonctions.
    Le problème est que, contrairement aux tableaux, les vecteurs ne sont pas simples à initialiser et on doit donner leurs valeurs une à une, d'où l'utilité de ma fonction.

    Merci à qui pourra m'aider !

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    La fonction recoit un pointeur sur double donc taille 4 char.
    Le tableau contient 2 double donc 2*8=16 char.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Je croyais que lorsqu'on écrivait ainsi, le tableau devait être recopié ! Si c'est un pointeur alors ça signifie que je modifie directement mon tableau à l'intérieur de cette fonction ?

    Sinon, comment pourrais-je obtenir sa "vraie" taille dans ma fonction ?

    Edit: Suite à une erreur, j'avais posté plusieurs fois ce message, désolé.

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    On ne peut pas connaitre sa vraie taille.
    Il faut soit:
    -la passer en paramètre à la fonction
    -l'indiquer au début du tableau
    -mettre une sentinelle à la fin du tableau pour indiquer sa fin.
    C'est pourquoi avec les chaines de caractères bien construites le problème ne se pose pas car elles finissent par la sentinelle '\0'.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Ok, merci beaucoup !
    Je passerai donc le nombre d'éléments en paramètres !
    Ceci suffira.
    Sinon, si j'avais eu beaucoup besoin de la fonction, j'aurai pu lire les éléments un à un jusqu'à ce qu'il y ait une exception, et m'arrêter alors !

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Sinon, si j'avais eu beaucoup besoin de la fonction, j'aurai pu lire les éléments un à un jusqu'à ce qu'il y ait une exception, et m'arrêter alors !
    Il n'y a d'erreur que quand le débordement est critique, quand on tente de lire hors de la mémoire allouée au programme par le système et donc on peut lire des données hors du tableau sans que rien ne l'indique.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Ok !
    Bon ben alors finalement comme cette fonction me sera utile, je vais utiliser une sentinelle en mettant 0 à la fin de mon tableau (qui ne comporte que des nombres strictement positifs).

    Merci pour ton aide !

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu ne manipules que des tableaux non dynamiques, il existe une feinte à base de template pour récupérer leur taille automatiquement.

  9. #9
    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 koushkov
    Le problème est que, contrairement aux tableaux, les vecteurs ne sont pas simples à initialiser et on doit donner leurs valeurs une à une, d'où l'utilité de ma fonction.
    C'est effectivement un problème. Des gens ont fait des propositions pour qu'il soit corrigé dans des prochaines versions de la norme.

    Si la taille de ton tableau est connue à la compilation (constante ou pouvant être templatiser), tu peux aussi utiliser boost::array qui permet une syntaxe d'initialisation simple, et a des fonctions membre comme size.

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Ok !
    Donc je vais finalement utiliser boost::array pour initialiser, puis convertir en vecteur car cette opération ne sera réalisée qu'une fois par exécution et va me permettre une manipulation simple des objets.
    Merci pour votre aide !

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Si tu ne manipules que des tableaux non dynamiques, il existe une feinte à base de template pour récupérer leur taille automatiquement.
    On peut voir?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <typename T, std::size_t N>
    std::size_t SizeOf(const T (&)[N])
    {
        return N;
    }
     
    int Tab[] = {1, 34, 57, -45};
    std::cout << SizeOf(Tab); // Affiche 4
    Pratique pour ne pas se trimballer la taille du tableau lorsque le compilo la connait déjà.

  13. #13
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Merci pour l'astuce !
    Ceci va me faciliter encore plus la tache !

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Laurent Gomilla => alors c'est le compilo qui compte les éléments du tableau tout seul, il va chercher les infos dont il a besoin pour construire la fonction template?
    Comment se fait il qu'il fasse cela tout seul comme un grand?

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par seriousme
    Laurent Gomilla => alors c'est le compilo qui compte les éléments du tableau tout seul, il va chercher les infos dont il a besoin pour construire la fonction template?
    Comment se fait il qu'il fasse cela tout seul comme un grand?
    Pour les tableaux statiques, le compilo connaît la taille dès la création et la mémorise, il n'a pas besoin de la recalculer. Tu pourras le remarquer par exemple si tu tentes de passer un tableau à 5 éléments là où tu en demandes 4 par exemple ; il te dira bien qu'il y a un élément de trop.

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ce que je trouve excellent c'est que le compilo va lui même chercher tous les éléments dont il a besoin pour construire la fonction template.
    Je ne savais pas les templates si puissant, ça frôle l'IA.
    Par contre pourquoi le "(&)" est il nécessaire dans la liste des paramètres?

  17. #17
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par seriousme
    Ce que je trouve excellent c'est que le compilo va lui même chercher tous les éléments dont il a besoin pour construire la fonction template.
    Je ne savais pas les templates si puissant, ça frôle l'IA.
    Ouais, et ce genre d'astuces n'étaient pas prévues au départ. C'est à partir de ces astuces qu'est née la "méta-programmation". C'est même pas du C++ mais ça génère du C++ (d'où le nom 'méta').

  18. #18
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Juste comme ca une autre solution simple si on ne connait pas la taille du tableau à la compilation est tout simplement de calculer la taille juste apres la creation du tableau et de la passer en argument bien que ça rende le programme un peu moins "propre".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage dans une fonction
    Par ptitsoleil87 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/10/2009, 13h56
  2. Tableau de char[] passé dans une fonction
    Par Joratois dans le forum C
    Réponses: 26
    Dernier message: 07/06/2007, 15h06
  3. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  4. Trace ascii du passage dans une fonction
    Par ryko dans le forum Delphi
    Réponses: 4
    Dernier message: 10/05/2006, 21h06
  5. Réponses: 6
    Dernier message: 03/02/2006, 19h45

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