C# for Rhino

… da un’occhiata al numero di pagine … :wink:

E questo tratta il C++11, dopo di che ci sono stati ancora C++14, C++17 e C++20,
per cui in quel libro mancano delle cose …

:wink: :grinning_face_with_smiling_eyes:

:+1:

mmmh per il C++ fanno uscite triennali a come vedo. . .
oltre 1.300 pagine di sicuro sono un bel po di pagine
io intendevo più una comparazione tra i due linguaggi
a livello di difficoltà forse bisogna essere più tecnici. . .

Direi che ci sono parecchie somiglianze, almeno a livello base.
In fondo sono tutti e due ‘C-qualcosa’ … :wink:

Il C++ e’ piu’ versatile, si puo’ utilizzare anche in modo ‘tradizionale’ e non solo ‘ad oggetti’, come il C#.
In teoria e’ un linguaggio a livello ‘piu’ basso’: puoi usare direttamente puntatori, allocazione di memoria, bit fields e unions.
Credo che pero’ abbia delle librarie che praticamente lo ‘trasformano’, volendo, in qualcosa di molto simile al C#.

Forse sarebbe meglio chiedere a Sergio … :slight_smile:

1 Mi Piace

infatti ho iniziato a vedere esempi su quest’argomento
ma se ho capito bene comunque in C# viene fatto in automatico
mentre col C++ sia possibile decidere in che modo deve venire allocata la memoria?

cosa intendi per modo tradizionale?

Senza usare classi.

1 Mi Piace

Se non erro la differenza principale e’ che col C++ sei tu a dover rilasciare la memoria allocata quando non serve piu’.
Mentre col C# tu ti limiti ad allocarla, usando l’operatore new (tra l’altro, lo stesso che usa anche il C++), mentre a rilasciarla al momento opportuno ci pensa il Garbage Collector, tu non te ne curi piu’.

Sotto questo punto di vista, il C# si comporta in modo analogo a Python, che tra l’altro fa anche a meno dell’operatore new e usa semplicemente il nome della classe per allocare un nuovo oggetto.

1 Mi Piace

ok grazie per la spiegazione :+1:

1 Mi Piace

Anche in C# si può fare programmazione procedurale e anche a più basso livello coi puntatori:

2 Mi Piace

Come ha spiegato Emilio in c# la memoria viene gestita in
automatico. In C++ hanno introdotto gli smart pointer che dealloccano
in automatico la memoria. L’allocazione della memoria è un’operazione
esclusiva dell’os che può incidere nelle prestazioni specie se si chiamano
in modo intensivo metodi new / delete. Per questo si usano i pool memory
che alloccano preventivamente un tot di memoria riducendo le chiamate
all’os… Anche il garbage di c# esegue operazioni analoghe nel liberare la
memoria. Ma qui stiamo parlando di un livello di programmazione pro che
esula dalle mie conoscenze e capacità.

3 Mi Piace

Interessante ! Grazie per l’info. :slight_smile:

1 Mi Piace

ovviamente non posso contribuire personalmente alla spiegazioni su questi argomenti
però essendo che quello che mi piace di questo tutorial che sto seguendo
è proprio il fatto che vengono aperte parentesi con questi argomenti:

primi 4 minuti

dal secondo minuto in poi

ps in quest’ultimo video vengono trattati Value/Reference di cui accennaste tempo fa. . .
e al min 9.00 una piccola introduzione anche al Garbage :+1:

1 Mi Piace

Quindi?

Giusto.
Secondo me e’ importante sapere queste cose.
Ti consente di comprendere meglio cosa stai scrivendo. :slight_smile:

1 Mi Piace

esatto proprio quello che volevo sottintendere :+1:

:exploding_head: :exploding_head: :exploding_head:

intervallo tra i min 6 e 8 mi hanno fatto ricordare questa discussione:

Si’, e’ una questione che puo’ confondere.
In Python e’ lo stesso, solo che mancano le struct.

Comunque per le geometrie di Rhino non bisogna preoccuparsi.
Ogni volta che inserisci una geometria del database di Rhino e ogni volta che ne estrai una, RhinoCommon fa una copia di sua iniziativa, quindi uno script non puo’ avere accesso diretto alle geometrie degli oggetti che vedi sullo schermo. :grinning:

1 Mi Piace

Ciao Emilio!

Concedere ad uno script o ad un plugin di sguazzare all’interno del database di rhino sarebbe
un suicidio. Sia per gli script quanto per i plugin, gli elementi geometrici vengono esposti in sola
lettura. Per modificare un oggetto esistente si esegue una copia e al termine si “registra” nel
database di rhino il nuovo/i oggetto/i oppure l’oggetto modificato. Questo meccanismo non viene
percepito nello script in quanto gestito dai metodi esposti.
Questo metodo apparentemente contorto è alla base di ogni software che gestisce istruzioni
Undo / Redo, le relazioni tra oggetti (Storia) o la programmazione degli eventi.

https://developer.rhino3d.com/api/RhinoCommon/html/Events_T_Rhino_RhinoDoc.htm

Di seguito il link ad un esempio in github che dimostra come interagire con rhino in runtime
ovvero durante il normale utilizzo di rhino monitorando la quasi totalità delle azioni.

Questo consente ad una applicazione (non più script!) di monitorare in trasparenza le operazioni
eseguite dall’utente eseguendo le opportune azioni (anche annullandole!).

2 Mi Piace

Ciao Sergio !

Molto interessante, grazie per il link. :slight_smile:

infatti avevo ripescato il video in questione proprio perché mi serviva approfondire l’argomento

a = [1,2,3]
b = a[:]
b[1] = 10
print a
[1, 2, 3]
print b
[1, 10, 3]

in Py invece per copiare i valori bisogna usare la sintassi b=a[:] essendo che con b=a copia il riferimento

    class Program
    {
        static void Main(string[] args)
        {
            Persona persona1 = new Persona();
            persona1.cognome = "Rossi";
            persona1.nome = "Marco";
            persona1.eta = 25;
        }
    }

    class Persona
    {
        public string cognome;
        public string nome;
        public int eta;
    }

una delle mie domande “strane”:
ma le 3 righe nella classe Persona, sono obbligato ad inserirle per forza in quella “classe”?
non c’é modo di inserirle nella classe Program oppure direttamente nel void?