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 :

Erreur Inconnue


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    Par défaut [Résolu] Erreur Inconnue
    Salut!!

    J'ai un problème ma fonction marche seulement de temps a autre et je n'arrive pas a trouver le problème. (acces violation)

    Lorsqu'un mot est taper dans Edit1, si le mot correspond a une liste predefinie. Une application ce lance.

    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
     
    void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
     
    AnsiString tab[50], tab2[50];
     
     
    tab[0]="ant";
    tab2[0]="C:\\Program Files\\Ant Movie Catalog\\MovieCatalog.exe";
     
    tab[0]="ppt";
    tab2[0]="C:\\Program Files\\Microsoft Office\\OFFICE11\\POWERPNT.EXE";
     
    tab[0]="ts";
    tab2[0]="C:\\Program Files\\Teamspeak2_RC2\\TeamSpeak.exe";
     
         if(Key==VK_RETURN)
         {
            for(int i=0;i<40;i++)
            {
            AnsiString test;
            test=Edit1->Text;
     
            if (test==tab[i])
            {
            char classic[40];
            strcpy (classic, tab2[i].c_str());
            ShellExecute(hwnd,"open",classic,NULL,NULL,SW_SHOWDEFAULT);
            Edit1->Clear();}
            }
         }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello !

    A vue de nez, les chaines contenues dans tab2[...] font un poil plus que 40 caractères. Donc quand tu va essayer de les copier dans classic (char de 40), ça risque de déborder un peu... D'où surement une violation d'accès...
    Donc agrandit classic pour qua sa taille aille bien...

    Sinon tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(hwnd,"open",   tab2[i].c_str(),  NULL,NULL,SW_SHOWDEFAULT);
    Pour l'initialisation de tab et tab2, j'imagine que l'indice 0 à chaque fois, c'est une erreur de recopie dans le post ??

    Bonne continuation

    A++

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Non !
    AnsiString est d'un usage très simple;
    Pour affecter il suffit de déclarer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AnsiString str;
    str="chaine quelconque";
    //concatenation
    str=str+" autre chaine";

    Eviter d'utiliser strcpy , strcat du C ; c'est source de plantage assuré

    Non ! Prendre TStringList sur laquelle on empile des AnsiString .
    TStringList sert à gérer des chaines dynamiquement.
    Voir toutes les FAQ du site


    Concatener deux AnsiString et convertir avec c_str()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AnsiString str1;
    AnsiString str2;
    str1=.....
    ShellExecute(hwnd,"open",str1.c_str(),NULL,NULL,SW_SHOWDEFAULT);

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Merci a vous deux, ca marche enfin pour l'instant

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Au final

    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
     
    TStringList* Liste = new TStringList;
     
    Liste->Add("paint=C:\\WINDOWS\\system32\\mspaint.exe");
    Liste->Add("cal=C:\\WINDOWS\\system32\\calc.exe");
     
     
         if(Key==VK_RETURN)
         {
            for(int i=0;i<2;i++)
            {
            AnsiString test;
            test=Edit1->Text;
     
            AnsiString mot, chemin;
            mot = Liste->Names[i];
            chemin = Liste->Values[mot];
     
            if (test==mot)
            {
            ShellExecute(hwnd,"open",chemin.c_str(),NULL,NULL,SW_SHOWDEFAULT);
            Edit1->Clear();
            }
            }
         }
    delete Liste;
    Une derniere chose si je ne supprime pas "Liste" que ce passerait il ? Mon application tournerait plus vite ? Puisque "Liste" reste en mémoire ?

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Attention ! Il faut effacer tous les éléments de Liste un par un avec une boucle.
    delete list efface l'instance d'objet list de type TListString...
    L'aide de BCB est bien fournie il y a un exemple ; voir avec TList

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    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
     
    if(Key==VK_RETURN)
         {
            for(int i=0;i<31;i++)
            {
            AnsiString test;
            test=Edit1->Text;
     
            AnsiString mot, chemin;
            mot = Liste->Names[i];
            chemin = Liste->Values[mot];
     
            if (test==mot)
            {
            ShellExecute(hwnd,"open",chemin.c_str(),NULL,NULL,SW_SHOWDEFAULT);
            Edit1->Clear();
            }
            }
         }
    delete Liste;
    for (int n=0;n<31;n++)
    {
    delete(&n);}
    C'est bien ca ?
    Par curiosité, ue ce passerait t'il si je ne supprimais pas les Items et TlistString ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Ce n'est pas tout à fait ça....

    Avec un TStringList tu n'as pas besoin de t'emm...er à supprimer les éléments un à un. Un delete sur ton objet TStringList suffit (voir dans la FAQ, http://c.developpez.com/faq/bcb/?pag...antsstringlist)

    (Par contre, si tu avais utilisé un objet TList, là il aurait fallu faire plus attention, comme disait mat.M. Mais pas pour le TStringList)

    Le problème avec la mémoire, c'est qu'elle est en quantité limitée (bin ouaih). Plus ton programme va en consommer, moins il y'en aura pour les autres. Et à force de ne pas la libérer, ton programme va finir par "s'alourdir".

    Dernière remarque: tu peux réécrire ta boucle for de cette manière (c'est plus pratique si tu ajoutes des éléments à ta liste, pas besoin de tout corriger à chaque fois):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         if(Key==VK_RETURN)
         {
            for(int i=0; i<Liste->Count; i++)
            {
    ...
    Surtout, n'hesite jamais à passer du temps à naviguer dans l'aide de Builder, tu y trouveras une tonne et demi de bons exemples

    A++

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Ok, merci c'est sympa

    Sinon ne supprimer pas le "Liste" provoquerai quoi ? Si au lieu de remplir de tableau par add.. je remplacerais ca par un fichier txt. Le programme tournerais plus ou moins vite ?

    J'essaye de l'optimiser

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Honnêtement, pour une petite appli, pas grand chose... C'est surtout une question de propreté et de rigueur. Maintenant, imagine une appli qui tournerait 24h/24, et qui serait ammenée à allouer/désallouer de la mémoire fréquement, là faudrait vraiment faire gaffe.

    Si tu remplis ta liste avec un fichier texte, faut rajouter le temps d'accès au fichier, sa lecture, etc... C'est forcément plus lent. Mais à l'usage, à moins de tourner sur un vieux coucou, tu ne verras pas la différence si ton appli n'est pas constament en train de relire sa liste.

    Ce que tu peux faire aussi, c'est remplir ta liste en dehors du KeyDown, genre dans le constructeur de ta fiche. Et la détruire dans le destructeur de la fiche. Inutile de tout refaire à chaque fois.

    A++

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Ah oui, c'est pas bete merci

    Sinon ben j'ai mit mon .exe en appli independante pour une utilisation mémoire plus faible.

    Je trouve le constructeur :

    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)

    Mais le destructeur ? C'est l'evenement de fermuture de la Form1 ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Tu dois écrire le destructeur toi même:

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __fastcall TForm1::~TForm1(void);
    .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    __fastcall TForm1::~TForm1(void)
      {
      .....
      }

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Merci bien pour vos réponses

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

Discussions similaires

  1. [Tableaux] erreur inconnue
    Par zebougha dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2006, 10h50
  2. [CR 8.5] qui contactez quand on a une erreur inconnue ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 25/01/2006, 20h46
  3. Erreur inconnue !
    Par dinver dans le forum C
    Réponses: 5
    Dernier message: 04/12/2005, 21h58
  4. erreur inconnue en VBA
    Par rapace dans le forum Access
    Réponses: 3
    Dernier message: 06/10/2005, 14h42
  5. erreur inconnue
    Par naw dans le forum Bases de données
    Réponses: 5
    Dernier message: 02/02/2005, 08h51

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