c# unsafe error : cannot take the address or size of a variable of...

c# unsafe error : cannot take the address or size of a variable of... - C#/.NET managed - Programmation

Marsh Posté le 19-03-2004 à 08:57:10    

Bonjour,
 
J'aimerais ecrire une structure d'arbre binaire en C#. Afin de pouvoir utiliser des pointeurs, j'ai passé mes classes en unsafe.
 
Voici ce que ca donne :  
 

Code :
  1. public unsafe class CArbre {
  2.  protected CNoeud* racine ;
  3.  public void ajouter() {...}
  4.  public void supprimer() {...}
  5.  public CNoeud* getRacine() {
  6.   return racine ;
  7.  }
  8.  // Constructeur
  9.  public CArbre() {
  10.   CNoeud r = new CNoeud() ;
  11.   *racine = &r ;
  12.  }
  13. }


 

Code :
  1. public unsafe class CNoeud {
  2.  protected CNoeud* fg ;     // Fils Gauche
  3.  protected CNoeud* fd ;     // Fils Droit
  4.  // Constructeur
  5.  public CNoeud() {
  6.   fg = null ;
  7.   fd = null ;
  8.  }
  9. }


 
Lorsque je compile, une erreur survient :
 
Cannot take the address or size of a variable of a managed type sur la ligne *racine = &r
 
Je veux bien qu'il ne veuille puisse pas prendre l'adresse d'un type managé, mais j'ai dit que ma classe était "unsafe" ! Donc ca devrait passer, non ?
 
Si l'un de vous pouvait me donner un petit coup de main :)
 
Et pendant que j'y suis : existe-t-il un compilateur c++.NET gratuit qui me permette de compiler du code c++.NET que je pourrai intégrer à du C# ?
 
Merci !!

Reply

Marsh Posté le 19-03-2004 à 08:57:10   

Reply

Marsh Posté le 19-03-2004 à 09:32:39    

tu ne confondrais pas unsafe et unmanaged par hasard ?
 
et pourquoi tu fais du code unsafe ? manifestement tu débutes et dans le mauvais sens !


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 09:49:41    

1 - In unsafe code or in other words unmanaged code it is possible to declare and use pointers.
source : http://www.codeproject.com/csharp/unsafe.asp
 
2 - On a pas le droit d'être débutant sur ce forum ???
 
3 - J'aurais aimé une remarque constructive. Merci.


Message édité par Eugt le 19-03-2004 à 09:50:15
Reply

Marsh Posté le 19-03-2004 à 10:06:18    

1) au temps pour moi.
 
2) tu as parfaitement le droit d'être débutant, mais débuter par du code unsafe alors que c'est un truc assez chiadé (à cause des invariants du GC et de l'interraction avec les règles de sécurité), c'est pas l'idée la plus directe du débutant.
 
3) je t'emmerde.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 10:16:16    

1&2 - Tu crois que je n'ai pas réfléchi sur comment faire des arbres AVL à peu près performants sans pointeurs ? Et je ne dispose que du C# (ou alors il faut que j'arrive à intégrer du C++ dans du C#, mais je ne sais pas comme ca fonctionne, d'où ma dernière question)
 
3 - C'est bien ce que je pensais...

Reply

Marsh Posté le 19-03-2004 à 10:20:37    

quelle est la limitation induite par le système classique des références ???


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 10:35:35    

Mon algo doit être le plus performant possible. Et la gestion de pointeurs, bien que lourde à la programmation, est plus efficace à l'execution qu'avec des objets managés.


Message édité par Eugt le 19-03-2004 à 10:36:22
Reply

Marsh Posté le 19-03-2004 à 10:37:12    

http://msdn.microsoft.com/library/ [...] ec_a_6.asp  
 
ça dit quoi quand tu utilises le "fixed" kivabien ?
 
(par contre, ça veut dire quand même que c'est loin d'être comme tu veux l'utiliser le unsafe)


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 10:40:20    

Eugt a écrit :

Mon algo doit être le plus performant possible. Et la gestion de pointeurs, bien que lourde à la programmation, est plus efficace à l'execution qu'avec des objets managés.

t'as fait un bench ?
 
Sachant qu'avec des pointeurs tu va trasher la mémoire avec des objets non déplaçables (donc changer la tendance dans le comportement d'allocation) et non collectables aussi tôt que possible, je suis pas convaincu.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 11:10:25    

Merci pour ce lien, je n'avais pas bien compris l'utilité du "fixed"... Je vais regarder plus en profondeur...
 
et désolé d'avoir parlé un peu sèchement...
 
Je te tiens au courant (si ça t'interesse)
A+

Reply

Marsh Posté le 19-03-2004 à 11:10:25   

Reply

Marsh Posté le 19-03-2004 à 11:25:03    

oué, ça m'intéresse, mais je crois que je viens de comprendre l'affaire, et tu vas tomber sur le cul si tu comprends la même chose que moi.
 
Si je me plante pas, tu peux ranger ton idée dans ton slip et faire du C# normal.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 11:31:08    

Ben j'ai l'impression (d'apres ce que je suis entrian de lire) qu'en fait ma variable est unmanaged que pendant la durée du fixed ???
 
Qu'as-tu compris, toi ?

Reply

Marsh Posté le 19-03-2004 à 11:36:50    

que les objets sont tous alloés normalement (dans le GC, et tout) on le bloque, on fait les conneries unsafe et on débloque. ça veut entre autres dire qu'on a pas le droit de garder un pointeur dessus (car l'objet va être déplacé en mémoire au prochain GC, changement de génération ou compactage).
 
Ce qui veut dire que c'est même pas possible de faire ton arbre en pointeurs (ce qui est déjà une idée pas très fine) à moins d'une énorme contortion consistant à bloquer les noeuds durant toute leur durée de vie. Explosant du même coup l'allocateur.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 11:43:00    

Ouais, bon, c'est pas la peine, quoi...
 
J'en reviens donc à ma seconde question :
Comment faire pour pouvoir utiliser du code C++ dans un programme C# ? Est-ce possible ?

Reply

Marsh Posté le 19-03-2004 à 11:45:18    

oui, les assembly sont indépendantes du langage.
 
mais je comprends pas pourquoi tu veux pas le faire en C#.
La vitesse n'a rien à voir avec le langage.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 11:57:45    

En fait je me suis mal exprimé... je ne parlais pas de C++.NET, mais de C++ normal... (Je n'ai pas VS.NET, j'utilise un compilateur gratuit pour C#, donc je n'ai pas de compilo C++.NET).
Les assembly ne sont pas du MSIL dans ce cas... puis-je quand meme les intégrer ?
 
Mais il y a quelque chose que je ne comprends pas... Si je prends un compilo C++ genre borland ou gcc, est-ce qu'il est capable de compiler en .NET ?
 
Le problème, c'est que en C# (cad sans pointeurs), ca va vraiment alourdir... il y a des rotations entre les noeuds dans l'arbre, des insertions, des suppressions... Avec pointeurs il suffit de modifier la valeur du pointeur, alors que sans pointeur, il faut faire des copies d'objets, et c'est beaucoup plus lourd !

Reply

Marsh Posté le 19-03-2004 à 12:12:10    

Eugt a écrit :

Avec pointeurs il suffit de modifier la valeur du pointeur, alors que sans pointeur, il faut faire des copies d'objets, et c'est beaucoup plus lourd !

RAAAAAAAAAAAAAAHHHHHHHHHHHHHHHH
 
 
pardon, il faut être explicatif avec les débutants.
 
 
http://msdn.microsoft.com/library/ [...] spec_4.asp
 
en gros, par défaut, les variables qui sont typées par des classes, sont des références vers une instance de la classe (idem dans la plupart des langages, le C, C++ et Ada sont les rares exception à cette vielle habitude). Techniquement, si on va voir dans la mémoire, ça a toutes les chances d'être un pointeur (mais pas toujours) vers le premier octet de l'objet.
 
La différence entre pointeur et référence ? C'est essentiellement une différence réthorique.
référence : c'est la désignation d'un objet en mémoire, on ne peut pointer vers un objet invalide, on ne peut pas l'affecter à n'importe quelle case mémoire mais que vers des objets (ou null).
 
pointeur : c'est la désignation d'une case mémoire, on peut changer un pointeur pour faire de l'arthmétique, lui faire désigner des choses invalides, tout casser.
 
 
Attention, ça a une grammaire qui ressemble à du C/C++, mais ça a une sémantique assez lointaine (par exemple, ne te fait pas avoir sur ~TaClasse() qui n'est pas le destructeur), comme Java.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 13:22:49    

Ok... En fait je connais bien la différence en valeur et réference, mais je n'avais pas vraiment saisi la différence entre pointeur et référence...
 
En fait en C++, je faisais "Carbre A;" et ca m'appelait le constructeur, alors qu'en C# ca n'est pas le cas, il faut que je fasse un "new", sinon j'ai juste une référence vide...
 
Par contre, je n'ai pas compris ce que tu as dit sur le destructeur... je viens de lire au contraire que ca c'etait pareil qu'en C++, qu'il était appelé automatiquement au moment ou le GC passe...


Message édité par Eugt le 19-03-2004 à 13:23:31
Reply

Marsh Posté le 19-03-2004 à 13:30:15    

En fait je me suis vraiment compliqué la vie pour rien j'ai l'impression...

Reply

Marsh Posté le 19-03-2004 à 13:39:58    

oué, c'est fin (et artificiel). Le pb vient de l'enseignement du C comme premier langage qui est un langage un peu tout seul dans sa catégorie.
 
attention cependant, une référence C#/java peut référencer null, en C++ ça ne peut pas (plus exactement, ça ne devrait pas, hélas).
 
tiens pour le destructeur/finaliseur et autres conneries:
http://www.ondotnet.com/pub/a/orei [...] _0801.html
Mon conseil du jour : n'utilise pas de finaliseur avant d'avoir 2 ans d'expérience ou sinon, fait superviser par un mentor C#. Je dois t'avouer qu'autant en C# qu'en java je l'ai jamais utilisé, j'ai plusieurs fois eu la tentation, mais ça n'en a jamais valu la peine.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 13:42:58    

Eugt a écrit :

En fait je me suis vraiment compliqué la vie pour rien j'ai l'impression...

T'inquiètes pas, des coneries on les accumule tous, par contre, c'est important que quelqu'un nous prévienne rapidement (et explique l'affaire).
 
Essaye de trouver quelqu'un dans ton entourage qui maîtrise le sujet sur leque t'es et qui te servira de "mentor" pour cet aspect des choses, c'est la meilleur façon que je connaisse d'apprendre (expérience vécue).
 
edit : fait une recherche sur mon pseudo pour voir mes conneries (en plus énervé et refusant de les admettre)


Message édité par nraynaud le 19-03-2004 à 13:45:43

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-03-2004 à 14:29:59    

lol :)
 
En tout cas merci pour toutes ces infos et liens, je vois deja beaucoup plus clair maintenant...
Je vais déjà commencer par relire mon tutoriel C# (en entier cette fois ;) ), et après je me chercherai un "mentor"...
 
A+

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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