Unsafe pointeurs et gestion des adresses

Halicorne Messages postés 2 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 24 mai 2008 - 23 mai 2008 à 23:41
Halicorne Messages postés 2 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 24 mai 2008 - 24 mai 2008 à 10:19
Salut à tous,

J'ai quelques soucis avec la gestion des pointeurs en C# :
voici le code que je désire gérer :

using System;

namespace ltest
{
    public class test
    {
        static unsafe ltest.test* root;       // racine
        string str;                          // string
        unsafe ltest.test* right;             // pointeur de droite
        unsafe ltest.test* left;              // pointeur de gauche
 
        public test(string p_str)
        {
          str=p_str;
        }

        public static unsafe bool find(string p_srch){
            ltest.test* l_ptr=root;
            while(l_ptr!=null){
                if(l_ptr.str.CompareTo(p_srch)==0) return true;
                else {
                    if(l_ptr.mot.CompareTo(p_srch)>0) l_ptr=&l_ptr.right;
                    else l_ptr=&l_ptr.left;
                }
            }
            return false;
        }
    }
}

Le code ne compile pas : [Task:File=/ltest/ltest/Main.cs, Line=10, Column=33, Type=Error, Priority=Normal, Description=Cannot take the address of, get the size of, or declare a pointer to a managed type `ltest.test'(CS0208)]

Malgré tous mes efforts, j'ai du mal à comprendre pourquoi (l'option autoriser le code non sur est activée).

Merci de votre aide.
Halicorne.
    Pas de projection, c'est ici et maintenant que se font les choses !!!

3 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 mai 2008 à 00:02
Salut,

As tu regarder ceci ? : http://msdn.microsoft.com/fr-fr/library/x2estayf(VS.80).aspx

/*
coq
MVP Visual C#
CoqBlog
*/
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
24 mai 2008 à 09:01
Salut,

Comme le dit le lien de coq, l'arithmétique des pointeurs n'est pas permises avec les types managés. Pour ma part, je pense que l'unsafe a été conservé en C# pour tout ce qui est accès en mémoire de type "données", pour les streams, les buffers, etc...
Mais que, comme le traduit ton erreur, on ne devrait pas utiliser ces pointeurs pour manipuler des objets.

Mon avis est qu'il est possible de (à peu près allez...) tout faire (des choses conventionnelles disons...) avec ce que nous propose C# sans l'arithmétique de pointeurs, et que tu devrais repenser ton code, mais je peux me tromper...

J'ai l'impression en regardant ton code, que tu as déclaré tous tes objets membres de type "test" en tant que pointeur comme on l'aurait fait en C++. Sais-tu qu'en C#, toute déclaration d'objet est faite nativement par référence ?

Donc déclarer
Object* myObject;       //En C++
Revient à déclarer
Object myObject;         //En C#

Pardonne moi de paraitre "trop didactique" si tu es déjà au courant de toutes ces choses, on ne sait jamais sur qui on tombe, avec quelle expérience, sur le forum après un message

<hr size="2" width="100%" />Julien.
0
Halicorne Messages postés 2 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 24 mai 2008
24 mai 2008 à 10:19
Merci beaucoup pour vos conseils avisés.

En fait, je cherchais à pouvoir (comme en C ou C++) affecter les attributs left ou right (pointeurs d'instances) d'une structure/classe locale à une fonction, qui pointerait sur une variable existant ailleurs que dans le bloc.

J'ai trouvé la solution sans utilisation de l'option unsafe :

public static void add(string p_str,ref ltest p_mot){
    if(p_mot==null) {
        p_mot=new Mot(p_str);
    } else {
        if(p_mot.mot.CompareTo(p_str)>0) add(p_str,ref p_mot.right);
        else add(p_str,ref p_mot.left);
    }
}

Problème réglé !!!!
Merci encore.
Halicorne

    Pas de projection, c'est ici et maintenant que se font les choses !!!
0
Rejoignez-nous