[C] plantage à l'execution

plantage à l'execution [C] - Programmation

Marsh Posté le 24-04-2001 à 22:51:48    

Mon projet(sous VC++6) me génère un exe qui plante à chaque fois que j'utilise un type défini dans un fichier en tête lui même inclu dans mon main correctement.        
 
Compil et link passe nickel, pas même 1 warning
 
N'y comprends rien :(
 
Alors si une âme charitable aurait un tuyau ?
 
Merci

Reply

Marsh Posté le 24-04-2001 à 22:51:48   

Reply

Marsh Posté le 24-04-2001 à 23:15:46    

bah c'est dur de repondre comme ca ... mais j' suis pret à parier que ca vient d'un pointeur  :pt1cable:  
non initialisation
violation de partage memoire ...
bref, un bug imputable au programmeur
 
c'est un mode console / API / MFC .. ??
 
montre nous ton code.

Reply

Marsh Posté le 24-04-2001 à 23:16:58    

>Compil et link passe nickel, pas même 1 warning  
 
T'as essaye avec les warning en niveau 4??
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-04-2001 à 23:27:57    

C'est en console et en niveau 3
 
mes pointeurs sont bien initialisés :
 
OBJ * objet1;
objet1=NULL;
 
Pour ce qui est de mon code j'ai 2 sources :
 
 1 -> fonctions avec son header  
 1 -> main
 
vous les balancer m'est difficile car bien que ce soit un projet des + modestes y'en + de 100 lignes

Reply

Marsh Posté le 24-04-2001 à 23:30:34    

objet1=NULL; c'est pas vraiment un objet bien initialisé :D

Reply

Marsh Posté le 24-04-2001 à 23:41:04    

Bon en niveau 4 ça passe
 
Je vous détaille un peu le code
 
Voici mon type :  
 
typedef struct {
int noDossard;
char numTel[10];
float vitesse;
char nom[25];
} OBJ;
 
OBJ * objet1;
objet1=NULL;
 
objet1->noDossard=1; !! PLANTAGE !!
 
Je crois qui doit manquer un malloc quelque part ? NON ?

Reply

Marsh Posté le 24-04-2001 à 23:46:02    

SI !

Reply

Marsh Posté le 24-04-2001 à 23:54:12    

OK
 
Je suis vert, ça fait un moment que je galère
 
En fait c'est un code que j'ai récupéré de TurboC avec lequel il ne plantait pas malgré ma grosse bourde ?
 
Faisait il l'allocation à ma place ?
Bizarre
 
Enfin bref c'est solutionné  
 
Merci

Reply

Marsh Posté le 25-04-2001 à 00:22:05    

heu moi j'm'y serais pris autrement.
 
bon admettons.
typedef struct {  
int noDossard;  
char numTel[10];  
float vitesse;  
char nom[25];  
} OBJ;  
 
OBJ ma_structure_et_non_ma_classe;
OBJ* ptr_struct = &ma_structure_et_non_ma_classe;
 
là tu as initialisé une variable et initialisé un pointeur qui "pointe" sur cette dite variable.
 
A ce moment et seulement à ce moment, tu as des tableaux qui sont "crées" dans ta mémoire.
 
avec ta méthode .. tu "pointais" vers une structure qui n'etait pas 'initialisée' donc ses zones memoire n'existait pas encore.
 
enfin j'coirs vu l'heure et sur un mal entendu j'peux me tromper.

Reply

Marsh Posté le 25-04-2001 à 00:24:22    

pour revenir à ta question
 
NON, le compilo ne fait pas d'allocation mémoire à ta place. (ce serait trop beau .. mais ce ne serait pas rigoureux)
 
tu as du faire un ...
OBJ* ptr = (OBJ*)malloc(sizeof(OBJ));
 
c'est ca ?

Reply

Marsh Posté le 25-04-2001 à 00:24:22   

Reply

Marsh Posté le 25-04-2001 à 00:35:17    

Non mon code sous TurboC est texto celui la :
 
typedef struct {  
int noDossard;  
char numTel[10];  
float vitesse;  
char nom[25];  
} OBJ;  
 
OBJ * objet1;  
objet1=NULL;  
 
objet1->noDossard=1
 
Et ça marche, je viens juste de le tester de nouveau

Reply

Marsh Posté le 25-04-2001 à 09:49:04    

bon ben tu n'as plus de probleme alors !
il faut tout de meme faire attention à ces allocations de memoire.
 
en fait, ici ton typedef remplace tous tes OBJ qui se trouve dans ton code par struct{...}
hors suivant les compilo, je sais pas s'ils acceptent tous de creer directement un pointeur desss. deux cas existe .. soit le compilo comprend OBJ comme une variable et donc il es possible de faire un pointeur dessus, soit il comprend OBJ comme une declaration et là normalement ca devrait pas fonctionner.
en fait, à ce niveau là et avec ce code tu es tout de meme tributaire du bon vouloir du compilo ... moi je te conseille d'ecrire du code un peu plus explicite .. dans tous les cas tu y gagnes, tu comprends mieux ton code et tu sais mieux comment le compilo va reagir..

Reply

Marsh Posté le 25-04-2001 à 10:06:04    

Pschitt a écrit a écrit :

Non mon code sous TurboC est texto celui la :
 
typedef struct {  
int noDossard;  
char numTel[10];  
float vitesse;  
char nom[25];  
} OBJ;  
 
OBJ * objet1;  
objet1=NULL;  
 
objet1->noDossard=1
 
Et ça marche, je viens juste de le tester de nouveau




 
Ca marche peut etre, mais pour une mauvaise raison, car ce code est errone: objet1 n'a pas ete alloue, ert donc tu ne peux pas en utiliser ses membres.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-04-2001 à 10:32:01    

Turbo C++ c'est du Dos, il ne voit pas toutes les erreurs sur la memoire...
 
VC++ en mode console c'est du Windows et la y + de protections.
 
Certains programmes marchent avec des bugs enormes...

Reply

Marsh Posté le 25-04-2001 à 10:37:49    

la viper a écrit a écrit :

bon ben tu n'as plus de probleme alors !
il faut tout de meme faire attention à ces allocations de memoire.
 
en fait, ici ton typedef remplace tous tes OBJ qui se trouve dans ton code par struct{...}
hors suivant les compilo, je sais pas s'ils acceptent tous de creer directement un pointeur desss. deux cas existe .. soit le compilo comprend OBJ comme une variable et donc il es possible de faire un pointeur dessus, soit il comprend OBJ comme une declaration et là normalement ca devrait pas fonctionner.
en fait, à ce niveau là et avec ce code tu es tout de meme tributaire du bon vouloir du compilo ... moi je te conseille d'ecrire du code un peu plus explicite .. dans tous les cas tu y gagnes, tu comprends mieux ton code et tu sais mieux comment le compilo va reagir..




 
? ? ?
typedef defini un type. donc OBJ est un type
ca ne concerne pas le preprocesseur il n'y a pas de remplacement c'est un synonyme qui est genere.
 
en C on fait en general
typedef struct Sobj {
...
} obj;
et obj = struct Sobj
evidement en C++ il suffit de faire struct OBJ pour definir OBJ...

Reply

Marsh Posté le 25-04-2001 à 12:52:58    

[citation]
Certains programmes marchent avec des bugs enormes...
[/citation]
Mon prof il appelait ca les programmes qui "marchent par erreur"  
;).
Evidemment au bout d'un moment il finit par planter et le programmeur debutant il comprend pas: "ben ca marchait avant.."
 
A+
Legreg

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed