Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : oi yen a pas comprendre ! :( [ Windows / Autre ] (yoyo269)

lundi 1 octobre 2007 à 15:47:43 | oi yen a pas comprendre ! :(

yoyo269

Membre Club
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]


lundi 1 octobre 2007 à 16:16:27 | Re : oi yen a pas comprendre ! :(

aardman

Membre Club
Salut,
wchar_t DonneesRef[20000][30][300];
tu sais combien ca represente en mega octet ca ?


lundi 1 octobre 2007 à 16:27:16 | Re : oi yen a pas comprendre ! :(

yoyo269

Membre Club
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]


lundi 1 octobre 2007 à 16:35:21 | Re : oi yen a pas comprendre ! :(

aardman

Membre Club
Réponse acceptée !
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.


lundi 1 octobre 2007 à 16:37:49 | Re : oi yen a pas comprendre ! :(

luhtor

Réponse acceptée !
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.

lundi 1 octobre 2007 à 16:50:02 | Re : oi yen a pas comprendre ! :(

yoyo269

Membre Club
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]


lundi 1 octobre 2007 à 17:01:15 | Re : oi yen a pas comprendre ! :(

luhtor

Réponse acceptée !
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.

lundi 1 octobre 2007 à 19:04:48 | Re : oi yen a pas comprendre ! :(

BruNews

Administrateur CodeS-SourceS
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++

lundi 1 octobre 2007 à 20:08:02 | Re : oi yen a pas comprendre ! :(

Arnaud16022

Membre Club
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

lundi 1 octobre 2007 à 20:13:21 | Re : oi yen a pas comprendre ! :(

BruNews

Administrateur CodeS-SourceS
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++


1 2

Cette discussion est classé dans : wchar, textboxhwnd, prendretexte, fichref, taillefich


Répondre à ce message

Sujets en rapport avec ce message

Transfert de charactères (Unicode, CString) [ par jefk ] Bonjour tout le monde.Je viens de mettre au C++ il y a quelques jours (visual studio et mfc), et j'ai une petite question. Mon problème est de transf convertir "coucou" en WCHAR ?? [ par MoDDiB ] quelle commande pour faire ca?? help pleazeeeeee! char* => WCHAR [ par Chouchou182 ] BonjourJe cherche à transformer une chaine de caractères (char*) en une chaine UNICODE donc wchar_t* ou WCHAR*.J'utilise (surement mal) la fonction:Mu wcstok [ par frdestroyers27 ] Bonjours a tous!j'ai un petit probleme avec wcstokje ne sais pas comment declarer une constante WCHARpour faire mon token...avec char ont faitchar tok convertir un CString en *Wchar [ par sixpack13 ] Bonjour,Pour un projet MFC en SDI nous utilisons le GDI+ et nous avons besoin de convertir un CString (nom du fichier) en *Wchar.voici le code de la f Conversion String -> WCHAR* [ par seb2086 ] Quelqu'un saurait-il comment convertir une variable de type String en WCHAR* ? Convertir un float en WChar [ par Kaneda Shotaro ] Bonjour, je suis nouveau ici. Je programmais en Delphi mais je viens de reçevoir Visual Studio 2005 Beta et je me demandais comment convertir un nombr wchar [ par xterminhate ] j'ai un objet de type ( const wchar_t * ). Je voudrais passer cet objet en paramètre d'une fonction f( const char * ). Existe-t-il une fonction de co Problème à la compilation dans winnt.h [ par morganitos ] Bonjour, j'ai pour projet de créer des classes me permettant de manipuler les headers des fichier au format PE. Pour se faire je fait appel au structu const wchar_t inutilisables [ par LA_Tupac ] Bonjour, Je bosse sur le moteur Irrlicht que personne n'utilise :'(Je m'interesse actuellement à la partie GUI.Mon problème est que la métode des clas


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,889 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.