Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1835 connectés 

  FORUM HardWare.fr
  Programmation

  [C] plantage à l'execution

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] plantage à l'execution

n°27223
Pschitt
Posté le 24-04-2001 à 22:51:48  profilanswer
 

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

mood
Publicité
Posté le 24-04-2001 à 22:51:48  profilanswer
 

n°27225
la viper
Posté le 24-04-2001 à 23:15:46  profilanswer
 

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.

n°27226
gilou
Modérateur
Modzilla
Posté le 24-04-2001 à 23:16:58  profilanswer
 

>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é!  --
n°27230
Pschitt
Posté le 24-04-2001 à 23:27:57  profilanswer
 

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

n°27232
verdoux
And I'm still waiting
Posté le 24-04-2001 à 23:30:34  profilanswer
 

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

n°27233
Pschitt
Posté le 24-04-2001 à 23:41:04  profilanswer
 

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 ?

n°27234
verdoux
And I'm still waiting
Posté le 24-04-2001 à 23:46:02  profilanswer
 

SI !

n°27236
Pschitt
Posté le 24-04-2001 à 23:54:12  profilanswer
 

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

n°27246
la viper
Posté le 25-04-2001 à 00:22:05  profilanswer
 

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.

n°27248
la viper
Posté le 25-04-2001 à 00:24:22  profilanswer
 

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 ?

mood
Publicité
Posté le 25-04-2001 à 00:24:22  profilanswer
 

n°27251
Pschitt
Posté le 25-04-2001 à 00:35:17  profilanswer
 

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

n°27284
la viper
Posté le 25-04-2001 à 09:49:04  profilanswer
 

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..

n°27291
gilou
Modérateur
Modzilla
Posté le 25-04-2001 à 10:06:04  profilanswer
 

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é!  --
n°27311
BENB
100% Lux.
Posté le 25-04-2001 à 10:32:01  profilanswer
 

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...

n°27312
BENB
100% Lux.
Posté le 25-04-2001 à 10:37:49  profilanswer
 

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...

n°27428
LeGreg
Posté le 25-04-2001 à 12:52:58  profilanswer
 

[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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C] plantage à l'execution

 

Sujets relatifs
Faire une pause dans l'éxécution d'une boucle en C++ ?Comment casser l'éxécution d'une boucle en C++ ?
[Visual C++] & [MFC] : plantage de D.A.O (MSJet)Comment connaitre le temp d'éxécution d'une boucle en C++ ?
Plantage UDMA100 toujours et encoreExecution d'une macro dans powerpoint:
[ASP]Execution d'une page ASP sur un autre server[Moteur php] Comment stopper l'execution d'un script ??
éxecution d'un vbs par sqlserver avec whsplantage apache apres avoir installé Wingate , HELP !!!
Plus de sujets relatifs à : [C] plantage à l'execution


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR