Oi yen a pas comprendre ! :(

[Résolu]
Signaler
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Bonjor à toutes et à tous !

J'ai un souci avec un programme qui plante lors d'un clic sur un bouton.
Voilà le code de la fonction qui récupère les clics sur les boutons :/*Clic sur bouton*/
void ClicBouton(int Index)
{
    DWORD Lu;
    __int64 TailleFich;
    wchar_t* c, * d, * e;
    int NbColonnes, NbLignes = 0;
    HANDLE FichRef, FichAComp;
    wchar_t DonneesRef[20000][30][300];
//-----//
    switch(Index)
    {
        case 1:        // Choix fichier de référence
            FichierAOuvrir(NomFichRef, NomDuFichRef, L"Fichier texte (*.txt)\0*.txt\0", FenetrehWnd);
            SetWindowText(TextBoxhWnd[1], NomFichRef);
            if(wcscmp(PrendreTexte(TextBoxhWnd[1]), L"") && wcscmp(PrendreTexte(TextBoxhWnd[2]), L""))
            {
                EnableWindow(BoutonhWnd[3], true);
            }
            else EnableWindow(BoutonhWnd[3], false);
            return;
        case 2:        // Choix fichier à comparer
            FichierAOuvrir(NomFichAComp, NomDuFichAComp, L"Fichier texte (*.txt)\0*.txt\0", FenetrehWnd);
            SetWindowText(TextBoxhWnd[2], NomFichAComp);
            if(wcscmp(PrendreTexte(TextBoxhWnd[1]), L"") && wcscmp(PrendreTexte(TextBoxhWnd[2]), L""))
            {
                EnableWindow(BoutonhWnd[3], true);
            }
            else EnableWindow(BoutonhWnd[3], false);
            return;
        case 3:        // Lancer la comparaison
            FichRef = CreateFile(PrendreTexte(TextBoxhWnd[1]), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
            if(FichRef == INVALID_HANDLE_VALUE)
            {
                MessageBox(FenetrehWnd, L"", L"", MB_ICONINFORMATION);
                return;
            }
            TailleFich = TailleFichier(PrendreTexte(TextBoxhWnd[1]));
            wchar_t* Contenu = (wchar_t*)malloc(TailleFich);
            ReadFile(FichRef, Contenu, TailleFich, &Lu, NULL);
            CloseHandle(FichRef);
            c = Contenu;
            while(*c != 0)
            {
                while(*c != '\n')
                {
                    e = DonneesRef[NbLignes][NbColonnes];
                    while(*c != '\t')
                    {
                        *e = *c;
                        e++;
                        c++;
                    }
                    *e = 0;
                    NbColonnes++;
                    c++;
                }
                NbLignes++;
                c++;
            }
            free(Contenu);
            MessageBox(NULL, DonneesRef[5][9], L"Donnees", 0);
            return;
    }
}

Si je clique sur les boutons 1 ou 2, le programme plante. Pour que ça ne plante pas, il faut que je mette en commentaire les 2 lignes que j'ai mises en rouge.

Précision : je bosse en UNICODE (je préfère préciser) et pas par plaisir lol.

Merci d'avance pour vos lumières que j'espère intense parce que moi sur ce coup je dépasse pas la bougie...

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]

11 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Reflechis un peu quand tu codes, c'est pas du vb que tu fais; même en
mettant 100 a la place de 20000 ton tableau est enorme et bien plus
gros que la pile.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tu sais aussi que:

wchar_t DonneesRef[20000][30][300]

ou

wchar_t DonneesRef[100][30][300]


C'est supérieur à la taille de la pile par défaut. Donc c'est plantage assurer. Remplace 100 par 10 et ca marchera.
Mais alloué autant de mémoire sur la pile, c'est totalement abérant.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
On peut, mais c'est pas du tout la solution :)
Il faut allouer cette mémoire sur le tas.

const unsigned int dim2 = 30;
const unsigned int dim3 = 300;
wchar_t * DonneesRef = new wchar_t[20000*dim2 *dim3];

"DonneesRef[5][2][10]" <=> DonneesRef[5*dim2*dim3 + 2*dim3 + 10];

A priori, ca doit ressembler à ca.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

wchar_t DonneesRef[20000][30][300];

tu sais combien ca represente en mega octet ca ?
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Oui je sais ce que ça fait, mais je vois pas où est le problème.
Même en laissant la déclaration de cette variable et sans la remplir (car le code plante sans passer par là où la variable 'DonneesRef' est utilisée), ça plante !
Donc je pense pas que ça soit ça.

PS : en remplaçant 20000 par 100 ça fait la même chose.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Ok là je commence à y voir plus clair.
Comment peut-on changer la taille de la pile si c'est possible ?
Parce que si j'avais mis cette taille pour la variable ce n'était pas pour rien, j'en ai besoin.
Si on ne peut pas changer la taille de la pile, vous avez une autre technique à me proposer ?

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
yoyo, vraiment rien ne va dans tout ça.
On dirait que tu traduis un listing VB, ce n'est absolument pas pensé en natif.

ReadFile(FichRef, Contenu, TailleFich, &Lu, NULL);
CloseHandle(FichRef);
c = Contenu;
while(*c != 0)...

Mais où as-tu vu que ReadFile() insère un 0 final ???
Dans tous les cas, il n'y aurait pas la place dans ton buffer.
Le nbr lu étant dans Lu, on pourrait boucler ainsi:
if(!Lu) return; // après nettoyages divers
do {
  // traitement
  c++;
} while(--Lu);

ciao...
BruNews, MVP VC++
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
Soit dit en passant, il est effectivement de changer la taille de la pile. Par défaut ( par exemple pour les .com , ou si le header PE est corrompu ) c'est 1 Mo sous Windows, ce me semble ( confirmation, BruNews ? ) mais ça se change dans les options du compilo.

Ne pas mettre des valeurs abberantes ! genre 20 Mos ... vu que ça doit être une zone mémoire 100% contigüe et que normalement tu n'as jamais 20/8 millions d'appels récursifs ....   

_______________________

Omnia vincit labor improbus
http://calvin-studio.fr
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Oui 1 Mo par défaut, ce qui devrait suffire dans la majorité des cas si le prog est bien pensé avant codage.

ciao...
BruNews, MVP VC++
Messages postés
336
Date d'inscription
samedi 9 août 2003
Statut
Membre
Dernière intervention
9 juillet 2011
2
le pointeur *e n'est pas initialisé
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Merci de votre aide, maintenant ça tourne impec.
Ne t'en fais pas BruNews, l'algo était un premier jet (j'ai rajouté un zéro à la fin de 'Contenu' par la suite) et comme l'erreur ne dépendait pas de l'algo en lui même mais plutôt d'un souci de déclaration (variable), j'ai posté car je ne voyais vraiment pas la raison.

En tous cas merci car pour le coup de la pile je ne savais pas. je vais me documenter sur le sujet.
Si vous avez des liens à me communiquer ça sera avec plaisir.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]