IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Pointeur en VB


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut Pointeur en VB
    Bonjour
    J'ai du mal à faire un pointeur/référence sur une variable.
    J'ai un form1 dans lequel il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public C As New class
    Dans cette classe, il y a une structure publique déclarée nommée Entry, et également Public Entries As New ArrayList 'contient que des types Entry
    Dans un autre formulaire, disons form2, il y a dans le Load :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim NewEntry As class_cMoney.Entry
                For Each NewEntry In Form1.C.Entries
                    If NewEntry.Key = Me.Tag Then
                        GoTo suite
                    End If
                Next
    Avec cela, je localise donc une Entry dans l'array Entries par sa propriété Key. J'aimerai sauvegarder "l'adresse" de cette entrée dans une variable pour pouvoir éditer par la suite cette entrée de l'array sans avoir à refaire un For Each et je ne vois pas comment faire, j'ai essayé plusieurs choses mais à chaque fois, mes 2 variables (l'entrée de l'array et la variable censée pointer) ont des valeurs indépendantes.
    Sauriez vous comment faire ?

  2. #2
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    salut,

    je suis pas un pro mais ça devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Dim MyEntrie As New class_cMoney.Entry
     
    Dim NewEntry As class_cMoney.Entry
    For Each NewEntry In Form1.C.Entries
         If NewEntry.Key = Me.Tag Then
              MyEntrie = NewEntry
              NewEntry.Key = "toto"
              GoTo suite
         End If
    Next
     
    suite :
     
    If MyEntrie.Key = "toto" Then
         MessageBox.Show("ça marche !")
    end if

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Non ça ne fonctionne pas, la valeur de MyEntry reste indépendante de NewEntry trouvé dans la boucle.

    J'ai écrit un exemple, en gros, ça donne ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Public Class Form1
     
        Dim Array As New ArrayList
        Dim Pointeur as ???
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Array.Add("truc")
            Array.Add("machin")
     
            Dim ArrayItem As String
            For Each ArrayItem In Array
                If ArrayItem = "machin" Then
                    Pointeur = Adress(ArrayItem)
                    '...
                    'mes opérations
                    '...
                    Exit Sub
                End If
            Next
        End Sub
     
        Private Sub Routine()
            pointeur = "nouveau text" 'on veut ici modifier le ArrayItem trouvé dans la boucle ayant comme valeur "machin"
        End Sub
    End Class

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Je dois être fatigué mais la je pige plus !
    A la ligne Pointeur = Adress(ArrayItem), si on fait ArrayItem = "nouvelle valeur", la valeur de Array(2) reste à "machin"

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Je viens de tester ce code :

    dans un Userform, j'ai 5 Label
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim MyLabel As New Label
     
    		Dim NewLabel As Label
    		For Each NewLabel In Me.Controls
    		     If NewLabel.Text = "label3" Then
    		          MyLabel = NewLabel
    		          NewLabel.Text = "Label Trouvé"
    		     End If
    		Next
     
    		If MyLabel.Text = "Label Trouvé" Then
    		     MessageBox.Show("ça marche !")
    		End If
    => c'est bien ce qu'il me semblait, il fonctionne. Remarque, ceci marche uniquement pour des variables objets : pour les tableaux, il faut utiliser une autre methode.

    Il faut comprendre qu'une variable Objet contient la référence, le pointeur de l'objet, mais pas l'objet lui même.


    Sinon pour ton exemple, je ne vois pas d'autre solution que celle-ci (ton code sera plus lent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Dim Array As New ArrayList
     
    		Array.Add("truc")
            Array.Add("machin")
    		Array.Add("bidule")
    		Array.Add("chose")
     
            Dim Indice As Integer
            DIm i as Integer
     
            For i=0 to (Array.Count - 1)
                If Array(i) = "machin" Then
                    Indice = i
                    Array(i) = "Toto"                
                End If
            Next
     
            If Array(Indice) = "Toto" Then
            	MessageBox.Show("ça marche !")	        	
            End If
    ... mais il doit certainmenent exiter une methode pour pointer directment l'element...personne ne sait ?

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Merci pour ton aide, c'est vrai que ton exemple fonctionne mais les structures sont des variables par valeur...
    Le code avec l'indice va parfaitement également, avec un code simple comme nous en avions ici, mais quand j'essaye d'appliquer cela au mon programme, quand j'essaye n'affecter une valeur à une entrée de l'array, j'ai une erreur :

    "Assignation de liaison tardive à un champ de type valeur 'Entry' non valide lorsque 'Entry' représente le résultat d'une expression de liaison tardive."

    Ca se produit sur chaque ligne de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.C.Entries(CurrentEntry).Obj = txtName.Text
    Où CurrentEntry et un Integer qui contient l'équivalent de "Indice" de ton code, txtName est sur la forme contenant cette ligne, form1 une autre ou il y a une instance de la classe class_cMoney de type public, qui elle même contient une déclaration publique de l'arrayList Entries qui contient des objets de structure Entry définie dans cette même classe en public
    J'imagine que le prob vient de tout ce bazzar mais je ne vois pas pourquoi
    En tout cas merci !

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    il existe des logiciels qui peuvent convertir du code C#.NET en VB.NET (et vis versa) mais je ne ma rappel plus le nom.

    Le mieux c'est peut-être de convertir ton code en C# puis d'utiliser les pointeurs grace au C# et de reconvertir ton code en VB pour voir ce que ça donne (attention, fait une sauvegarde de ton projet car je ne suis pas sure que la convertion VB => C# => VB ne te modifie pas ton code d'origine)

    Remarque : il me semble que tout ce que tu peux faire en C#.NET, tu peux le faire en VB.NET (et vis versa)

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Oui, c'est vrai faudrais essayer, ou peut être même aller directement en C# parce que la, je flotte un peu avec ces histoires d'affectation !!! J'ai trouvé ça pour les liaisons tardives/anticipées mais bon, ça ne m'aide pas beaucoup : http://www.microsoft.com/france/msdn...imization.mspx
    Je vais regarder du coté de C#, d'ailleurs, VB ne sais pas faire tout ce que peux faire C#, comme par exemple les pointeurs et d'autres choses, sinon, il n'y aurai aucun intéret d'avoir 2 langages différents :p

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Citation Envoyé par azerty25
    Je vais regarder du coté de C#, d'ailleurs, VB ne sais pas faire tout ce que peux faire C#, comme par exemple les pointeurs et d'autres choses, sinon, il n'y aurai aucun intéret d'avoir 2 langages différents :p
    => je vais peut-être te dire une connerie mais il me semble que tout ce que tu peux faire en C#, tu peux le faire en VB (après il suffit de savoir comment) : l'interet d'avoir deux languages est que les personnes qui ont commencées par apprendre le language C, peuvent plus facilement s'adapter (ça leur evite d'avoir à apprendre le VB)...

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Oui peut être alors, je vais pas te contredire, ne je ne m'y connais pas assez en .NET. La preuve j'ai encore une merde...
    J'ai décidé d'utiliser des tableaux, comme ça, pas de problème de référence, liaisons tardives etc. J'ai fait une fonction pour utiliser les tableaux comme des piles ou arrayList, qui permet de redimensionner +1 la limite haute du tableau à la volée et d'ajouter une donnée. Elle va bien, mais VB me lance "Impossible d'effectuer un cast d'un objet de type 'System.Object[]' en type 'System.String[]'." après avoir éxécuté le End Sub de la routine AddInArray et avant d'éxécuter le msgbox, pourtant, le tableau est redimensionné et la valeur insérée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim Tab(0) As String
            AddInArray(Tab, "test")
            MsgBox(Tab(0))
        End Sub
     
        Public Sub AddInArray(ByRef array() As Object, ByVal data As Object)
            If UBound(array) = 0 And array(0) = Nothing Then
                array(0) = data
                ReDim Preserve array(1)
            Else
                array(UBound(array)) = data
                ReDim Preserve array(UBound(array) + 1)
            End If
            MsgBox(array(UBound(array) - 1))
        End Sub
    L'erreur ne se produit pas si l'on enleve de AddInArray les ligne avec le Redim Preserve...

    Si des fois tu sais pourquoi cette erreur parce que je commence à m'arrache les cheveux avec mes histoires de variables... et casser les couilles aux autres lol

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Normal qu'il y ai une erreur, tu affectes une variable de type object dans un tableau de type string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sub AddInArray(ByRef array() As string, ByVal data As string)
    J'ai fait quelques recherches sur les pointeurs en C# => mauvaise nouvelle : a priori, en C#, on ne peut pas utiliser les pointeurs...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par azerty25
    Oui peut être alors, je vais pas te contredire, ne je ne m'y connais pas assez en .NET. La preuve j'ai encore une merde...
    J'ai décidé d'utiliser des tableaux, comme ça, pas de problème de référence, liaisons tardives etc.
    Bienvenue dans la logique merveilleuse de Grosoft. Désolé les gars, mais en VB (et sûrement le reste de .NET) toute assignation se fait par référence, que ce soit objets ou tableaux. ... celà dépend du type définit pour le tableau.
    Donc les pointeurs, ben tu les utilise déjà...
    Mais le plus drôle dans tout çà, c'est que ce n'est pas le cas lors de l'utilisation des méthodes fournies dans le framework... Ca dépends et bien entendu c'est pas marqué dans la documentation (byref ou byval des params, et suivant le code même qui au final peut avoir utilisé l'objet passé par référence ou l'a cloné).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim res(2) As Object
    Dim res2(2) As Object
     
    res = res2
    res(0) = New ListViewItem("un")
    res(1) = New ListViewItem("deux")
    For Each it As ListViewItem In res
    <div style="margin-left:40px">it.Text = "zob"</div>Next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim res(2) As Integer
    Dim res2(2) As Integer
     
    res = res2
    res(0) = 1
    res(1) = 2
    For Each it As Integer In res
    <div style="margin-left:40px"> it = 3</div>Next
    Vous les voyez les deux zob? Tout est par ref dans le 1er code, dans le deuxième... ben le for each il marche pas. Pourquoi? Car un entier est un type de base, pas un objet.

    A ne pas oublier: string est un objet!!!!

    Donc conclusion, recode tout, fait bien gaffe au passage par référence, gave ton code de .clone et .copyTo quand tu dois passer par valeur, et tu ne fera pas comme moi: te planter car trop l'habitude des langages avec passage par valeur par défaut.

    Au passage, ce système est totalement débile (insertion de bugs, etc...)... Mais sûrement mis en place pour la gestion évènementielle.

    Mon problème est l'opposé du tiens: ne pas utiliser de pointeurs!!... ou comment copier une collection dans une autre, ou un objet dans un autre quand celui-ci n'a pas de méthode de clonage...

  13. #13
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Citation Envoyé par nem&sys
    A ne pas oublier: string est un objet!!!!
    tu es bien sure car dans cet exemple, ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Dim MesString(3) As String
     
    		Dim MonString As String
     
    		MesString(0) = "a"
    		MesString(1) = "b"
    		MesString(2) = "c"
    		MesString(3) = "d"
     
    		MonString = ""
     
    		For Each Element As String In MesString
    			If Element = "b" Then
    				MonString = Element
    				Element = "bb"
    			End If	
    		Next Element
     
    		MsgBox (MonString)
    => MonString est different de "bb"
    Et comment fais-tu pour pointer sur un integer ?

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Emcy
    tu es bien sure car dans cet exemple, ça ne marche pas...

    => MonString est different de "bb"
    Et comment fais-tu pour pointer sur un integer ?
    Sur, je suis un gars!..

    Je suis sûr sur le fait qu'une string est un objet: un élément string contient la méthode "clone", qui copie une instance... A quoi elle sert cette méthode?.. Ben on va le voir bientôt...

    Regarde, rajoute 2 lignes dans ton code... et regarde la définition de la méthode ReferenceEquals...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Dim MesString(3) As String
    		
    		Dim MonString As String
    		
    		MesString(0) = "a"
    		MesString(1) = "b"
    		MesString(2) = "c"
    		MesString(3) = "d"
    		
    		MonString = ""
    		
    		For Each Element As String In MesString
    			If Element = "b" Then
    				MonString = Element
                                    [Object].ReferenceEquals(MonString , Element)
    				Element = "bb"
                                    [Object].ReferenceEquals(MonString , Element)
    			End If	
    		Next Element
    		
    		MsgBox (MonString)
    Pour rappel, une string en java, si l'on veut la modifier, ben on la clone en mémoire... Ben là, c'est pareil (Ca sent le pompage)...
    Mmmm alors on va me dire, oui mais c'est pas des objets, donc la méthode réagit comme çà!

    ?[Object].ReferenceEquals(16, 16) -> false
    Où alors la définition de cette méthode est bidon, mais bon... çà serait vraiment pousser le bouchon trop loin Maurice.

    En fait les autres types de bases... sont apparemment aussi des objets... désolé, c'est là mon erreur . Mais les méthodes et accesseurs les font paraitre comme non objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              Dim i, j As Integer
              i = j
              [Object].ReferenceEquals(i, j)
    Dans mon précédent code, j'utilise la propriété ListViewItem.Text... qui est une string... pouquoi çà clone pas et sa passe par référence!!!



    Comme je disais, bienvenue dans la logique Grosoft! C'est donc les accesseurs et méthodes qui font la différence. On peut le récupérer le code source de .NET, histoire de savoir réellement ce qu'il en est?

    Toujours envie de coder avec .NET? Perso, j'ai envie de refaire du c++, je sais que j'ai des variables qui ne sont pas des objets, et ce que font mes objets au moins...
    Si ils pouvaient soit filer le code, soit rester dans la même politique pour tous les objets, soit faire une MSDN expliquant si la méthode calcul entièrement par référence ou non...

    Neo! Abelman! Au secooooouuuuuurs!!!!

  15. #15
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    je ne vois toujours pas comment faire pour que MonString soit egal à "bb"....

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Emcy
    je ne vois toujours pas comment faire pour que MonString soit egal à "bb"....
    Ze méthode de m*rde ultime: ben tu pointe pas, tu copie quand il le faut

    On reviens donc à "je ne peux pas utiliser de pointeur"... c'est pas trop fait pour, .net... choix stratégique Grosoft oblige, comme çà, ben on évite que les développeurs têtes en l'air crachent tout le pc.

    T'a qu'à rajouter dans ta solution un projet c++ où tu crée une méthode de pointage, si tu en a vraiment besoin...

    Sinon, ben voilà comment il faut faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Public Class Mastring
        Public str As String
    End Class
     
    Public Class Form1
     
        Public Sub New()
     
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
     
            ' Add any initialization after the InitializeComponent() call.
     
            Dim MesString(3) As Mastring
     
            Dim MonString As Mastring = New Mastring
     
            Dim cnt As Integer = 0
            MesString(0) = New Mastring
            MesString(1) = New Mastring
            MesString(2) = New Mastring
            MesString(3) = New Mastring
     
            MesString(0).str = "a"
            MesString(1).str = "b"
            MesString(2).str = "c"
            MesString(3).str = "d"
     
            MonString = MesString(1)
     
            For Each Element As Mastring In MesString
                If Element.str = "b" Then
                    Element.str = "bb"
                End If
                cnt += 1
            Next Element
     
            MsgBox(MonString)
     
        End Sub
    End Class
    Aller, petit indice en plus, de pourquoi c'est pas bien les pointeurs sur des strings...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             Dim s1 As String = "ABCDE"
             Dim s2 As String = "ABC" & "DE"
             Dim resultat as boolean = [Object].ReferenceEquals(s1,s2)
    Ohhhh ils ont le même pointeur...



    Le compilateur .NET a ce que l'on appelle une string intern pool. Dès que plusieures string ont la même valeur, alors leurs pointeurs sont modifiés pour ne pointer que sur un seul et même emplacement mémoire... histoire de gagner en place... Pfff ke c'est bidon!

    Et oui, le code managé, c'est un concept... Alors, on veux refaire du unmanaged?

    A mort le .NET managed!!! Ok, avec t'a plus aucun gros crash (...a voir...), mais tu rajoute plein de bugs à côté...

  17. #17
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par Emcy
    je ne vois toujours pas comment faire pour que MonString soit egal à "bb"....
    Le cas du String est un cas particulier en DOTNET. C'est un type référence qui se comporte comme un type valeur lors de l'affectation.

    Malgré le fait qu'il soit de type référence, il est impossible de modifier une string. L'affectation d'une string se fait toujours par la création d'une nouvelle chaine. La comparaison se fait sur une comparaison du contenu des variables.

    Ceci fait qu'il est impossible de 'pointer' directement sur une string (sauf en mode unsafe).

    Pour 'partager' une string, il faut soit l'encasupler dans une classe parente (et manupuler cette classe) soit utiliser un objet StringBuilder.

    Voilà, pas de grand mystère ni manipulation démoniaque de bilou .

  18. #18
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Oh dites donc, j'ai loupé quelque chose la. J'ai pas eu de mail, c'est étrange. Je vais lire ce petit débat avec intéret :-D

  19. #19
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par azerty25
    Oh dites donc, j'ai loupé quelque chose la. J'ai pas eu de mail, c'est étrange. Je vais lire ce petit débat avec intéret :-D
    Je ne pense pas qu'il y ai matière à débat. Le problème c'est que l'ami mem&sys assène des semi-vérités et en tire des conclusions erronées qui peuvent semer le trouble dans l'esprit des gens (et je ne parle pas de l'anti microsoft/dotnet primaire).

    Les strings ont toujours été un casse tête ( ahhh les chaines en C ), et justement le Dotnet apporte plusieurs solutions selon ce que l'on veut faire.

    Pour nous simplifier la vie de tous les jours (affectation, comparaison...) les strings nous apparaissent comme des types valeurs (même si ce n'est pas le cas en interne). Pour les opérations plus complexes l'objet StringBuilder nous permet de manipuler de manière optimisé les chaines.

    Viens ensuite le fameux "pool intern" de string :

    Il s'agit effectivement d'une table qui permet d'éviter qu'il y ai plusieurs copies de la même chaine en mémoire. Mais ce qui faut bien comprendre c'est qu'il s'agit d'une possibilité et non pas de la règle.

    Le "pool intern" est n'est utilisé qu'à la compilation (ce qui est plutot malin), aprés pour les chaines crées lors de l'éxecution c'est le programmeur qui choisi.

    Pour utiliser le 'pool intern', il faut utiliser la methode statique de String : Intern ( String.Intern(MaChaine) ).

    Voici un petit exemple qui permet d'afficher l'adresse mémoire des strings selon différents scénarios :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
            static void Main(string[] args)
            {
                string s1 = "Chaine complète";
                string s2 = "Chaine " + "complète";
                string s3 = "Chaine ";
                string s4 = "complète";
     
                RecupAdresse(s1);
                RecupAdresse(s2);
                RecupAdresse(s3);
                RecupAdresse(s4);
                RecupAdresse(s3 + s4);
                RecupAdresse(String.Intern(s3 + s4));
                Console.ReadKey(); 
            }
     
            public static unsafe void RecupAdresse(string str)
            {
                    fixed (char* pString = str)
                    {
                        int i = (int)pString;
                        Console.WriteLine(str + " : {0}", i);   
                    }
            }
    Si on regarde le résultat :

    Chaine complète : 19406220
    Chaine complète : 19406220
    Chaine : 19406268
    complète : 19406300
    Chaine complète : 19413276
    Chaine complète : 19406220
    On voit que le compilateur à utiliser le pool pour s1 et s2 mais que lors de l'éxecution la chaine s1 + s2 est bien affectée ailleurs sauf lorsque j'utilise String.Intern.

    Bref, tout ça pour dire qu'avant de dire que le FrameWork est buggé il vaut mieux se renseigner un peu .

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    [MODE TROLL VENER ON]

    Sisi, çà vaut un débat sur le "j'te casse en te faisant passer pour un ignorant qui sort des conneries à tout va, et en + .NET et Grosoft sont parfaits"

    Citation Envoyé par Kikos31
    Le problème c'est que l'ami mem&sys assène des semi-vérités et en tire des conclusions erronées qui peuvent semer le trouble dans l'esprit des gens (et je ne parle pas de l'anti microsoft/dotnet primaire).
    Déjà c'est nem&sys, pas mem Ensuite je crois pas qu'on est ami, on a (a mes souvenirs) pas élevé les vaches ensemble... Tes familiarités tu te les garde là où je pense
    Ca c'est fait

    Ensuite, dis LA conclusion pas les conclusions erronées. Et si pour toi c'était la conclusion, c'est alors que tu m'a bien mal compris... la conclusion était: t'a pas à utiliser de pointeurs, c'est pas du tout dans le principe du managed... Voir notamment la dernière phrase sérieuse de mon precedent post:
    Et oui, le code managé, c'est un concept...
    Citation Envoyé par Kikos31
    il vaut mieux se renseigner un peu
    Toi aussi, lit les précédents posts, tu te rendra compte que ton avant dernier message ne fait que répèter ce que j'ai dit lors de mes différents posts... Mais bon, j'assène des milliards de semi-vérités et de conclusion erronées! Et surtout, en donnant 2 solutions, je trouble l'esprit des gens (pas troublés avant, à la vue du nombre de messages qu'il y a eu pour un problème tout de même assez basique).

    C'est vrai, j'aurais du faire comme toi et me renseigner 7 jours durant pour corriger cette erreur de pool (voir dates de tes posts) Désolé si j'ai un taf et que j'ai pas vérifié aussi loin que toi cette info. Je vais donc faire la remarque à la source qui m'a sorti une belle connerie...

    [MODE TROLL VENER OFF]

    Aller, désolé pour l'erreur du string intern pool, et merci de m'avoir corrigé

    Dernière chose mais que t'a presque compris: je suis pas anti-Grosoft, je trouve juste qu'ils ont aucun mérite (l'informatique est ce qu'elle est grâce à eux... heu plutôt grâce à Xerox et Mac, vu qu'ils les ont piraté pour respectivement la souris et l'interface graphique et... puis aussi Dos (me souviens plus du nom du gars), Internet Explorer (Netscape), Java pour .NET! Et j'en passe... ha ben au final tout windows ) et je reste sur ma position que .NET n'est pas une réference en terme de logique structurelle : un simple exemple, les index qui commence à 0 (tableaux) ou 1 (collections), çà c'est de l'homogénéité! Ca amène donc vite fait à insérer des bugs (j'ai pas dit que le framework été buggé, mais qu'il amène à insérer facilement des bugs au moment du codage). Quel intérêt pour du managed d'être aussi immature? (Ca c'est pour l'éventuel débat)

    En tout cas, franchement, avons nous besoin du string pool pour gagner quelques octets à l'heure où on commence à parler du Tera... c'est du grosoft tout craché

    Moi je l'avoue sans hésitation, je suis pas la science infuse (d'où mon appel à l'aide des membres de Developpez.com), alors STP avoue toi aussi que tu a été pas mal agressif tout de même. Le top serait des excuses, mais bon apparemment t'es trop bourrin. T'es là pour casser ou aider? Tu viens de faire les 2 en même temps, mais seulement car tu a corrigé mon erreur!

    N'oublie pas, on est pas là pour ce casser mais apporter des solutions, alors au lieu de répéter ou casser, vu que tu sait si bien faire du unmanaged (ton exemple t'aurais pu le faire avec ReferenceEquals...), tu nous la sors la solution de pointage ouais

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo