begin process at 2012 02 10 07:12:10
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

°'** Langage C **'°


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

°'** Langage C **'°

jeudi 27 avril 2006 à 15:11:36 | °'** Langage C **'°

while_stri

Bonjour à tous.

Je code un programme en C et j'utilise de nombreux pointeurs sur structure.  Lorsque je passe le pointeur dans un sous-programme et que je souhaite faire un free(pointeur) j'ai de nombreux bugs dans les valeurs des attributs de la structure concernée quand je refais un malloc sur le pointeur.

je code a peu près ainsi :

void sousprog (t_struct1 *pt)
{
    if (pt->x > 5)      // x est un attribut quelconque de la structure
    {
       free (pt);  
       pt=NULL;
    }
********* et dans  le main
sousprog (pt);

toute proposition est la bienvenue
jeudi 27 avril 2006 à 15:18:13 | Re : °'** Langage C **'°

gwenCPP


Hello,

Peux tu nous en dire plus sur la message d'erreurs pour indices.
Comment déclare tu le pt dans le main? L'élément passé en argument a-t-il été alloué avec un malloc???
As-tu essayé la fonction realloc???

Gwen

jeudi 27 avril 2006 à 15:40:39 | Re : °'** Langage C **'°

while_stri

Merci pour cette réponse aussi rapide ^^

je déclare mon pointeur ainsi : t_struct1 *pt=NULL;

ensuite je fais un malloc : pt = (t_struct1*) malloc (sizeof(t_struct1));

je n'ai pas essayé avec realloc, quelle est la différence avec un malloc classique ?

ce que je ne comprend pas c'est que lorsque je fais ça sur un élément d'un tableau de pointeur sur structure ca marche parfaitement, mais sur un pointeur simple non.

je précise que je n'ai aucun message d'erreur de la part du compilateur, seul l'exe crash au bout d'un certains temps
jeudi 27 avril 2006 à 16:10:39 | Re : °'** Langage C **'°

gwenCPP

Le realloc peut convenir dans ton cas;

il s'agit de ré-allouer une variable auparavant allouées par un malloc :

Trouvé sur msdn :

Reallocate memory blocks.

void*realloc(   void*memblock,   size_tsize);

Parameters

memblock
Pointer to previously allocated memory block.
size

New size in bytes.

Return Value

realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged. The return value points to a storage space that is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value.

jeudi 27 avril 2006 à 20:44:15 | Re : °'** Langage C **'°

while_stri

"Ceci est donc utile pour un tableau dynamique : en effet, on peut ajouter ou enlever une case à la fin du tableau sans le modifier."

c'est ce que j'ai trouvé sur le net. En fait cette fonction sert surtout si on veut changer la taille du pointeur or pour ma part il garde la mm taille. Mais bn c'était une possibilité
vendredi 28 avril 2006 à 08:40:01 | Re : °'** Langage C **'°

gwenCPP

Ok,

mais au passage, tu peux réallouer la même taille si tu le souhaites, mais je ne vois pas l'intérêtde libérer cette mémoire si tu sais qu'elle sera toujours de la même taille. Autant la remettre à 0 tout simplement.

Sinon peut tu me mettre un exemple de programme complet et simple de ce que tu fais, que je compilerais chez moi pour voir ce qu'il se passe exactement.

A++
Gwen


jeudi 4 mai 2006 à 18:26:28 | Re : °'** Langage C **'°

while_stri

Réponse acceptée !
j'ai enfin trouvé la solution de mon problème donc je la poste.

En fait il suffit de passé l'adresse du pointeur sur structure &pt au sous programme. On récupère un t_struct **pt (oui **) et on travail dans le sous programme avec un *pt.

Vous vous dites, pourquoi ça ne marchait pas avant ? si j'ai bien compris c'est à cause du fait que le sous programme créait une copie du pointeur et travaillait dessus et elle était supprimée en fin de sous programme. Alors que là on travail directement sur le pointeur original du main. Une autre solution consiste à faire un return pt; en fin de sous programme (qui ne sera plus un void du coup). A vérifier

en espérant que ça aide qq'un un jour ^^

merci encore à Gwen pour ses réponses
jeudi 4 mai 2006 à 18:36:06 | Re : °'** Langage C **'°

gwenCPP

Nikel comme réponse, ça me va, il ne te reste plus qu'à valider ta réponse.

++

Gwen



Cette discussion est classée dans : code, structure, pointeur, pt, langage


Répondre à ce message

Sujets en rapport avec ce message

pourkoi pointeur vers classe ? [ par Arkko ] Quelquun peut m'expliquer pourquoi ce code cree un pointeur NULL vers un classe et apres quil declare un variable de type cMyD3dApplication et met une Pointeur et liberation de memoire [ par Darkneon ] Salut, J'avais un probleme apres que je liberais de la memoire allouer a un pointeur, le message "Null pointer assignment" m'apparaisait toujours. Le icon sur menu (API win32) [ par youpiyoyo ] bonjour a tous je cherche a mettre des icones(ou bmp) a coter du text dans un menusi kelk'1 a un petit bout de code ou une solution simple a me propos signification code [ par rems38 ] bonjour pouvez vous me dire ce que fais cette ligne de code:mixcurr.nunit[ii]=pt->IsActive?pt->Nunitmax:0;mercirems38 écriture pointeur de struct [ par Vaughn018 ] Bonjour j'ai un oubli complet (trop de code tue le code!) sur la façon d'écrire des données lorsqu'il s'agit du cas suivant :typedef struct Point{ RS232 [ par Steph115 ] Bonjour a tous,Je dois faire un projet en c++ sur une connexion en rs232 a un robot.En mode console je tape cela pour le faire marcher et envoyer un o Structures nommées incompréhensible ... à l'aide [ par otterc8 ] Bonjour, voila j'ai ce bout de code que je ne comprends pas top, malgré des recherches sur les structures, il y a des choses que je ne comprends pas! probleme d'incrementation de pointeur [ par lamoueste ] bonjour a tous alors j'ai un petit souci avec un pointeur, voila mon code : BYTE TmpInBuffer[MAX_RATBUFFER_RATTEST+1]; *TmpInBuffer++ = (BYTE)LOBYTE Définition de Structure [ par angelfire0808 ] Voila j'ai une petite question sur la definition des structure : struct liste         {         int valeur;     & Structure avec un fichier [ par orangepulpe57 ] Bonjour,Je doit réaliser pour la fac un programme qui convertit le code morse en caractère. Le code morse est inscrit sur un fichier txt comme suit:A


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,356 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales