Pb _beginthreadex et manipulation de char* ou TCHAR

Signaler
Messages postés
3
Date d'inscription
vendredi 4 novembre 2005
Statut
Membre
Dernière intervention
16 mars 2006
-
Messages postés
3
Date d'inscription
vendredi 4 novembre 2005
Statut
Membre
Dernière intervention
16 mars 2006
-
Hello,

Je développe une application impliquant plusieurs thread (port COM + calcul scientifique temps réel), bref un beau merdier. Tout allait bien jusqu'à ce que j'utilise la structure suivante :

struct COMMAND
{
COMMAND* prev;
HWND hwnd;
BYTE type;
double s;
double t;
USHORT k;
DWORD timer;
DWORD tick;
TCHAR sz[64];
CHAR c;
LONG l;
double v;
COMMAND* next;
};

Dès lors que dans un thread j'utilise des pointeurs COMMAND* pcmd et manipule des chaîne de caractères notamment via strcpy et sprintf le prog perd les pédales et attribue de nouvelles adresses aux pointeurs ???

ex:

COMMAND* Populate( COMMAND* pcmd, HWND hWnd, BYTE type, double t, double s, USHORT k, DWORD timer, LPSTR sz, CHAR c, LONG l )
{
pcmd->type = type;
pcmd->t = t;
pcmd->s = s;
pcmd->k = k;
pcmd->timer = timer;
pcmd->tick = timeGetTime();
if( sz )
strcpy( pcmd->sz, sz );
else
strcpy( pcmd->sz, _T("") );
pcmd->c = c;
pcmd->l = l;
// pcmd->next = (COMMAND*) malloc( sizeof( COMMAND ) );
pcmd->next = (COMMAND*) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( COMMAND ) );
pcmd->next->prev = pcmd;

char str1[64];
int i = sprintf( str1,"%s %d", sz, k );

return pcmd->next;
}

Si je supprime la ligne "
int i = sprintf( string,"%s %d", sz, k ); " tout rentre dans l'ordre (ou presque) et c'est ainsi pour toutes les fonctions appelées depuis un thread.

JE NE COMPRENDS PAS POURQUOI ET SURTOUT COMMENT Y REMEDIER !

HELPPPP

4 réponses

Messages postés
3
Date d'inscription
vendredi 4 novembre 2005
Statut
Membre
Dernière intervention
16 mars 2006

Ok, pb résolu en 2mn après avoir posté le msg, alors que je cherchais depuis 2j. Dans le cas de structure chaînées (se pointant les uns les autres) il vaut mieux utiliser :

int _snprintf( char *buffer, size_t count, const char *format [, argument] ... );

qui sécurise la procédure d'écriture de chaîne de caractère et ne déborde pas sur le reste de la mémoire.

Dans mon cas sprintf débordait sur l'élément "COMMAND* next" de la structure COMMAND et y inscrivait n'importe quoi d'où le perdage de pédale...

Bref, youpi.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Essaie aussi d'aligner correctement les membres de la structure COMMAND, t'évitera de bouufer de la mémoire inutilement.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
typedef struct _COMMAND {
_COMMAND *prev;
HWND hwnd;
BYTE type;
double s;
double t;
USHORT k;
DWORD timer;
DWORD tick;
TCHAR sz[64];
CHAR c;
LONG l;
double v;
_COMMAND* next;
} COMMAND;

// REFAITE CORRECTEMENT ALIGNEE
typedef struct _COMMANDA {
double s;
double t;
double v;
_COMMANDA* prev;
_COMMANDA* next;
HWND hwnd;
DWORD timer;
DWORD tick;
LONG l;
USHORT k;
TCHAR sz[64];
CHAR c;
BYTE type;
} COMMANDA;


sizeof(COMMAND) = 136
sizeof(COMMANDA) = 120


UNICODE:
sizeof(COMMAND) = 200
sizeof(COMMANDA) = 184

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
3
Date d'inscription
vendredi 4 novembre 2005
Statut
Membre
Dernière intervention
16 mars 2006

Ok, merci !