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 :

Problème de choix entre vectors ou liste


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut Problème de choix entre vectors ou liste
    Bonjour,

    Avant de commencer, j'espère que je suis dans la bonne section.
    Je me diriges vers vous, car je ne trouves pas de solutions à mon problème pour mon projet. Ma partie consiste à commander une radio_DSP et un afficheur alpha.
    Pour la radio, je dois envoyer une fréquence ou changer le volume. Cette radio se branche sur USB, mais elle est reconnue comme port COM 4 (port com virtuel). Pour cela, j'utilise la classe de la liaison série rscomm (OuvreRs, FermeRS etc...) Pour envoyer une fréquence simple j'y suis arrivé. J'ai crée une classe Radio_DSP qui hérite de la classe rscomm. Dans la classe Radio_DSP j'ai crée une fonction fréquence: La voici:

    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
    int Radio_DSP::frequence(unsigned char msg[]) {
    char m[]="f";  // déclaration d'un tableau avec f dedans
    char r[]="\r"; // déclaration d'un tableau avec le retour chariot
    char chaine[255]; // déclaration d'un tableau
    int rep;
     
        strcpy(chaine,msg); // met dans le tableau chaine, le tableau msg
        strcat(chaine,r); // met au bout du tableau chaine, ce qui a dans le tableau r
        EmetBytes(m,strlen(m)); // envoie le tableau m
            while(rep!=13) // tant que rep <> 13 alors
                {
                    rep=LisRs();  // lire ce que la radio nous envoie
                }
                Sleep(100); // dormir 100 ms
        EmetBytes(chaine,strlen(chaine));// envoi le tableau chaine
    }
    Voici comment je l'utilise via le programme principal quand j'appuis sur un bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
    char s[]="101900";
    int rep;
            radio->frequence(s);
    }
    Mais cela est trop basique car le prof répète qu'il faut que le code soit réutilisable. Du coup il m'as imposé d'utiliser des vectors ou listes.
    Voici le diagramme de classe que je dois faire:

    En effet, je dois mettre dans une liste ou un vector le nom et la fréquence de la station, et je dois chercher cette station, via la fonction chercherfréquence() et enfin utiliser la fréquence trouvée dans la fonction fréquence().
    Mon problème c'est que je ne vois pas comment créer et utiliser le vector ou la liste dans deux fonctions différentes malgrès avoir lu le cour sur la STL.. Et je ne vois pas quoi mettre dans la fonction cherchefrequence()

    Pouvez vous m'aider ?

    Merci d'avance pour vos réponses

    Cordialement

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut


    En C++Builder, il existe le type String, AnsiString, UnicodeString ... char[] c'est un peu vieillo ! est-ce une volonté du prof d'utiliser des types de base ?

    De plus, tu parles de std::vector ou std:list de la STL, mais en C++Builder, il existe le TStringList pour stocker des chaines que l'on peut rapider affecter par Assign à une TStrings Items d'un TComboBox ou TListBox

    il existe aussi les __property tu pourrais ainsi faire dans la classe TRadio une propriété CurrentFrequency en read write qui permet de changer de station CurrentStation permettrait de lire la station associé à la fréquence mais pourquoi pas aussi d'en changer en gérant une liste de PreSet ou une sorte de RDS avec une propriété
    PreSetCount avec un accesseur read int GetPreSetCount()} et une propriété tableau PreSets[int Index] avec un accesseur read TStationRadio GetPreSet(int Index)TStationRadio contient une String et une TFrequency
    TFrequency gère une frequence en format chaine mais pourquoi pas en format Numérique (entier et flottant), cela serait idéal pour associer un TTrackBar allant de 875 à 1080



    Enfin, finalement, le seul code intéressant à traduire qui produit la liste est je suppose LisRs et pas de bol, c'est le seul que tu n'as pas fourni !

    frequence() est une fonction int sans return ???
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut
    Merci d'avoir répondu à mon post, et désolé de n'avoir pas mis les balises pour le code..

    Ce n'est pas une volonté du prof, mais pour ma part j'ai toujours travaillé avec cette variable, donc je l'ai mise!

    Je prends note des informations que tu m'as donné.

    Pour ce qui est de la fonction LisRs(), qui est dans la boucle Tantque, c'est en faite, quand on envoie à la radio le caractère F, la radio nous envoie Tune\r. Et donc le LisRs() est utiliser pour attendre le \r qui est dans le tampon et dès que j'ai reçu le \r, je peux lui envoyer la fréquence souhaitée.

    Voici le code de LisRs:

    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
    #define MAX 500  // 500*2ms=1s de time out environ
    int Trscomm::LisRs()
    {
    	DWORD lus;
    	BYTE car;
        int rep;
     
    	if(hCom!=INVALID_HANDLE_VALUE)
        {
            int n=0;
            while ( NbCarDispo()==0 && n<MAX)
                {
                Sleep(2);
                n++; //attendre  TIME OUT
                }
            if (n<MAX)
                {
        		if (ReadFile(hCom,&car,1,&lus,NULL)==TRUE)
    	    		rep = car;
        		else
    	    		{
    		    	rep= -2;  // erreur ReadFile
    			    }
                }
            else    rep=-5;   // erreur timeOut
        }
    	else	rep= -1;   // erreur port non ouvert
        return rep;
    }
    Je n'es pas pensé de mettre de return dans ma fonction fréquence() C'est un oublie de ma part.

    J'espère que j'ai apporté plus de précisions à mon problème.

    Merci d'avance pour vos réponses

    Cordialement

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Citation Envoyé par Wedge156 Voir le message
    J'espère que j'ai apporté plus de précisions à mon problème.
    En fait, pas vraiment, je n'avais pas compris que c'est lisRS au sens RS232 !
    Je ne vois pas où ton prof souhaite l'utilisation de liste, tu envoies une fréquence, la radio répond ...

    Je pense déjà que tu devrais séparer la gestion du protocol ... les \r ...
    Je ferais un objet lié à la communication qui se charge du ReadFile et des boucles d'attente, cet objet sera utilisé par Radio

    Demain, tu souhaites changer le protocole, utilise IP au lieu de COM, tu ne changes pas l'objet Radio mais je juste l'objet interne !
    C'est un pas vers la réutilisabilité

    Tu devrais retourner le voir, dis lui que tu ne comprends pas sa demande, il a a pour ça !
    Il est difficile de résoudre ton problème, c'est trop vaste !
    Surtout si tu n'as pas compris sa demande, tu ne peux pas nous l'expliquer et donc on ne peut pas y répondre
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Inscrit en
    Août 2010
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 123
    Par défaut
    Pour le choix entre list ou vector (performances modifications/accès), ça n'a pas vraiment d'importance pour ton projet (il me semble)... tu pourrais faire un truc de ce genre (si j'ai bien compris):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Radio {
       ...
    public:
       Radio(UnicodeString name, float frequency);
       UnicodeString GetName() const;
       float GetFrequency() const;
       ...
    };
     
    std::vector<Radio> radios;
    radios.push_back(Radio("Rmc", 101.5));
    radios.push_back(Radio("Virgin", 102.0));
    ...

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

    On peut aussi dériver de TComboBox ce qui permet de visualiser les stations de radio.

    La classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class jRadio : public TComboBox
    {
    private :
    double Frequency[256];
    public :
     
        __fastcall jRadio(TComponent *AOwner, TWinControl *AParent);
        __fastcall ~jRadio();
     
        void __fastcall Add(AnsiString ACaption, AnsiString AFrequency);
        void __fastcall Add(AnsiString ACaption, double AFrequency);
     
        void __fastcall AOnClick(TObject *Sender);
    };
    Les méthodes :

    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
    __fastcall jRadio::jRadio(TComponent *AOwner, TWinControl *AParent)
        : TComboBox(AOwner)
    {
    Parent = AParent;
    OnClick = AOnClick;
    }
    //---------------------
    __fastcall jRadio::~jRadio()
    {
    }
    //---------------------
    void __fastcall jRadio::Add(AnsiString ACaption, AnsiString AFrequency)
    {
    Add(ACaption, AFrequency.ToDouble() );
    }
    //---------------------
    void __fastcall jRadio::Add(AnsiString ACaption, double AFrequency)
    {
    Sorted = false; // << pour traiter le dernier entré
    Items->Add(ACaption);
    int i = Items->Count-1;
    Frequency[ i ] = AFrequency;
    Items->Objects[ i ]= (TObject*)&Frequency[ i ];
    Sorted = true; // << on peut trier
    }
    //---------------------
    void __fastcall jRadio::AOnClick(TObject *Sender)
    {
    if(ItemIndex < 0) return;
    double d = *(double*)Items->Objects[ItemIndex];
    Form1->Panel1->Caption =  FloatToStr(d) + " MHz";
    // Todo : d ==> Afficheur 7 segments
    //        d ==> TUNER USB
    }
    Son usage (juste pour montrer quelque chose):

    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
    // TPanel *Panel1 sur la fiche Form1
    jRadio *Radios;
     
    //--------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    // fréquence passée par double
    Radios = new jRadio(this, this);
    Radios->SetBounds(10, 30, 150, 21);
    Radios->Add("Caroline", 90.5);
    Radios->Add("Baby Rock", 91.3);
    Radios->Add("Hot Metal", 92.7);
    Radios->Add("Nostalgie", 93.2);
    Radios->Add("Nrg", 100.4);
    Radios->Add("Fr Culture", 102.6);
    Radios->Add("Europe 1", 97.8);
     
    // fréquence passée par texte
    Radios->Add("Fr Info", "105,5");
    Radios->Add("RMC", "99,1");
    }
    Développé avec BCB3 Pro et Windows XP

    A plus !

Discussions similaires

  1. choix entre tableau dynamique et liste chainée
    Par siempre dans le forum Débuter
    Réponses: 3
    Dernier message: 16/02/2010, 12h27
  2. problème de synchronisation entre 2 listes (s:select) !
    Par adilensa dans le forum Struts 2
    Réponses: 3
    Dernier message: 16/05/2009, 20h22
  3. Problème de choix entre des API SNMP
    Par 01211983 dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 29/03/2009, 13h10
  4. Réponses: 1
    Dernier message: 08/05/2008, 23h00
  5. difference entre vector, deque, list et tableau
    Par salseropom dans le forum SL & STL
    Réponses: 8
    Dernier message: 03/01/2005, 13h35

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