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

  FORUM HardWare.fr
  Programmation

  0xcdcdcdcd

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

0xcdcdcdcd

n°85730
dindonpoil​u
Posté le 03-01-2002 à 14:47:05  profilanswer
 

Sous Visual C++, pour savoir si une adresse est allouée ou non je vérifie si elle est égale à 0xcdcdcdcd. Si c'est le cas elle n'est pas allouée.
 
Est-ce qu'il existe la même possibilité avec gcc sous Linux ?

mood
Publicité
Posté le 03-01-2002 à 14:47:05  profilanswer
 

n°85733
youdontcar​e
Posté le 03-01-2002 à 14:51:27  profilanswer
 

arrête ça tout de suite. la mémoire est initialisée à 0xcdcdcdcd en DEBUG. en release ça plantera.  
 
je vois vraiment pas pourquoi t'as besoin de ça d'ailleurs ... à part pour faire nimpe :D
 
sinon y'a IsBadReadPtr() & co pour tester la mem.

n°85734
dindonpoil​u
Posté le 03-01-2002 à 14:53:23  profilanswer
 

scuse moi j'suis pas une bête en programmation. Je pige pas tout ce que tu dis.
c quoi "en DEBUG" ?
"nimpe" ?
bon je vais me renseigner pour voir ce que c'est IsBadReadPtr()

n°85736
youdontcar​e
Posté le 03-01-2002 à 14:57:58  profilanswer
 

tu as (au moins) deux modes de compilation.
 
debug = pour ... le debug, vc++ génère du code en plus comme l'initialisation de la variable allouée à 0xcdcdcdcd & co. le code généré n'est pas optimisé et donc plutôt lent.
 
release = code optimisé : plus petit, plus rapide, plus mieux. quand tu distribues (= quand tu releases) un programme, tu donnes cet éxécutable et non pas celui du dessus.
 
nimpe = n'importe quoi ...

n°85738
dindonpoil​u
Posté le 03-01-2002 à 15:01:29  profilanswer
 

ok donc en release je peux pas savoir si l'adresse est allouée ou pas ?
 
pas grave, au pire je fais nimpe :)

n°85741
youdontcar​e
Posté le 03-01-2002 à 15:03:02  profilanswer
 

tu t'en sers pour quoi exactement ? j'ai beau chercher, je ne vois pas de cas où tu pourrais en avoir besoin ...

n°85745
godbout
Génial.
Posté le 03-01-2002 à 15:07:20  profilanswer
 

au pire tu testes si c'est egal a NULL nan ??


---------------
Super.
n°85746
dindonpoil​u
Posté le 03-01-2002 à 15:07:55  profilanswer
 

j'ai un tableau avec plein de cases, un pointeur dans chaque case. Je ne veux pas allouer tous les pointeurs donc je le fais au fur et à mesure (si j'en ai besoin)
Donc pour un indice donné je regarde si le pointeur est une adresse valide, et si c'est pas le cas je l'alloue.

n°85747
dindonpoil​u
Posté le 03-01-2002 à 15:10:07  profilanswer
 

Godbout a écrit a écrit :

au pire tu testes si c'est egal a NULL nan ??  




 
moi je veux bien mais faudrait que tous les pointeurs dans mon tableaux soient initialisés à NULL au départ.
Mais en fait j'ai plein de tableaux, avec plein de cases. Et je veux réduire la complexité de mon algo.

n°85748
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-01-2002 à 15:10:39  profilanswer
 

bhen faudrait au moins initialiser ton tableau avec des NULL comme ça t'es sûr qu'y a NULL Si un pointeur est pas alloué, et au moins tu testes avec une valeur fiable (que tu as mises au démarrage du prog)
tu prends une fonction dont je ne me souviens pas du nom qui fout des 0 sur toute la zone mémoire de ton tableau, avant la première allocation bien sûr.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 03-01-2002 à 15:10:39  profilanswer
 

n°85749
godbout
Génial.
Posté le 03-01-2002 à 15:11:19  profilanswer
 

Ben personnellement j'initialise chacun de mes pointeurs a NULL, et lorsque je les libere avec un free je les remet a NULL aussi


---------------
Super.
n°85750
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-01-2002 à 15:13:17  profilanswer
 

c'est plus sûr, vu que le free ne met pas à null, y a un risque de faire plusieurs free si tu fais un truc genre if(machin<>NULL) free;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°85753
godbout
Génial.
Posté le 03-01-2002 à 15:15:55  profilanswer
 

c'est bien pour ca que je le fais ;)


---------------
Super.
n°85755
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-01-2002 à 15:18:43  profilanswer
 

en Delphi c'est encore plus vicieux:
tu as la méthode Destroy qui libère la mémoire, et la méthode Free qui libère la mémoire si elle est = à nil (null quoi).
ça laisse penser que si elle est assez intelligente que pour faire le test avant de libérer, elle met à nil après, bhen non :sweat:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°85757
dindonpoil​u
Posté le 03-01-2002 à 15:23:53  profilanswer
 

et y'a pas un truc simple pour initialiser toutes les cases d'un tableau avec une valeur précise ? au lieu de faire une boucle à la con et de le faire soi même ?

n°85758
godbout
Génial.
Posté le 03-01-2002 à 15:24:21  profilanswer
 

Ben une boucle c'est pas la mort :??:


---------------
Super.
n°85760
deathsharp
Posté le 03-01-2002 à 15:27:55  profilanswer
 

pour le NULL jsuis pas sur qu'il faille init a NULL avant l'allocation.
si elle echoue, le pointeur sera NULL. (a verifier)
 
sinon en C++ yaurai bien une methode avec new, try et bad_alloc


---------------
What butter and whiskey won't cure, there is no cure for.
n°85761
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-01-2002 à 15:28:12  profilanswer
 

dindonpoilu a écrit a écrit :

et y'a pas un truc simple pour initialiser toutes les cases d'un tableau avec une valeur précise ?



 
bhen tu fais un truc genre memset pour mettre tout le tableau à 0, ça devrait passer...

 

[edtdd]--Message édité par antp--[/edtdd]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°85762
youdontcar​e
Posté le 03-01-2002 à 15:28:50  profilanswer
 

oui, franchement une boucle c'est pas la mort ... sinon un memset() peut faire l'affaire.

n°85763
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-01-2002 à 15:29:50  profilanswer
 

deathsharp a écrit a écrit :

pour le NULL jsuis pas sur qu'il faille init a NULL avant l'allocation.
si elle echoue, le pointeur sera NULL. (a verifier)




 
NULL c'est pour savoir si c'est déjà alloué... Si on n'initialise pas, on ne peut pas savoir à tout moment si une case représente un pointeur réel ou juste une crasse en mémoire. Si on initialise à null, un if(machin<>NULL) suffit.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°85764
deathsharp
Posté le 03-01-2002 à 15:32:08  profilanswer
 

c vrai :jap:


---------------
What butter and whiskey won't cure, there is no cure for.
n°85767
LeGreg
Posté le 03-01-2002 à 15:45:13  profilanswer
 

Godbout a écrit a écrit :

Ben personnellement j'initialise chacun de mes pointeurs a NULL, et lorsque je les libere avec un free je les remet a NULL aussi  




 
eheh si tu veux voila de quoi te donner mal au crane :
tu as deux objets A et B, chacun possede un pointeur vers un autre objet C (appelons les pCa et pCb).
Supposons qu'il faille liberer l'objet C. qui le libere A ou B?
peu importe supposons pour l'exemple qu'il s'agisse de B.
donc B fait ce que tu dis, il libere C et met pCb a nul.
Or A qui ignore tout de B (et inversement)
continue a croire que C est alloue. => au prochain appel
de C, plantage (ou pire, pas plantage).
 
Tout ca pour dire que les histoires de pointeur
c'est un peu plus complique que "est-il a NULL ou pas".
(et c'est encore pire quand A et B sont dans deux process differents). I
Il faut prevoir le mecanisme a l'avance
et faire en sorte qu'il soit infaillible sinon
=> plantage.
 
A+
LEGREG

n°85768
godbout
Génial.
Posté le 03-01-2002 à 15:50:59  profilanswer
 

Ben je vois pas trop ou est le pb.
Avant de faire l'appel a C tu le testes nan ?


---------------
Super.
n°85774
youdontcar​e
Posté le 03-01-2002 à 15:57:00  profilanswer
 

moi non plus je ne vois pas le problème. c'est résolu depuis belle lurette avec COM (comptage de références), MAX (tableau de références), etc. au final ça se ramène toujours à 'tester si le machin est nul avant de le toucher', ce qui est le problème du topic.

n°85779
LeGreg
Posté le 03-01-2002 à 16:06:25  profilanswer
 

youdontcare a écrit a écrit :

moi non plus je ne vois pas le problème. c'est résolu depuis belle lurette avec COM (comptage de références), MAX (tableau de références), etc. au final ça se ramène toujours à 'tester si le machin est nul avant de le toucher', ce qui est le problème du topic.  




 
chut ;) !
 
COM c'est une solution par exemple
j'essaie juste de leur faire comprendre que
parfois la vie n'est pas aussi simple.
car meme si tu peux utiliser des objets COM
il y a des projets
ou tu te mets en tete de gerer la duree
de vie de tes objets toi meme
et si tu ne vois pas ou est le probleme
c'est la qu'il y a un probleme.
 
A+
LEGREG

n°85780
LeGreg
Posté le 03-01-2002 à 16:07:26  profilanswer
 

Godbout a écrit a écrit :

Ben je vois pas trop ou est le pb.
Avant de faire l'appel a C tu le testes nan ?  




 
explicite :
tu fais le test comment?
 
LEGREG

n°85782
godbout
Génial.
Posté le 03-01-2002 à 16:08:59  profilanswer
 

ben  
if (pC == NULL)
{
 return false;
}
else
{
...
}
 
nan ??


---------------
Super.
n°85877
LeGreg
Posté le 03-01-2002 à 19:47:58  profilanswer
 

je ne sais pas lequel tu appelles pC
 
je suppose que c'est pCa,
mais pCa n'est pas null puisque
personne ne lui a donne la valeur null.
 
Le fait de faire free() sur un pointeur
et de donner la valeur NULL a ce pointeur
ne veut pas dire que tous les pointeurs
qui pointent vers cette espace memoire vont devenir
NULL de facon magique. Et donc ton test est invalide.
 
LEGREG

n°85891
n0mad
inscrit au XXe siècle
Posté le 03-01-2002 à 20:43:00  profilanswer
 

legreg a écrit a écrit :

je ne sais pas lequel tu appelles pC
 
je suppose que c'est pCa,
mais pCa n'est pas null puisque
personne ne lui a donne la valeur null.
 
Le fait de faire free() sur un pointeur
et de donner la valeur NULL a ce pointeur
ne veut pas dire que tous les pointeurs
qui pointent vers cette espace memoire vont devenir
NULL de facon magique. Et donc ton test est invalide.
 
LEGREG  




 
Ben si. Toute variable doit être initialisée sinon c'est de la programmation à l'arrache. Pour les pointeurs, il faut les initialiser à NULL.


---------------
Pipiru piru piru pipiru pi
n°85927
LeGreg
Posté le 03-01-2002 à 23:24:17  profilanswer
 

n0mad a écrit a écrit :

 
Ben si. Toute variable doit être initialisée sinon c'est de la programmation à l'arrache. Pour les pointeurs, il faut les initialiser à NULL.  




 
relis le thread..
 
LEGREG

n°86226
youdontcar​e
Posté le 04-01-2002 à 21:14:12  profilanswer
 

n0mad >> je pense qu'il parlait du cas ou tu as deux objets A et B qui ont un pointeur vers C. si A libère C, le pointeur vers C de B est invalide, car non mis à NULL.

 

[edtdd]--Message édité par youdontcare--[/edtdd]

n°86236
LeGreg
Posté le 04-01-2002 à 22:19:09  profilanswer
 

ben j'essayais d'apprendre des choses a godbout
mais la pedagogie ca n'a pas la cote par ici apparemment :(
 
LEGREG

n°86248
youdontcar​e
Posté le 04-01-2002 à 22:34:30  profilanswer
 

legreg a écrit a écrit :

ben j'essayais d'apprendre des choses a godbout
mais la pedagogie ca n'a pas la cote par ici apparemment :(
 
LEGREG


mais si ... c'est juste que le sujet mérite un topic à lui tout seul et ne devrait pas être mélangé avec un NULLage de pointeurs.

mood
Publicité
Posté le   profilanswer
 


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

  0xcdcdcdcd

 

Sujets relatifs
Plus de sujets relatifs à : 0xcdcdcdcd


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)