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 :

Aide vecteur, je sèche


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut Aide vecteur, je sèche
    bonjour à tous,
    voici mon problème, je souhaite créer un tableau de taille correspondante au nombre d'enregistrements trouvés dans ma base de données.

    Seulement impossible d'initialiser la taille de mon tableau !

    Voici mon code :

    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
    	// Déclaration des variables
    	int nbrDate = 0 ;
    	int NbrEnregistrement;
    	// Requête SELECT sur ma tabe dates_tbl
    	Query1->Close();
    	Query1->SQL->Clear() ;
    	Query1->SQL->Add("SELECT id_date,date_calendrier FROM Dates_tbl ");
    	Query1->SQL->Add("WHERE date_calendrier='"+date+"'");
    	Query1->Open();
    	// Récupération du nombre d'enregistrements trouvés
    	NbrEnregistrement = Query1->RecordCount ;
    	// On se place sur le premier enregistrement
    	Query1->First();
    	// Création du vecteur avec comme taille le nombre d'enregistrements trouvés
    	int vectNbrId_date[NbrEnregistrement];
    	// Tant que l'on a pas parcouru tous les enregistrements
    	while(!Query1->Eof){
    		// Je met dans mon vecteur les valeurs de id_date trouvées
    		vectNbrId_date[nbrDate] = Query1->FieldByName("id_date")->AsInteger ;
    		// Je passe à la valeur du tableau suivante
    		nbrDate = nbrDate+1;
    		// Je passe à l'enregistrement suivant
    		Query1->Next();
    	}
    Et voici l'erreur de compilation :
    [BCC32 Erreur] FenPrinc.cpp(1301): E2313 Expression constante nécessaire
    J'ai bien vu ça : http://www.developpez.net/forums/d68...ant-dynamique/
    Mais ça m'a l'air assez compliqué pour pas grand chose...

    Quelqu'un connaitrait-il une astuce pour réaliser ça ?

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Soit tu réalise une requête SQL COUNT() pour connaitre le nombre d'enregistrement, soit tu peux regarder la propriétée RecordCount de ton TQuery.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Tu veux dire ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int vectNbrId_date[Query1->RecordCount];
    J'obtiens la même erreur..

  4. #4
    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 !

    Et en essayant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int *vectNbrId_date = new int[NbrEnregistrement];
    Et dans ce cas, ne pas oublier de libérer le tableau sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete [] vectNbrId_date;
    A plus !

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Je n'ai plus d'erreur mais mon vecteur a toujours une taille de 1,
    à la fin de la boucle j'ai
    vectNbrId_date[0]=126
    avec 126 qui correspond bien à ma première valeur de ma table.

    Bizarre que mon vecteur de change pas de taille :/

    Voici le code :
    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
    	// Déclaration des variables
    	int nbrDate = 0 ;
    	int NbrEnregistrement;
    	// Requête SELECT sur ma tabe dates_tbl
    	Query1->Close();
    	Query1->SQL->Clear() ;
    	Query1->SQL->Add("SELECT id_date,date_calendrier FROM Dates_tbl ");
    	Query1->SQL->Add("WHERE date_calendrier='"+date+"'");
    	Query1->Open();
    	// Récupération du nombre d'enregistrements trouvés
    	NbrEnregistrement = Query1->RecordCount ;
    	// On se place sur le premier enregistrement
    	Query1->First();
    	// Création du vecteur avec comme taille le nombre d'enregistrements trouvés
    	int *vectNbrId_date = new int[NbrEnregistrement];
    	// Tant que l'on a pas parcouru tous les enregistrements
    	while(!Query1->Eof){
    		// Je met dans mon vecteur les valeurs de id_date trouvées
    		vectNbrId_date[nbrDate] = Query1->FieldByName("id_date")->AsInteger ;
    		// Je passe à la valeur du tableau suivante
    		nbrDate = nbrDate+1;
    		// Je passe à l'enregistrement suivant
    		Query1->Next();
    	}
    	delete [] vectNbrId_date;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut Création d'un tableau
    Bonjour,
    Il faut vérifier sous debug,ou par écritures de contrôle,la valeur de Query1->RecordCount , à combien le tableau a été dimensionné,combien de fois la boucle while est parcourue.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    J'ai déjà fais sous débug,

    Query1->RecordCount = 3

    Donc la taille du vecteur doit être de 3 normalement, et pour la boucle While elle est parcourue 3 fois.

    C'est bien ma taille du vecteur qui foire, par exemple si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int vectNbrId_date[Query1->RecordCount];
    => Erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NbrEnregistrement = Query1->RecordCount ;
    int vectNbrId_date[NbrEnregistrement];
    => Erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int vectNbrId_date[10];
    => Ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define NBRENREGISTREMENT 10
    int vectNbrId_date[NBRENREGISTREMENT];
    => Ça marche

    Je peux pas mettre de valeur "variable" en taille de vecteur, du moins c'est ce l'erreur semble me dire..

  8. #8
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Si tu veux allouer dynamique ment un tableau, il faut utiliser l'opérateur new. Sinon ce que tu as mis dans ton code est une déclaration classique de tableau de taille fixe. Normalement le code suivant devrait fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int NbEnr;
    int *pTablo;
    NbEnr=10;
    pTablo= new int[NbEnr];

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Le compilateur refuse une déclaration de tableau de taille variable.Il faut que le tableau soit de taille constante,ceci est normal.C'est pourquoi les méthodes suivantes marchent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define Nbr 3
    int t[Nbr];
    //ou
    const int Nbr=3;
    int t[Nbr];
    alors qu'il refuse ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int Nbr=3;
    int t[Nbr];
    Pour avoir un tableau de taille variable,il faut le créer dynamiquement par new,ou par une fonction de la famille malloc.

  10. #10
    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 !

    Et il faudrait peut-être faire un test avec une boucle for au lieu du while(...EOF)... au cas où ... et ce, puisque l'on connait RecordCount !

    A plus !

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut __sPiKe__
    pour les tableaux dynamiques il faut voir du cote de la commande vector, voir ce lien

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    J'ai déjà testé avec un taille de tableau dynamique, voilà le code :

    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
    	// Déclaration des variables
    	int nbrDate = 0 ;
    	int NbrEnregistrement;
    	// Requête SELECT sur ma tabe dates_tbl
    	Query1->Close();
    	Query1->SQL->Clear() ;
    	Query1->SQL->Add("SELECT id_date,date_calendrier FROM Dates_tbl ");
    	Query1->SQL->Add("WHERE date_calendrier='"+date+"'");
    	Query1->Open();
    	// Récupération du nombre d'enregistrements trouvés
    	NbrEnregistrement = Query1->RecordCount ;
    	// On se place sur le premier enregistrement
    	Query1->First();
    	// Création du vecteur avec comme taille le nombre d'enregistrements trouvés
    	int *vectNbrId_date ;
    	vectNbrId_date = new int[NbrEnregistrement];
    	// Tant que l'on a pas parcouru tous les enregistrements
    	for(int i = 0 ; i<NbrEnregistrement ; i++){
    		// Je met dans mon vecteur les valeurs de id_date trouvées
    		vectNbrId_date[nbrDate] = Query1->FieldByName("id_date")->AsInteger ;
    		// Je passe à la valeur du tableau suivante
    		nbrDate = nbrDate+1;
    		// Je passe à l'enregistrement suivant
    		Query1->Next();
    	}
    	delete [] vectNbrId_date;
    Et voici le résultat en débugage :

    Après un passage dans la boucle For mon tableau vaut :
    vectNbrId_date[0] = 126
    Donc ça marche mais j'ai que cette case dans mon tableau et non 3, qui correspond au nombre d'enregistrements.
    Pourtant il passe 3 fois dans la boucle mais
    vectNbrId_date[0] = 126
    ne change pas.


    blondelle je vais consulter ton lien merci.
    Images attachées Images attachées   

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Yep bon problème résolu avec le vector, et finallement avec un tableau de taille dynamique sa marche aussi !
    C'est leur truc de débuggage qui n'est pas très clair

    En tout cas merci à vous tous ^^

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

Discussions similaires

  1. aide sur les vecteurs
    Par brf1982 dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/10/2009, 13h49
  2. [AIDE] Problème Vecteur
    Par kikouu dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/01/2008, 17h41
  3. [AIDE] Pb Vecteur
    Par Diablo_22 dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2007, 10h58
  4. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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