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

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°677716
Eugt
Posté le 19-03-2004 à 08:57:10  profilanswer
 

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

mood
Publicité
Posté le 19-03-2004 à 08:57:10  profilanswer
 

n°677738
nraynaud
lol
Posté le 19-03-2004 à 09:32:39  profilanswer
 

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
n°677777
Eugt
Posté le 19-03-2004 à 09:49:41  profilanswer
 

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
n°677793
nraynaud
lol
Posté le 19-03-2004 à 10:06:18  profilanswer
 

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
n°677810
Eugt
Posté le 19-03-2004 à 10:16:16  profilanswer
 

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

n°677815
nraynaud
lol
Posté le 19-03-2004 à 10:20:37  profilanswer
 

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


---------------
trainoo.com, c'est fini
n°677825
Eugt
Posté le 19-03-2004 à 10:35:35  profilanswer
 

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
n°677827
nraynaud
lol
Posté le 19-03-2004 à 10:37:12  profilanswer
 

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
n°677830
nraynaud
lol
Posté le 19-03-2004 à 10:40:20  profilanswer
 

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
n°677883
Eugt
Posté le 19-03-2004 à 11:10:25  profilanswer
 

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+

mood
Publicité
Posté le 19-03-2004 à 11:10:25  profilanswer
 

n°677903
nraynaud
lol
Posté le 19-03-2004 à 11:25:03  profilanswer
 

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
n°677912
Eugt
Posté le 19-03-2004 à 11:31:08  profilanswer
 

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 ?

n°677922
nraynaud
lol
Posté le 19-03-2004 à 11:36:50  profilanswer
 

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
n°677931
Eugt
Posté le 19-03-2004 à 11:43:00  profilanswer
 

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 ?

n°677936
nraynaud
lol
Posté le 19-03-2004 à 11:45:18  profilanswer
 

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
n°677959
Eugt
Posté le 19-03-2004 à 11:57:45  profilanswer
 

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 !

n°677983
nraynaud
lol
Posté le 19-03-2004 à 12:12:10  profilanswer
 

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
n°678053
Eugt
Posté le 19-03-2004 à 13:22:49  profilanswer
 

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
n°678061
Eugt
Posté le 19-03-2004 à 13:30:15  profilanswer
 

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

n°678069
nraynaud
lol
Posté le 19-03-2004 à 13:39:58  profilanswer
 

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
n°678072
nraynaud
lol
Posté le 19-03-2004 à 13:42:58  profilanswer
 

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
n°678131
Eugt
Posté le 19-03-2004 à 14:29:59  profilanswer
 

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+

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
variable[JAVA] attribution dynamique de nom de variable
include variablerecuperer la valeur d'une variable qui se trouve dans une autres page
DataSource : Cannot create JDBC driver of class '' for connect URL 'Problème avec une variable dans une requête
Modification d'une variable globale dans une fonction...Déport server APACHE => autre PC via LAN (error 403 access sub dir)
Affiche une image variable[vba] type de variable
Plus de sujets relatifs à : c# unsafe error : cannot take the address or size of a variable of...


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