Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB.NET] Puntatori e strutture dati

    Premetto che la mia attività in ambito informatico ha riguardato principalmente la programmazione in c/c++ per l'implementazione di algoritmi numerici (matematica/ingegneria). Avendo la necessità di creare un interfaccia grafica attorno alle formule usate, ho deciso di scrivere il codice numerico in c/c++ e collegarlo con una dll in ambiente vb.net, molto comodo per creare pulsanti, bottoni, finestre, etc... la cosa sembra funzionare abbastanza bene.

    Avrei però il seguente problema, derivante probabilmente dal fatto che ragiono ancora in linguaggio c, in cui il concetto di puntatore è fondamentale, mentre in vb.net mi sono reso conto che un puntatore è qualcosa dalla definizione sfuggevole (l'unico puntatore vero è il tipo intptr, che però non è associato ad un tipo).

    Dovrei definire una classe i cui membri sono dei puntatori ad altre classi.

    Per chiarire meglio la cosa, faccio l'esempio di come rappresentare un grafo. Un grafo è un insieme di nodi (collocati ad esempio in un piano) e di linee che collegano due nodi. Ovviamente non è detto che due nodi siano collegati da una linea.

    Ecco come avrei risolto la cosa in c++

    codice:
    class nodo
    {
    double x //coordinata x
    double y //coordinata y
    
    ... //funzioni e altri membri per lavorare con il nodo
    }
    
    class linea
    {
    nodo* nodo1
    nodo* nodo2
    
    ... //funzioni e altri membri per lavorare con la linea
    }
    I nodi all'interno della linea sono dei puntatori in quanto quei nodi possono appartenere anche ad altre linee. Inoltre in c++ tramite l'operatore -> posso accedere facilmente ai dati appartenenti ai nodi della linea.

    Si può rappresentare un grafo in vb.net in maniera simile al modo che ho proposto in c++?

  2. #2
    VB.NET non supporta i puntatori, che sappia io intptr viene usato solo quando bisogna interfacciarsi con alcune API del sistema. Non si tratta di una lacuna, l'obiettivo dei progettisti di VB.NET era proprio quello di mettere a disposizione degli strumenti alternativi per fare le stesse cose.

    Il seguente codice dovrebbe spiegarti il tuo dubbio:
    codice:
    Public Class Nodo
        Public Property X As Double
        Public Property Y As Double
    
        Public Overrides Function ToString() As String
            Return "{" & X.ToString & ":" & Y.ToString & "}"
        End Function
    End Class
    
    Public Class Linea
        Public Property Nodo1 As Nodo
        Public Property Nodo2 As Nodo
    
        Public Overrides Function ToString() As String
            Return Nodo1.ToString & "-" & Nodo2.ToString
        End Function
    End Class
    
    Public Sub Test()
            Dim n1, n2, n3 As New Nodo
            Dim l1, l2 As New Linea
    
            n1.X = 5 : n1.Y = 5
            n2.X = 10 : n2.Y = 15
            n3.X = 20 : n3.Y = 30
    
            l1.Nodo1 = n1
            l1.Nodo2 = n2
            l2.Nodo1 = n2
            l2.Nodo2 = n3
    
            Console.WriteLine("l1 = " & l1.ToString)
            Console.WriteLine("l2 = " & l2.ToString)
    
            l1.Nodo2.X = 150
    
            Console.WriteLine("l1 = " & l1.ToString)
            Console.WriteLine("l2 = " & l2.ToString)
    End Sub
    Richiamando Test(), il risultato in console sarà:
    codice:
    l1 = {5:5}-{10:15}
    l2 = {10:15}-{20:30}
    l1 = {5:5}-{150:15}
    l2 = {150:15}-{20:30}
    Come vedi la modifica di una proprietà di un oggetto si riflette su tutti gli altri oggetti che ne fanno riferimento.
    Chi non cerca trova.

  3. #3
    In altre parole: in VB.NET tutti i tipi (tranne i tipi primitivi e le Struct) vengono sempre gestiti tramite riferimenti, per cui tu stai sempre implicitamente usando dei puntatori.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Prima di tutto grazie per le risposte!

    Penso di aver capito..... Quindi in pratica le sottoclassi vengono memorizzate come puntatori, non come dati veri e propri. Ad esempio se voglio copiare un oggetto devo scrivere manualmente il codice di copia, altrimenti mi copia solo un riferimento.

    La distruzione degli oggetti dovrebbe essere gestita automaticamente dal framework. Avendo necessità di gestrie, all'interno di queste classi, dei puntatori ad aree di memoria 'esterne' al framework .NET tramite la dll in c++, volevo segnalare questo articolo che permette di fare un 'delete' di queste aree di memoria:

    http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.