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 :

Appeler une fonction avec un tableau en parametre ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut Appeler une fonction avec un tableau en parametre ?
    Bonjour,
    Je suis actuellement nouveau dans le domaine du c++, mais pas en programation (delphi quand tu nous tiens).
    Et je voulais débuter en convertissant un projet delphi que j'avais fait en c++, histoire de bien comprendre ce que je change, et pourquoi je le change.

    Bref, tout ça pour en venir au fait que j'ai un souci au niveau de la syntaxe d'une éxpréssion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PokeMem(0x64D60C,{0x53,0x59,0x53});
    la fonction pokeMem provient de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void PokeMem (DWORD Address,BYTE bytes [], DWORD written)
    selon lui, la syntaxe est incorecte au niveau de mon tableau de byte, ce que je ne comprends pas du tout.

    Si par contre je passe par une variable tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BYTE variable []  = {0x53,0x59,0x53});
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PokeMem(0x64D60C, variable);
    ça fonctionne, mais ce n'est pas ce que je veux.
    Pouvez vous s'il vous plait m'éclairer en m'éxpliquant pourquoi ceci ne fonctionne pas ?
    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
    N'ayant eu que de minuscules cours de pascal il y a bien longtemps (et n'ayant jamais ressenti le désir d'approfondir ces connaissances, par haine pure et simple de la syntaxe) j'hésite sur la sémantique de l'appel de fonction que tu nous as collé. Je vais donc juste t'expliquer comment fonctionnent les tableaux en C++.

    Le type de tableau que tu as écris est un tableau dit C-style. Il est initialisé sur la pile, sa taille est définie à la compilation et (pour des raisons étranges qui poussent encore aujourd'hui les développeurs C à se gratter la tête) il est impossible de le passer en paramètre de fonction. La seule chose que tu puisses faire pour le faire sortir de la fonction en cours est d'extraire un pointeur sur son premier élément et de le passer en argument d'une fonction (avec un peu de sucre syntaxique qui a pour énorme avantage d'empêcher les débutants de comprendre le fonctionnement réel).
    Pour résumer, en C un " truc[] " est strictement équivalent à un " truc* " (dans un prototype de fonction, appliquée à une variable locale cette syntaxe peut désigner un tableau dont la taille est définie implicitement).

    D'après ce que je sais, en Delphi les tableaux intégrés au langage sont de taille dynamique. N'espère pas retrouver une telle aisance en C ni même en C++ qui n'apporte pas de gain de ce coté la.
    Par contre, le C++ dispose de bibliothèques puissantes qui permettent de faire bien plus. Jette un coup d'œil à n'importe quel tutoriel parlant de la stl et consulte le chapitre sur la classe vector, c'est la classe standard pour les tableaux (permet des tableaux de taille dynamique qui s'agrandissent automatiquement).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Euh, ok, merci ...

    Quel histoire pour si peu, merci pour ton approche détaillée de mon probleme, je m'en vais chercher une solution.

    Du coup je vais renomer mon topic pour que ce soit + éxplicite.

    Edit : je comprends pas comment je dois faire .

  4. #4
    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
    Citation Envoyé par devoluti0n Voir le message
    Quel histoire pour si peu
    Et oui, mais que veux-tu, les tableaux du C ancestral au C++ de nos jours sont une longue histoire.
    Citation Envoyé par devoluti0n Voir le message
    Edit : je comprends pas comment je dois faire .
    Ben, je pourrais difficilement te le dire vu que je ne comprends pas ce que tu veux faire.
    En gros il faut comprendre que le C++ est un langage qui a beaucoup évolué et que certains éléments de la syntaxe ne sont tous simplement plus adaptés à une utilisation moderne et ne devraient plus être utilisés. Si tu veux quand même utiliser la syntaxe des tableaux du C et bien garde les deux derniers morceaux de code de ton premier post (et si nécessaire, pense à fournir la taille du tableau en argument supplémentaire de ta fonction), il n'y a pas d'autre façon de faire.
    Sinon, comme je te l'ai dit utilises vector. Tu en trouveras une description ici ainsi que dans plein d'autres cours.

  5. #5
    Membre émérite Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 047
    Points : 2 251
    Points
    2 251
    Par défaut
    Pour passer un tableau en paramètre il te faut 2 paramètre:
    1/ Adresse du tableau. Sachant que int tab[] == int *tab
    2/ Taille de ton tableau. Sizeof(tab)

    Have a nice day !

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    La réponse à ta question de ton premier message : les initialiser lists ne peuvent pas être utilisés autrement que pour le triplet déclarer+définir+initialiser des variables tableaux.
    Il faudra attendre le prochain C++ pour les passer en paramètres.

  7. #7
    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
    Citation Envoyé par Astraya Voir le message
    2/ Taille de ton tableau. Sizeof(tab)
    Mais bon sang, sur le forum C je l'ai vu mentionné un nombre incalculable de fois et malgré ça on entend toujours les mêmes bêtises: sizeof() n'a pas le moindre espèce de rapport avec les tableaux.
    Tu l'utilises si tu veux mais le citer sur le forum ne peut servir qu'à créer la confusion chez les débutants qui ne comprennent pas la différence entre une variable tableau et la syntaxe [] dans le prototype des fonctions.

  8. #8
    Membre émérite Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 047
    Points : 2 251
    Points
    2 251
    Par défaut
    Je m'incline zais_etheal. Je me suis trompé
    Pour la taille du tableau n*sizeof(t[0]) donne la taille du tableau, n fois la taille du premier élément du tableau.
    Sachant que int t[0] est équivalent a int * t ceci me parait correct comme sa.
    Pour obtenir le nombre d'élément du tableau on peut procédé comme ceci:
    sizeof(t)/sizeof(t[0])

    recorrige moi si je me trompe mais sizeof() permet de connaitre la taille en octets d'un objet(soit un nom de type(char,int *,int(*)[4]), soit une expression)

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Chose qui n'est pas capable de percevoir la différence entre un tableau et un pointeur... (non, il n'y a pas équivalence)

  10. #10
    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
    Ce n'est pas à ce genre de chose que je faisais allusion, sizeof() ne renvoie le nombre d'octet qui constitue le tableau que si on a accès à la variable tableau en elle même.
    Vu que dansint[] n'est jamais que du sucre syntaxique pour remplacer int* on voit sans cesse des débutants qui croient que sizeof(x) va leur renvoyer une valeur permettant de déduire la taille du tableau alors que cela renverra invariablement 4 (sur une archi 32 bits habituelle).

    La meilleure solution est encore d'écarter genre de facéties de la syntaxe et d'indiquer simplement la taille du tableau (qui, vu qu'elle est connue à la compilation, est forcément connue du programmeur).

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/12/2012, 17h40
  2. paramètrer une fonction avec un tableau de deux dimensions
    Par dark_geek dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/02/2010, 14h01
  3. [AC-2003] Comment appeler une fonction avec deux paramètres. Erreur '=' attendu
    Par nirG95 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/09/2009, 10h53
  4. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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