Pb d'allocation memoire pour des tableaux char

Signaler
Messages postés
45
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
31 janvier 2006
-
kollibar
Messages postés
45
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
31 janvier 2006
-
bonjour, j ai un pb sur le code suivant(imprime le handle et le nom de toutes les fenetres active a l'écran) au niveau des variables char * titre et char * identifiant
au moment d imprimer le resultat a l ecran, la variable identifiant est normal mais la variable titre contient la variable identifiant:

328088:Invite de comman32808

au lieu de

328088:Invite de commande - edit testfen.cpp
et la meme chose se produit pour tous mes affichages.

selon moi, les 2 tableaux se recouvrent en memoire, car si je modifie identifiant avant titre, c'est identifiant qui contient une partie de titre.

si qq1 peut m'aider.

au fait j utilise free borland C++ compiler 5.5

#include <windows.h>
#include <string>
#include

void main(void) {
int taille=1; //taille du tableau nom de fenetre

char * titre=(char *) malloc(taille); //alloue un tab de 1char pour le nom de la fenetre(non suffissant)
char * identifiant=(char *)malloc(12); //alloue un tableau de 12char pour l identifiant(tjr suffissant)

HWND handle=GetForegroundWindow(); //handle de la fenetre au premier plan(faut bien commenc? qq part!)
UINT direction=GW_HWNDNEXT; //direction pour la recherche du prochain handle => suivant
while ( handle != NULL ) { //tant qu on a pas epuise tout les handle
handle=GetNextWindow(handle,direction); //recup le handle suivant
if (handle != NULL && IsWindowVisible(handle)) { //tant qu'on a un handle
taille=GetWindowTextLength(handle); //taille du texte de la fenetre
if ( GetWindowTextLength(handle)+1>taille ){ //si la taille n est plus suffisante
taille=GetWindowTextLength(handle); //recup la taille du texte

realloc(&titre,taille); //realloue l espace memoire necessaire

}
GetWindowText(handle,titre,taille); //recupe le texte de la fenetre

identifiant=itoa((long)handle,identifiant,10); //convertit le nø du handle en char *
cout << identifiant << ":" << titre << endl; //affiche l identifiant et le titre de la fenetre

}
else if (direction==GW_HWNDNEXT) { //si plus de handle ds la direction 'suivant'
direction=GW_HWNDPREV; //change la direction('precedent')
handle=GetForegroundWindow(); //repart du meme endroit(fenetre au premier plan)
}
}
}

KOLLIBAR bare

36 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
deja

titre = realloc(titre,taille);

et fais du c, pas de cout & iostream.h, pas de cast de void*
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Il ne fait pas de C, il fait du C++, il peut très bien utiliser malloc() et compagnie en C++ mais il doit transtyper en C++ ...

Faut faire gaffe avec realloc()

NewPtr = realloc( OldPtr, NewSize );

si realloc() ne peut pas, pour une raison quelconque, reallouer de l'espace pour OldPtr, il retourne NULL mais ne libère pas l'espace de OldPtr ... Donc, titre = realloc(titre, taille) risque de poser problème un jour ou l'autre ...

Et heu ... juste comme ca, il manque les free() ...

Dernière chose, si tu code en C++, inclus la stl de cette facon:

#include <string>
#include
// etc ...
using namespace std;

// sans .h à string, iostream, list, vector, etc ...

Pour cette raison >> http://www.devx.com/tips/Tip/14447

~(.:: NitRic ::.)~
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
qu'on soit d'accord, soit c'est du c++ (standard) avec la lib standard (mais pas de malloc/free, plutot les allocateurs du c++)

j'ai dis de faire du c car ce code n'a rien de c++ a part iostream.h (qui n'est pas standard) et string qui ne semble pas etre utilisé (sans parler du void main qui ne compile pas en c++), donc a partir de ce code c'est plus simple de faire du bon c que du c++ (on apprend pas stl & co en 5min)
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Ce n'est pas mon `genre` de m'obstiner sur ce genre de sujet mais, standard, standard, standard, ... Vous croyez vraiment que _tout_ le monde code `standard` !? Utilise _que_ les `standard` !? `standard` !? standard par ci, standard par la ...

Le fait d'utiliser malloc()/free() ne pose aucun problème, new/delete fait appel à malloc()/free() alors moi j'me dis que si je préfère malloc()/free() à new/delete pourquoi ne pas utiliser directement malloc()/free() ! Le seul _vrai_ problème c'est avec les class/objets en C++ ou new/delete sont utile au niveau des constructeurs/destructeurs ...

Le fait d'inclure iostream.h(avec .h) je crois que c'est seulement parce qu'il ne le savais pas. <string> ... c'est peut-être pour des besoins futurs, qui sait!

De plus, sa compilation ce fait en C++, iostream(avec ou sans .h) & string(sans .h) ne compile pas en C ...

Pourquoi void main(void) ne compilerait pas !? Parce que ce n'est pas standard !? Sans commentaire ...

C'est vrai qu'en C/C++ il est préférable de prendre de _bonne_ habitude dès le départ ... Apprendre correctement les standards(suivant le langage) pour être capable de les utiliser à leurs maximum et de facon correct, etc ...

C'est vrai que le fait de mélanger le C et le C++ n'est peut-être pas très `standard` mais tu peux très bien faire du code très puissant, fiable, structuré, sécuritaire, ... même si tu le fais ...

On dirait que l'on pense _que_ `standard`, certe, c'est très bien mais il ne faut pas devenir parano non plus(faut pas le prendre perso hein) ...

Voilà, c'est tout ce que j'avais à ajouter :)

~(.:: NitRic ::.)~
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
c'est toi qui vois, seul le standard garanti la portabilité du code (void main interdit en c++, sur certains systeme ca ne fonctionnerais pas)

"
C'est vrai que le fait de mélanger le C et le C++ n'est peut-être pas très `standard` mais tu peux très bien faire du code très puissant, fiable, structuré, sécuritaire, ... même si tu le fais ..."

tout a fais d'accord, mais c'est pas ce que je conseillerais a un debutants, sauf si il connais deja le c
mais bon, moi je prefere largement la stl
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
gete un oeil a la section toString des mfc

ça devrait t'aider

& complete là au besoin

++

Magic Nono: l'informagicien! 8-)
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
mmmm

G vu que tu n'utilise po VC

C po grave, un prj lancé serait d'avoir des toString pr un pe tt ce qui existe....

Bonne prog
Magic Nono: l'informagicien! 8-)
Messages postés
45
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
31 janvier 2006

bon ben effectivement je debute en C++ et j ai jamais fait de C. j ai un compilateur C++ mais pas de doc avec alors j en recup un peu et je fait des essais.

c est vrai q ca donne peut etre des codes un peu bizarre!

en tt cas merci... pour le coup du void main ca compilait tres bien mais maintenant je connai!!

KOLLIBAR bare
Messages postés
45
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
31 janvier 2006

sinon

new correspond a malloc et delete a free mais comment se passe la realocation??

KOLLIBAR bare
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
C pr ça que je conserve des malloc

qd G besoin de realloc

sinon, ben C brutal & fo tt copier à chaque fois pr les réallocation,
meme si il y a la place de s'étendre ou s'il est demandé de réduire

Magic Nono: l'informagicien! 8-)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
quand il y a plus de place en contuguité realloc est aussi obligé de tous recopier

plutot que reallouer element par element, que ce soit avec realloc ou new il vaut mieux reallouer plusieurs elements
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
comme tu l'a dit,
uniquement
quand il y a plus de place en contuguité realloc est aussi obligé de tous recopier

voilà tout !

je trouve cette différence édifiante

Magic Nono: l'informagicien! 8-)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
mais new et delete construise et detruise tes objets
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
pas ceux dynamiques comme ça... justement
Magic Nono: l'informagicien! 8-)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
comment ca ? tu veux dire les types de bases ?
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

utiliser malloc()/free() et new/delete en random dans un soft c'est pas `fameux` hein ...

prend celui qui te convient et garde le mais lâche le random s'il vous plaît ...

Pour ce qu'il doit faire, new/delete conviennent _amplement_ !

~(.:: NitRic ::.)~
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
bs dit de ne pas utiliser malloc/free en c++ car pas definition tous les types sont des objets et seuls new/delete et new[]/delete[] construisent/detruisent les objets
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
po random

si realloc non necessaire => new/delete
sinon => malloc/ & co

Magic Nono: l'informagicien! 8-)
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

oui, c'est claire net et précis ... personne ne peut dire le contraire ... enfin, j'crois pas :}

~(.:: NitRic ::.)~
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

bon bien moi je jase plus de malloc/free & new/delete, M. nono est trop têtu :}

~(.:: NitRic ::.)~
1 2