/!\ Écrasement d'adresse
Résolu/Fermé
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
-
17 juil. 2014 à 11:34
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 19 juil. 2014 à 21:28
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 19 juil. 2014 à 21:28
A voir également:
- /!\ Écrasement d'adresse
- Nom de l'adresse ✓ - Forum Internet / Réseaux sociaux
- Creer adresse mail - Guide
- Tirexo nouvelle adresse - Guide
- Localiser adresse ip - Guide
- Adresse mac - Guide
3 réponses
Bonjour voisin
Je n'ai pas lu très loin, car trop de choses choquantes dès le départ :
À quoi bon tester la valeur de pIn, alors que tu viens juste d'initialiser cette valeur ?
De plus, tu ne modifies ici que la variable locale à la fonction : quand tu appelles plus loin f_initPile( pile_1 ), pile_1 n'est PAS modifié.
ts_Pile *tmp = malloc( sizeof( ts_Pile* ) ); Si tu veux que tmp pointe sur un ts_Pile, la taille allouée doit être celle de ts_Pile, pas celle de ts_Pile * !
J'ai arrêté là.
Je n'ai pas lu très loin, car trop de choses choquantes dès le départ :
pIn = NULL; if( pIn != NULL )
À quoi bon tester la valeur de pIn, alors que tu viens juste d'initialiser cette valeur ?
De plus, tu ne modifies ici que la variable locale à la fonction : quand tu appelles plus loin f_initPile( pile_1 ), pile_1 n'est PAS modifié.
ts_Pile *tmp = malloc( sizeof( ts_Pile* ) ); Si tu veux que tmp pointe sur un ts_Pile, la taille allouée doit être celle de ts_Pile, pas celle de ts_Pile * !
J'ai arrêté là.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
48
18 juil. 2014 à 12:55
18 juil. 2014 à 12:55
Salut voisin, comme convenu j'ai apporté des modifications sur ma source précédente pour @zarganomi
à bientôt et merci encore
à bientôt et merci encore
#include <stdio.h>
#include <stdlib.h>
/* Macro Bool */
typedef enum{false,true}bool;
/***
* Structure Simple d'une Pile
***/
typedef struct _Pile{
unsigned int iVal;
struct _Pile *pPrec;
}ts_Pile;
/***
* Fonction vérification
* de la pile
***/
bool f_isEmpty(ts_Pile **pIn){
return ( (*pIn == NULL ) ? true : false );
}
/***
* Fonction qui ajoute un élement
* dans la Pile
***/
void f_addPile(ts_Pile **pIn, unsigned int const iVal){
ts_Pile *tmp = malloc( sizeof( ts_Pile ) );
if( !tmp ){
perror( "Erreur interne d'allocation\n" );
exit( 1 );
}
/* Ajout de l'élément */
tmp->iVal = iVal;
tmp->pPrec = *pIn;
*pIn = tmp;
}
/***
* fonction qui retire un élement
* de la Pile
***/
unsigned const int f_PopPile(ts_Pile **pIn){
unsigned int iVal = 0;
ts_Pile *tmp = NULL;
if( !*pIn )
return ( -1 );
tmp = (*pIn)->pPrec;
iVal = (*pIn)->iVal;
free( *pIn );
*pIn = tmp;
return ( iVal );
}
/***
* Fonction qui libère
* la mémoire allouer
***/
void f_FreeAlloc( ts_Pile **pIn){
ts_Pile *tmp = NULL;
if( f_isEmpty( pIn ) != true ){
while( *pIn ){
tmp = (*pIn)->pPrec;
free ( *pIn );
*pIn = tmp;
}
*pIn = NULL;
tmp = NULL;
}
}
/***
* Fonction principale
***/
int main( void ) {
int i = 0;
/* Déclaration des piles & initialisation */
ts_Pile *pile_1 = NULL; /* Pile (1) */
ts_Pile *pile_2 = NULL; /* Pile (2) */
ts_Pile *pile_3 = NULL; /* Pile (3) */
/* tableau de Pointeur */
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
/* Ajouts des valeurs à la pile */
for(; i < 20 ; i++){
f_addPile( pTabAddr[0], i );
f_addPile( pTabAddr[1], (i*2) );
f_addPile( pTabAddr[2], (i*4) );
}
/* Affichage des Piles */
for(i = 0; i < 20 ; i++)
printf("Pile (1)\t= %d\n", f_PopPile(&pile_1) );
for(i = 0; i < 20 ; i++)
printf("Pile (2)\t= %d\n", f_PopPile(&pile_2) );
for(i = 0; i < 20 ; i++)
printf("Pile (3)\t= %d\n", f_PopPile(&pile_3) );
/* Désalocation mémoire */
f_FreeAlloc( pTabAddr[0] );
f_FreeAlloc( pTabAddr[1] );
f_FreeAlloc( pTabAddr[2] );
return ( 0 );
}
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
Il ne se plaint pas sur cette ligne, ton compilateur ? Il est trop laxiste, il y a une erreur de type que le mien me signale :
ts_Pile **pTabAddr[3] = { &pile_1, &pile_2, &pile_3 };
est bien mieux.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
48
18 juil. 2014 à 14:28
18 juil. 2014 à 14:28
Je n'ai pas de compilateur sur le pc que j'utilise actuellement, j'ai donc utilisé un éditeur en ligne dont le lien est le suivant https://ideone.com/X8YXlg
et bien entendu il me dit que tout va bien -_-
et bien entendu il me dit que tout va bien -_-
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 816
18 juil. 2014 à 23:46
18 juil. 2014 à 23:46
Bonjour,
Effectivement, il y a une erreur...
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
si ton compilateur ne crie pas avec ça, il faut en changer... Ou alors mieux le régler...
pile_1 est un pointeur, donc &pile_1 est un double pointeur. Il vaut donc ts_pile **pTabAddr[3] comme l'indique le père.
D'ailleurs, tu n'as même pas besoin de préciser la taille du tableau :
De plus, attention à tes noms de variable. En C (contrairement à d'autres langages), ce n'est pas très conseillé de commencer par un underscore. Enfin rien d'interdit. En revanche, underscore suivi d'une majuscule comme dans _Pile n'est pas autorisé.
Effectivement, il y a une erreur...
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
si ton compilateur ne crie pas avec ça, il faut en changer... Ou alors mieux le régler...
pile_1 est un pointeur, donc &pile_1 est un double pointeur. Il vaut donc ts_pile **pTabAddr[3] comme l'indique le père.
D'ailleurs, tu n'as même pas besoin de préciser la taille du tableau :
ts_Pile **pTabAddr[] ={&pile_1, &pile_2, &pile_3};
De plus, attention à tes noms de variable. En C (contrairement à d'autres langages), ce n'est pas très conseillé de commencer par un underscore. Enfin rien d'interdit. En revanche, underscore suivi d'une majuscule comme dans _Pile n'est pas autorisé.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
48
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
19 juil. 2014 à 21:24
19 juil. 2014 à 21:24
Oui, sauf que
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
48
>
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
19 juil. 2014 à 21:28
19 juil. 2014 à 21:28
Oui, effectivement sauf que j'ai utilisé un compilateur online ,quant au variable ben c'est plus une signature mais bon tu a raison ;-)
Modifié par sambia39 le 17/07/2014 à 15:08
je porte les modifications sur la source ce soir et je reposterais le résultat,
merci voisin & (+1)
à bientôt