Accueil > Forum > > > > API Win32, problème de variable
API Win32, problème de variable
lundi 17 février 2003 à 21:54:44 |
API Win32, problème de variable

bouba
|
Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source. LPSTR Path=""; LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: break; case WM_COMMAND: switch(LOWORD(wParam)) { case FICHIER_NOUVEAU: SetDlgItemText(hWnd, 0, ""); break; case FICHIER_OUVRIR: Path = OuvrirFichier(hWnd); break; case FICHIER_SAVE: SauverFichier(hWnd,Path); MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); break; case FICHIER_SAVEAS: MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); Path = SauverSousFichier(hWnd); MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); break; case FICHIER_PRINT: break; case FICHIER_QUITTER: PostQuitMessage(0); break; case AIDE_PROPOS: DialogBox(GetModuleHandle(NULL),"AIDEDIALOG",hWnd,AideDialogProc); break; } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_SIZE: break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return (0L); } Bon, voila le problème est dans la variblale Path, a ce niveau case FICHIER_SAVEAS: MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); Path = SauverSousFichier(hWnd); MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); J'utilise deux messageBox pour tester, la première m'affiche donc une chaine vide et la deuxième le résultat retourné par la fonction SauverSousFichier. Jusqu'ici tout va bien mais lorsque je repasse par le même code: case FICHIER_SAVEAS: MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); Path = SauverSousFichier(hWnd); MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); La première messageBox me réaffiche une chaine vide alors que je souhaiterais quelle m'affiche la chaine quelle m'avais affiché au passage précédent. Je ne comprends pas, c'est comme si la variable Path était vidé après chaque appel de la fonction WndProc. Comment faire pour que le contenu de cette variable ne se vide pas après chaque passage dans cette fonction?
|
|
lundi 17 février 2003 à 22:28:05 |
Re : API Win32, problème de variable

BruNews
|
Salut, Path = SauverSousFichier(hWnd); comment veux-tu que retourne quoi que ce soit. Faudrait que to Path soir char *Path; et que ta func SauverSousFichier alloue la memoire et fasse pointer Path dessus. Toi tu as defini une constante chaine de longueur nulle. char Path[260]; change tes funcs ainsi: BOOL SauverSousFichier(HWNDhwnd, char *pszPath); ta func doit remplir pszPath et retouner 1 si fait sinon 0. Idem pour le reste. ciao...
------------------------------- Réponse au message : -------------------------------
> Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source. > > LPSTR Path=""; > > LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) > { > switch(uMsg) > { > case WM_CREATE: > break; > case WM_COMMAND: > switch(LOWORD(wParam)) > { > case FICHIER_NOUVEAU: > SetDlgItemText(hWnd, 0, ""); > break; > case FICHIER_OUVRIR: > Path = OuvrirFichier(hWnd); > break; > case FICHIER_SAVE: > SauverFichier(hWnd,Path); > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > break; > case FICHIER_SAVEAS: > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > Path = SauverSousFichier(hWnd); > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > break; > case FICHIER_PRINT: > break; > case FICHIER_QUITTER: > PostQuitMessage(0); > break; > case AIDE_PROPOS: > DialogBox(GetModuleHandle(NULL),"AIDEDIALOG",hWnd,AideDialogProc); > break; > } > break; > case WM_DESTROY: > PostQuitMessage(0); > break; > case WM_SIZE: > break; > default: > return DefWindowProc(hWnd, uMsg, wParam, lParam); > } > return (0L); > } > > Bon, voila le problème est dans la variblale Path, a ce niveau > > case FICHIER_SAVEAS: > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > Path = SauverSousFichier(hWnd); > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > > J'utilise deux messageBox pour tester, la première m'affiche donc une chaine vide et la deuxième le résultat retourné par la fonction SauverSousFichier. Jusqu'ici tout va bien mais lorsque je repasse par le même code: > > case FICHIER_SAVEAS: > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > Path = SauverSousFichier(hWnd); > MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > > La première messageBox me réaffiche une chaine vide alors que je souhaiterais quelle m'affiche la chaine quelle m'avais affiché au passage précédent. > Je ne comprends pas, c'est comme si la variable Path était vidé après chaque appel de la fonction WndProc. > Comment faire pour que le contenu de cette variable ne se vide pas après chaque passage dans cette fonction? >
|
|
mardi 18 février 2003 à 04:01:29 |
Re : API Win32, problème de variable

jonathanmcdougall
|
> Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source. >
<snip>
> > Bon, voila le problème est dans la variblale Path, a ce niveau > > case FICHIER_SAVEAS: >MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); >Path = SauverSousFichier(hWnd); >MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > > J'utilise deux messageBox pour tester, la première m'affiche donc une chaine vide et la deuxième le résultat retourné par la fonction SauverSousFichier. Jusqu'ici tout va bien mais lorsque je repasse par le même code: > > > case FICHIER_SAVEAS: >MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); >Path = SauverSousFichier(hWnd); >MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c); > > La première messageBox me réaffiche une chaine vide alors que je souhaiterais quelle m'affiche la chaine quelle m'avais affiché au passage précédent. > Je ne comprends pas, c'est comme si la variable Path était vidé après chaque appel de la fonction WndProc. > Comment faire pour que le contenu de cette variable ne se vide pas après chaque passage dans cette fonction? >
Faudrait voir le code de SauverSousFichier(), mais voilà ce que je pense être ton code :
char *SauverSousFichier(HWND hwnd) { // ... return "mon path";
// ou encore
char path[32]; //.. mettre qqch dans 'path' return path; }
Dans ces deux cas, la valeur de retour est une string *temporaire*, c'est-à-dire qu'elle est locale à la fonction. En faisant
Path = SauverSousFichier(HWND hwnd);
tu stockes l'adresse d'une string qui *n'existe plus* dans Path. Tu vas répondre que des fois Path contient la bonne valeur, mais c'est un coup de chance. La mémoire à cette adresse n'a probablement pas été touchée. C'est un exemple typique de 'undefined behavior', comportement non-défini.
Tu as deux solutions : 1) utiliser des std::string ou 2) allouer ta chaine avec new.
1) # include <string>
//note : retour par valeur std::string SauverSousFichier(HWND hwnd) { // .... return std::string("mon path");
// ou
const char *monPath; // ... return std::string(monPath); }
2) char *SauverSousFichier(HWND hwnd) { const char* monPath; //....
//allocation dynamique // la longueur est strlen(monPath) const char* pour_retourner = new char[strlen(monPath)];
//copie strcpy(pour_retourner, monPath);
//retour return pour_retourner; }
Mais bien sûr, il ne faut pas oublier de faire un delete sur la variable qui stockera cette chaine. Ce qui fait que :
Path = SauverSousFichier(hwnd); Path = SauverSousFichier(hwnd); delete[] Path;
est un memory leak, puisque la chaine allouée avec new n'est pas deletée. La bonne manière sera celle-ci :
Path = SauverSousFichier(hwnd); delete[] Path; Path = SauverSousFichier(hwnd); delete[] Path;
Mais la vraie bonne manière serait d'utiliser les std::string, ça t'enlèverait un paquet de problèmes. Note que les std::string se convertissent en const char* avec la fonction membre c_str().
Jonathan Mcdougal Montréal, Québec mcdougalljonathan@hotmail.com http://www.multimania.com/utopiasoftware
|
|
mardi 18 février 2003 à 11:55:17 |
Re : API Win32, problème de variable

bouba
|
Vraiment, je te remercie, c'est super je suis enfin débloqué!!!!!
|
|
Cette discussion est classée dans : fichier, case, break, hwnd, path
Répondre à ce message
Sujets en rapport avec ce message
Problème avec WM_KEYDOWN: [ par cognac ]
Pourquoi est-ce que "j" est toujours égal à 2 lorsque je presse F1(même la première fois). Je pensais qu'à chaque fois que je presse F1 "j" augmente d
Le jeu du serpent en C++ / niveau débutant [ par edouard57 ]
Bonjour à tous, Je débute en C ++ et opengl. Pour m'entrainer j'essaie de réaliser un petit jeu le serpent. Pour l'instant j'arrive à créer un carré d
Affichage d'un boutton en Win32 [ par Crazy_Joe ]
Bonjour à tous, Cela va peut-être vous paraître assez bénin mais je n'arrive pas à afficher un boutton tout simple dans mon application. Voici un bou
Recuperer la notification EN_CHANGE [ par KinNoShishi ]
Bonjour à tous, Je suis dans impasse depuis plusieurs heures maintenant... Je n'arrive pas à récupérer le message EN_CHANGE qui me permettrait de pou
Creation et lecture d'un fichier typé en C [ par Razily ]
Bonjour , voilà j'ai un projet de Mastermind à rendre bientôt et je coince sur une partie du code notamment sur l'enregistrement ! l'idée c'est que le
richedit bloquer la modification d'un document [ par babyboo1107 ]
Bonjour j'aimerais savoir comment faire pour lorsque je fais fermer le document il me met une fenetre gisée(ca j'ai trouver) mais ou il ne soit pas po
Touches clavier [ par F0ra ]
Salut,Mon problème c'est que ça ne fonctionne pas quand j'appuie sur la touche de droite et bas en même temps par exemple.Que faire ?case WM_KEYDOWN:s
rachraichissement fenetre winapi en c [ par dyroj ]
bonjour a tous,sa faire quelque semain que j'ai un gros probleme avec le rechaichissement winapi, se probleme menpaiche d'avancer dans mais projet.se
Violation d'accès mémoire [ par zoneart ]
Bonjour,Je suis débutant et j'ai écris deux trois lignes de codes que j'aimerais vous soumettre car une erreur de violation d'accès mémoire survient l
Deplacement de plusieurs sprites à l'écran (SDL) [ par rasolofomanana ]
Bonjour à tous, je débute en C et j'essaie de créer un programme où l'on peut déplacer plusieurs sprites à l'écran, par cases de 40px. Le problème es
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|