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++Builder Discussion :

Passage d'un tableau à une fonction


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut Passage d'un tableau à une fonction
    Bonjour,

    j'ai un tableau d'AnsiString à 2 dimensions déclaré comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString itemStr[2][500];
    J'aimerai le passer en argument à une fonction.
    Comment dois-je prototyper ma fonction ?
    Que dois-je mettre dans l'appel à cette fonction ?

    Merci

  2. #2
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Il suffit de déclarer le paramètre de la même forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    int fct(AnsiString param[2][500])
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    int fct(AnsiString param[][])
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
     int fct(AnsiString ** param)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {           AnsiString **a=new  AnsiString*[3];
    //a[0][
    for(int i=0;i<3;i++) {
     
    		a[i] = new AnsiString[4];
     
    	}
    a[0][1]="e";
    traiter_string(a);
     
    }
    //---------------------------------------------------------------------------
     
     
    TForm1::traiter_string(AnsiString **a)
    {
            //TODO: Add your source code here
     
           ShowMessage("jaffiche le contenu de la chaine [0][1]: "+a[0][1]);
     
    }

    à toi de voire

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    j'ai rapidement fais un exemple de matrice de taille [3][4] donc à toi de voire la taille que tu veux.

    n'oublies pas la désallocation.

    Good luck.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    J'ai essayé la méthode avec les [][] mais le compilo me fait un message d'erreur :
    E2453 La taille du type 'AnsiString[]' est inconnue ou zéro

    J'ai essayé la méthode avec **, la compil passe pour la fonction mais pas pour l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString mastr[2][500];
    fct(mastr);
    Message d'erreur : E2285 Impossible de trouver une correspondance pour 'fct(AnsiString ( *)[500])'

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Est ce que t'as fais l'initialisation de la matrice avant le passage?

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    oui

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    peux tu poster un bout de code juste pour l'essayer chez moi. pcq mon exemple tourne sur ma machine.

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    Code d'initialisation et d'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AnsiString tabstr[2][MAXPRO];
    int i;
     
    for(i=0;i<preitem;i++)
    {
                    tabstr[0][i]=itemStr[0][i];
                    tabstr[1][i]=itemStr[1][i];
    }
    fct(tabstr);
    Code de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    __fastcall fct(AnsiString **KS)
        : TForm(Owner)
    {
    //CODE DE LA FONCTION
    }

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Oui,

    Dans la déclaration de ton tabstr[2][MAXPRO]; t'as fixé la taille de la matrice , or dans l'appel de la fonction (AnsiString **KS), c'est des pointeurs pour l'allocation dynamique,
    donc soit:
    1/
    tu déclares tabstr[2][MAXPRO] ; // dans le .h ajoutes le #define MAXPRO
    la fonction sera fct(AnsiString KS[2][MAXPRO]

    2/ ou:
    tu déclare comme mon exemple avec des pointeur et tu fais l'allocation dynamique

    donc sa sera: AnsiString **tabstr; // donc la fonction principale
    AnsiString **KS; // pour la fonction à appeler.


    Sa marchera.



    Citation Envoyé par futneguet Voir le message
    Code d'initialisation et d'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AnsiString tabstr[2][MAXPRO];
    int i;
     
    for(i=0;i<preitem;i++)
    {
                    tabstr[0][i]=itemStr[0][i];
                    tabstr[1][i]=itemStr[1][i];
    }
    fct(tabstr);
    Code de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    __fastcall fct(AnsiString **KS)
        : TForm(Owner)
    {
    //CODE DE LA FONCTION
    }

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    Et quelle est la meilleure solution au niveau de la gestion mémoire ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Bien sur en (new **).

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    Ok. Merci

    Pour la désallocation, tu fais comment stp ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(int i=0; i<2;i++){
    delete TA_MATRICE[i];
    }
     
    delete [] TA_MATRICE;

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Récapitulons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     AnsiString **a;//////////  déclaration de la matrice
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
     
     
    {
    // allocation
     a=new  AnsiString*[500];
     
     for(int i=0;i<2;i++) {
     
    		a[i] = new AnsiString[500];
     
    	}
    a[0][1]="e";
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    //libération 
    for(int i=0;i<2;i++)
    {
    delete a[i];
    }
    delete [] a;
     
    }
    //---------------------------------------------------------------------------

  16. #16
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    T'es sur de la déclaration de la matrice ?
    Je veux quelle ait 2 colonnes et 500 lignes.

    C'est pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a=new  AnsiString*[2]; 
     for(int i=0;i<2;i++)
     {
     
    		a[i] = new AnsiString[500];
     
    	}

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    oui inverses

  18. #18
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Peut être aussi envisager une modélisation appropriée.
    En dérivant de TComponent :
    - on dote la classe d'une TList pour gérer des TStringList.
    - et on rajoute une propriété tableau !

    Ceci dit ... ce serait juste pour le "fun" parce que... TStringGrid (même invisible) le fait très très bien (... les tableau de chaînes) !

    Au quel cas, ça se résume à passer un pointeur sur l'objet !

    A plus !

  19. #19
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par défaut
    Merci. J'ai pris l'option avec pointeur et ça marche.

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    Salut,

    Oui en effet, quand je suis confronter à ce genre de problème j'utilise souvent la sollution qui m'a été proposé au départ par Sat83 en utilisant des TObjectList de TStringList:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    //création du TObjectList  
      TObjectList *list = new TObjectList(true);
    //création de 2 TStringList et on les ajoute dans la liste
      for( int i=0; i<2; i++)
      {
     
        //on alloue la mémoire pour unTStringList
        TStringList *tmp = new TStringList() ;
        tmp->Clear();
        //on l'ajoute a la liste
        list->Add( tmp );
     
      }
     
    //---------------------Acces à la cellule [x][y]
     
    ShowMessage( ((TStringList*)list->Items[x])->Items[y] ) ;


    Citation Envoyé par henderson Voir le message
    Salut !

    Peut être aussi envisager une modélisation appropriée.
    En dérivant de TComponent :
    - on dote la classe d'une TList pour gérer des TStringList.
    - et on rajoute une propriété tableau !

    Ceci dit ... ce serait juste pour le "fun" parce que... TStringGrid (même invisible) le fait très très bien (... les tableau de chaînes) !

    Au quel cas, ça se résume à passer un pointeur sur l'objet !

    A plus !

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

Discussions similaires

  1. bug lors du passage d'un tableau à une fonction
    Par raplapente dans le forum Débuter
    Réponses: 4
    Dernier message: 16/09/2009, 14h00
  2. Passage de tableau à une fonction: pb de debugger
    Par Felipe_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/12/2007, 09h26
  3. Réponses: 11
    Dernier message: 27/06/2007, 15h06
  4. Passage de tableau à une fonction par pointeur
    Par progfou dans le forum C++
    Réponses: 15
    Dernier message: 23/02/2007, 11h45
  5. Réponses: 8
    Dernier message: 10/03/2006, 17h28

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