PDA

View Full Version : Il topic della frustrazione


fek
25-04-2006, 12:51
virtual bool IsCloth() const { return false; }


Se vi vedo mai scrivere una cosa di questo tipo in Diamonds, cancello il repository :|

Dovrebbero istituire la patente per il programmatore e non darla a tutti soprattutto nella game industry... :muro:

Ufo13
25-04-2006, 12:53
:D

cover
25-04-2006, 12:54
chi è il pazzo che l'ha scritto ? :|

fek
25-04-2006, 12:59
:rolleyes:

cdimauro
26-04-2006, 08:15
virtual bool IsCloth() const { return false; }


Se vi vedo mai scrivere una cosa di questo tipo in Diamonds, cancello il repository :|

Dovrebbero istituire la patente per il programmatore e non darla a tutti soprattutto nella game industry... :muro:
Adesso però dicci dove hai visto quest'abominio. :D

fek
26-04-2006, 12:02
E la frustrazione continua:


virtual void SetScene(CScene *scene) {m_Scene = scene;}


E' C++ :muro:

fek
26-04-2006, 17:10
Ma allora non era una svista, e' proprio recidivo:


virtual EMaterialType GetType() const { return MATERIAL_TYPE_DEFAULT_MATERIAL; }


:muro:

fek
26-04-2006, 17:42
Prima della cura:


Material* p_material = NULL;
if (src_material.GetType()==A_MATERIAL_TYPE)
{
const MyMaterial& my_material = (MyMaterial*) (src_material);
p_material = new MyMaterial(my_material);
}
else
{
// error
}

material_array[c_mat] = p_material;


Dopo la cura:


material_array[c_mat] = src_material.Clone();


Clone polimorfico. GetType() non serve, ecco perche' ve li faccio levare sempre :)

cdimauro
26-04-2006, 17:49
Usare un metodo GetType con la programmazione a oggetti è una vera e propria bestemmia: tanto vale rimanere alla programmazione strutturata e alle catene di switch/case. :asd:

Bonfo
27-04-2006, 01:35
Usare un metodo GetType con la programmazione a oggetti è una vera e propria bestemmia: tanto vale rimanere alla programmazione strutturata e alle catene di switch/case. :asd:


Non sono d'accordo...dipende da cosa si vuole fare.
Se si vuole andare ad introdurre un isistema a PLUG-IN addirittura hot-deployable....bhè, senza Refelction e GetType nn si fa molto ;)

cdimauro
27-04-2006, 08:37
Non mi sono occupato come si deve delle problematiche alla creazione e all'uso di applicazioni che usano plug-in (da diversi anni ho in mente un progetto, ma non ho mai avuto il tempo per realizzarlo. :p): perché sarebbe necessario un metodo GetType secondo te?

fek
27-04-2006, 10:20
Non sono d'accordo...dipende da cosa si vuole fare.
Se si vuole andare ad introdurre un isistema a PLUG-IN addirittura hot-deployable....bhè, senza Refelction e GetType nn si fa molto ;)

Usare GetType e' una vera bestemmia :D

Anche in caso di necessita' di persistenza degli oggetti, ci sono validissime alternative, quali creare delle metaclassi che contengono le informazioni, e magari i factory method per la creazione e clonazione degli oggetti.

Ma un GetType cosi' per selezionare il comportamento in base al tipo dell'oggetto e messo pure virtuale non ha alcun senso logico: il polimorfismo nasce proprio per non aver bisogno di quel metodo.

^TiGeRShArK^
27-04-2006, 12:22
chi mi ricorda a che servono i metodi virtuali???:fagiano:

cdimauro
27-04-2006, 12:31
class animale

virtual verso()

movimento()
print 'movimento base!'

class gatto(animale)

virtual verso()
print 'miao!'

movimento()
print 'movimento felino!'


class cane(animale)

virtual verso()
print 'bau!'

class pitbull(cane)

virtual verso()
print 'MEGA BAU!!!'


var
a: animale
b: gatto

a = new gatto()
a.verso() # -> 'miao!'
a.movimento() # -> 'movimento base!'
b = gatto(a)
b.movimento() # -> 'movimento felino!'

a = new cane()
a.verso() # -> 'bau!'
a.movimento() # -> 'movimento base!'

a = new pitbull(cane)
a.verso() # -> 'MEGA BAU!!!'
a.movimento() # -> 'movimento base!'

^TiGeRShArK^
27-04-2006, 12:38
ok... ricordavo che c'entravano con le classi astratte....
ma in java ci sono pure?
non me li ricordo proprio....:fagiano:

fek
27-04-2006, 12:41
ok... ricordavo che c'entravano con le classi astratte....
ma in java ci sono pure?
non me li ricordo proprio....:fagiano:

In Java tutti i metodi sono virtuali se non dichiarati final (o la classe e' dichiarata final se ricordo bene).

^TiGeRShArK^
27-04-2006, 12:46
In Java tutti i metodi sono virtuali se non dichiarati final (o la classe e' dichiarata final se ricordo bene).
quindi la parola chiave virtual non c'è...
xkè non me la ricordo proprio in java :D

Bonfo
27-04-2006, 13:32
Usare GetType e' una vera bestemmia :D

Anche in caso di necessita' di persistenza degli oggetti, ci sono validissime alternative, quali creare delle metaclassi che contengono le informazioni, e magari i factory method per la creazione e clonazione degli oggetti.

Ma un GetType cosi' per selezionare il comportamento in base al tipo dell'oggetto e messo pure virtuale non ha alcun senso logico: il polimorfismo nasce proprio per non aver bisogno di quel metodo.

Ecco quando io userei GetType().
Io ho una applicazione che utilizza degli oggetti. L'utente li vede divsi per categoria.

Ora supponiamo che io voglio fare in modo che sia possibile aggiungere nuove categorie o nuovi tipi di oggetti senza dover ricompilare l'applicazione o dovendo modificare delle libreire e addirittura senza toccaremanco un file di configurazione.

Io faccio i nuovi oggetti rispettando le interfaccie dovute o estendendo una classe base. A quelpunto rilascio una DLL o un JAR.
L'applicazione può leggerseli all'avvio, o addirittura mentre è già in esecuzione e dandare a cercare le calsssi che implementino quell'interfaccia o che estendano la calsse base (Uso di getType() ), istanzio se c'è nè bisogno, lo casto senza problemi avendo controllato il tipo e poi lo uso.

BAZZA :D :D Così si che si estende unì'applicazione conm Plug-In in modo facile e snello :D :D

Addirittura se non tutti gli oggetti hanno il metodo pincopallo che serve solo se l'oggetto vuole fare certe cose, io senza sapere nulla posso attraverso la Refelction capire se ha quel metodo e invocarlo. ;)

In realtà io vedo in GetType un'arma a doppio taglio....se non si usano correttamente i paradigmi dell'OO come polimorfismo ma si caratterizano i comportamenti con getType() si è dei pazzi. Ma se invece si usa per andare a lavorare OO addirittura su oggetti che non si conoscono...bhè...direi che è una ottima estensione dell'OO



Scusate se sono stato lungo ;)

fek
27-04-2006, 13:47
Stai parlando dei pattern Composite Interfaces e Plugin e del concetto di GUID che e' profondamente diverso dal GetType() :)

In pratica stai parlando di COM. E sai che cosa hanno fatto per risolvere i suoi (enormi) problemi? Hanno tolto le GUID ed hanno scritto una macchina virtuale, il CLR, ed hanno creato .NET pur di togliere quella cosa che e' tanto simile al GetType().

Bonfo
27-04-2006, 14:08
Stai parlando dei pattern Composite Interfaces e Plugin e del concetto di GUID che e' profondamente diverso dal GetType() :)

In pratica stai parlando di COM. E sai che cosa hanno fatto per risolvere i suoi (enormi) problemi? Hanno tolto le GUID ed hanno scritto una macchina virtuale, il CLR, ed hanno creato .NET pur di togliere quella cosa che e' tanto simile al GetType().

WAKKA...tutte queste robe ho tirato fuori :eek: :p

In ogni caso mi chiedo allora a cosa serva veramente la refelction e il metodo GetType() ??
Per chè lo hanno inventato e realizzato se in realtà non serve a nulla??
In .NET c'è il getType() e fa fare tante belle cosine...come ad esempio ho utilizzato la Refelction, anche per esercitazione, per creare da un file XML una fnestra e i suoi control. Insomma un XAML formato embrione...

In ogni caso ....insisti Fek...fammi capire che sono una testa dura :muro: :muro:

Imparo Imapro Imparo :sbav:

^TiGeRShArK^
27-04-2006, 14:27
WAKKA...tutte queste robe ho tirato fuori :eek: :p

In ogni caso mi chiedo allora a cosa serva veramente la refelction e il metodo GetType() ??
Per chè lo hanno inventato e realizzato se in realtà non serve a nulla??
In .NET c'è il getType() e fa fare tante belle cosine...come ad esempio ho utilizzato la Refelction, anche per esercitazione, per creare da un file XML una fnestra e i suoi control. Insomma un XAML formato embrione...

In ogni caso ....insisti Fek...fammi capire che sono una testa dura :muro: :muro:

Imparo Imapro Imparo :sbav:
se non sbaglio la reflection è usata molto nei parser....

thebol
27-04-2006, 14:35
WAKKA...tutte queste robe ho tirato fuori :eek: :p

In ogni caso mi chiedo allora a cosa serva veramente la refelction e il metodo GetType() ??
Per chè lo hanno inventato e realizzato se in realtà non serve a nulla??
In .NET c'è il getType() e fa fare tante belle cosine...come ad esempio ho utilizzato la Refelction, anche per esercitazione, per creare da un file XML una fnestra e i suoi control. Insomma un XAML formato embrione...

In ogni caso ....insisti Fek...fammi capire che sono una testa dura :muro: :muro:

Imparo Imapro Imparo :sbav:

La reflection serve per esempio a usare oggetti descritti da file xml o afini(lo sentita paragonare alla tipizzazione dinamica di smalltalk).

fek
27-04-2006, 15:23
WAKKA...tutte queste robe ho tirato fuori :eek: :p

In ogni caso mi chiedo allora a cosa serva veramente la refelction e il metodo GetType() ??
Per chè lo hanno inventato e realizzato se in realtà non serve a nulla??
In .NET c'è il getType() e fa fare tante belle cosine...come ad esempio ho utilizzato la Refelction, anche per esercitazione, per creare da un file XML una fnestra e i suoi control. Insomma un XAML formato embrione...

In ogni caso ....insisti Fek...fammi capire che sono una testa dura :muro: :muro:

Imparo Imapro Imparo :sbav:


Aspetta, in molti casi la reflection e' utilissima e ti permette di risparmiare molto codice, in quanto una classe puo' fare una query sulla sua struttura a runtime. Il GetType() di .NET restituisce una metaclasse, per molti versi simile a SmallTalk. Se guardi JUnit, usa la reflection per scoprire quali metodi devono essere lanciati nel test case.

L'errore non e' nel GetType() in se', l'errore e' nell'uso che ne fai: se usi GetType per selezionare un comportamento dall'esterno facendo un test sul tipo di un oggetto polimorfico, allora ti stai dimenticando che il polimorfismo esiste proprio per darti un'opzione MOLTO migliore per risolvere questo problema.

Bonfo
27-04-2006, 15:44
Aspetta, in molti casi la reflection e' utilissima e ti permette di risparmiare molto codice, in quanto una classe puo' fare una query sulla sua struttura a runtime. Il GetType() di .NET restituisce una metaclasse, per molti versi simile a SmallTalk. Se guardi JUnit, usa la reflection per scoprire quali metodi devono essere lanciati nel test case.

L'errore non e' nel GetType() in se', l'errore e' nell'uso che ne fai: se usi GetType per selezionare un comportamento dall'esterno facendo un test sul tipo di un oggetto polimorfico, allora ti stai dimenticando che il polimorfismo esiste proprio per darti un'opzione MOLTO migliore per risolvere questo problema.


Perfetto...allora la pensiamo uguale.
La REfelction va usata non per differenziare il comportamento degli oggetti in base al tipo...per quello c'è il polimorfismo ;)

jappilas
27-04-2006, 19:53
virtual bool IsCloth() const { return false; }


Se vi vedo mai scrivere una cosa di questo tipo in Diamonds, cancello il repository :|

Dovrebbero istituire la patente per il programmatore e non darla a tutti soprattutto nella game industry... :muro:
questa viene da del codice da documentare, scritto da un altro che si e' dileguato... direi che si contendono alla pari la palma della LoC più perplimente:
unsigned int CImageBuffer::GetFrameNumber() {
return 0 ;
}

:mbe:

cover
27-04-2006, 20:09
Ma esistono davvero elementi simili....che lavorano e non sono ancora stati licenziati ? :|

thebol
27-04-2006, 21:49
Ma esistono davvero elementi simili....che lavorano e non sono ancora stati licenziati ? :|

dai siamo stati tutti n00b

a lavoro ho guardato del codice che avevo fatto appena arrivato e sono inorridito :asd:

cover
27-04-2006, 22:25
dai siamo stati tutti n00b


Io lo sono ancora... :( :cry: :doh: :nono: :sob:

Però penso che fek ha visto quel codice a lavoro (*CENSORED*, quindi), e vedere programmatori a quel livello che scrivono così... :mbe:
Mi riferisco in particolare al primo esempio di fek e quello di jappilas, non l'avrei fatto nemmeno io.... :D
Per il GetType...non sapevo nemmeno che esistesse :stordita: :Prrr:

jappilas
27-04-2006, 23:13
dai siamo stati tutti n00b
a lavoro ho guardato del codice che avevo fatto appena arrivato e sono inorridito :asd:
va bene, io stesso ammetto che non so programmare (parecchie sfumature e tecniche avanzate del c++ non le padroneggio, per cui per ora mi limito allo stretto indispensabile che mi permette di implementare un determinato algoritmo) ma qui è più questione di disattenzione o svista o qualche estemporaneo processo mentale che secondo me non è univocamente frutto dell' - o correlato con l' - inesperienza

cover
28-04-2006, 00:26
Mai programmare con gli effetti di droghe pesanti... :asd:

fek
28-04-2006, 10:05
Ragazzi, per favore cancellate il nome del gioco. Grazie :)

Gammaglobulino
28-04-2006, 10:18
Fran ti piace questa? a me sembra perfettamente leggibile :D


cli::array<Byte> ^ EncDecMsg::Encrypt(cli::array<Byte> ^clearData, cli::array<Byte> ^Key, cli::array<Byte> ^IV){

System::IO::MemoryStream ^ms = gcnew MemoryStream();
Rijndael ^alg = Rijndael::Create();
alg->Key = Key;
alg->IV = IV;
CryptoStream ^cs = gcnew CryptoStream(ms,alg->CreateEncryptor(), CryptoStreamMode::Write);
cs->Write(clearData, 0, clearData->Length);
cs->Close();
cli::array<Byte> ^encryptedData = ms->ToArray();
return encryptedData;
}

Ciao :)

thebol
28-04-2006, 10:27
va bene, io stesso ammetto che non so programmare (parecchie sfumature e tecniche avanzate del c++ non le padroneggio, per cui per ora mi limito allo stretto indispensabile che mi permette di implementare un determinato algoritmo) ma qui è più questione di disattenzione o svista o qualche estemporaneo processo mentale che secondo me non è univocamente frutto dell' - o correlato con l' - inesperienza

il brutto e che spesso si arriva dallo spaghetti code...
se si è fortunati all'università si riesce a imparare a programmare con stile, ma dipende con chi si lavora e come si è seguiti(io ad esempio snobbai abbastanza il corso di paradigmi che fra le varie cose era incentrato sui pattern. Il problema e che venivano presentati senza un perchè di fondo e allora la programmazione a oggetti mi sembrava un appendice della programmazione procedurale).

io devo ammettere che ho imparato moltissimo da questo progetto, ora anche senza usare per forza il tdd, organizzo il mio codice in maniera nettamente migliore a prima..

thebol
28-04-2006, 10:29
Fran ti piace questa? a me sembra perfettamente leggibile :D

[CUT]

Ciao :)

secoli fa lessi dell'obfusated C su un numero di computer programming...

c'era il classico prog hello word, scritto in una maniera assurda...

Gammaglobulino
28-04-2006, 10:44
secoli fa lessi dell'obfusated C su un numero di computer programming...

c'era il classico prog hello word, scritto in una maniera assurda...

:D :D
Quel frammento di codice è veramente estratto da un servizio che ho scritto per mandare messaggi SOAP criptati verso Windows Live Mail service ed è scritto nella nuova sintassi C++ per il Common Language Runtime (Lippman-Sutter).
cli::array<Byte> ^ : nuovo puntatore ad oggetto "managed" si chiama handle
gcnew() : istanzia oggetti nell' heap managed

Rijndael ^alg = Rijndael::Create(); : è uno degli algoritmi di cripting che trovate nella classe crypt del framework...:)

Vabbè scusate :)

thebol
28-04-2006, 11:01
:D :D
Quel frammento di codice è veramente estratto da un servizio che ho scritto per mandare messaggi SOAP criptati verso Windows Live Mail service ed è scritto nella nuova sintassi C++ per il Common Language Runtime (Lippman-Sutter).
cli::array<Byte> ^ : nuovo puntatore ad oggetto "managed" si chiama handle
gcnew() : istanzia oggetti nell' heap managed

Rijndael ^alg = Rijndael::Create(); : è uno degli algoritmi di cripting che trovate nella classe crypt del framework...:)

Vabbè scusate :)

il mio problema e che sono a digiuno col c++ e appena vedo troppi :: in fila mi sembra offuscated :asd:

fek
28-04-2006, 11:03
Fran ti piace questa? a me sembra perfettamente leggibile :D


cli::array<Byte> ^ EncDecMsg::Encrypt(cli::array<Byte> ^clearData, cli::array<Byte> ^Key, cli::array<Byte> ^IV){

System::IO::MemoryStream ^ms = gcnew MemoryStream();
Rijndael ^alg = Rijndael::Create();
alg->Key = Key;
alg->IV = IV;
CryptoStream ^cs = gcnew CryptoStream(ms,alg->CreateEncryptor(), CryptoStreamMode::Write);
cs->Write(clearData, 0, clearData->Length);
cs->Close();
cli::array<Byte> ^encryptedData = ms->ToArray();
return encryptedData;
}

Ciao :)

Infatti e' leggibile a parte differenze di indentazione che dipendono dai gusti personali :D

Il problema e' quando scrivi qualcosa, che puo' essere anche leggibilissimo, ma e' un design totalmente errato.

VICIUS
28-04-2006, 12:39
:D :D
Quel frammento di codice è veramente estratto da un servizio che ho scritto per mandare messaggi SOAP criptati verso Windows Live Mail service ed è scritto nella nuova sintassi C++ per il Common Language Runtime (Lippman-Sutter).
cli::array<Byte> ^ : nuovo puntatore ad oggetto "managed" si chiama handle
gcnew() : istanzia oggetti nell' heap managed

Rijndael ^alg = Rijndael::Create(); : è uno degli algoritmi di cripting che trovate nella classe crypt del framework...:)

Vabbè scusate :)
Ahhh cosi usate AES per le mail di Live.... Ottimo un'informazione in più per crackare i server e sconfiggere la MS :asd:

ciao ;)

Gammaglobulino
28-04-2006, 16:34
Ahhh cosi usate AES per le mail di Live.... Ottimo un'informazione in più per crackare i server e sconfiggere la MS :asd:

ciao ;)

Tutto dentro corpnet ;)

cdimauro
02-05-2006, 10:18
Infatti e' leggibile a parte differenze di indentazione che dipendono dai gusti personali :D
:eek: :eek: :eek:

VICIUS
02-05-2006, 12:58
:eek: :eek: :eek:
Infatti. Quella roba NON è leggibile. :D

ciao ;)

thebol
28-06-2006, 09:07
riuppo un attimo...
ieri ho trovato questo..

(new Integer(1)).intValue();

non gli saranno piaciuti i tipi primitivi :asd:

^TiGeRShArK^
28-06-2006, 13:42
riuppo un attimo...
ieri ho trovato questo..

(new Integer(1)).intValue();

non gli saranno piaciuti i tipi primitivi :asd:
:confused:
:mbe:

thebol
28-06-2006, 14:12
:confused:
:mbe:


aveva fatto una serie di
(new Integer(temp)).intValue();

dove temp era una stringa(arrivava dalla http request), e non ha voluto variare :asd:

71104
28-06-2006, 20:23
e scusa, se temp era una stringa come avrebbe dovuto fare a convertirla in un intero...? :mbe:

^TiGeRShArK^
28-06-2006, 21:49
io ho capito che avea tante stringhe temp convertite in quel modo e per mantenere la tradizione anzikè scrivere direttamente 1 ha mantenuto quella sintassi...:fagiano:
o non ho capito una mazza? :mbe:

cmq il concorso l'ho finito....
il tempo di andare a vedere i risultati domani e di spiegare ad una mia amica la paginazione e dovrei essere nuovamente tra voi :D

71104
29-06-2006, 00:35
mi raccomando, evita i soliti luoghi comuni, tipo che la tabella delle pagine viene riempita dall'inizio alla fine, cioè dalla prima locazione all'ultima... :rolleyes:

un buon test per vedere se una persona ha veramente capito la paginazione è chiederle come mai l'indirizzo NULL non è valido :D

Bonfo
29-06-2006, 01:12
mi raccomando, evita i soliti luoghi comuni, tipo che la tabella delle pagine viene riempita dall'inizio alla fine, cioè dalla prima locazione all'ultima... :rolleyes:

un buon test per vedere se una persona ha veramente capito la paginazione è chiederle come mai l'indirizzo NULL non è valido :D

:wtf: ... forse perchè NULL non si può tradurre in un indirizzo fisico??
Sai, fra 3 settimane devo dare calcolatori elettronici... :cry:

71104
29-06-2006, 01:29
:wtf: ... forse perchè NULL non si può tradurre in un indirizzo fisico?? e perché? :rolleyes:

Sai, fra 3 settimane devo dare calcolatori elettronici... :cry: tranquillo, sta cosa i prof non la sanno :asd:
un professore che sappia come mai l'indirizzo NULL non è valido è un pezzo raro :sisi:

thebol
29-06-2006, 08:02
e scusa, se temp era una stringa come avrebbe dovuto fare a convertirla in un intero...? :mbe:
1 non è una stringa :asd:



(new Integer(1)).intValue();

cdimauro
29-06-2006, 09:13
:wtf: ... forse perchè NULL non si può tradurre in un indirizzo fisico??
Esattamente. NULL è un simbolo, non è un valore consentito per indicare un indirizzo vero e proprio.

Usare NULL come indirizzo può portare a problemi di compatibilità / portabilità, perché il comportamento dell'applicazione dipende dall'architettura su cui sta girando.

Stiamo parlando più genericamente di indirizzi, comunque: non esattamente di paginazione. ;)

71104
29-06-2006, 12:43
si ma più precisamente se io dereferenzio un puntatore NULL cosa accade? come fa l'architettura ad accorgersi che deve lanciare eccezione mandando così in crash il programma il più delle volte? qualcosa mi dice che non lo sai nemmeno tu... :Prrr:
la risposta è semplice cmq, è la stessa che dovreste dare se vi fosse richiesto come mai non è valido l'indirizzo 0x00000001 o 0x00000002...

cdimauro
29-06-2006, 13:42
Io lo so cosa succede: dipende dalla CPU e dal s.o. che fanno girare l'applicazione.

Prova a dereferenziare un puntatore NULL in un'applicazione che gira:
- su DOS, in real mode (8086);
- su DOS, in protected mode 286 (con DOS extender o applicazione custom che gestisce il sistema);
- su DOS, in protected mode 386 usando soltanto la segmentazione (con DOS extender o applicazione custom che gestisce il sistema);
- su DOS, in protected mode 386 usando soltanto la paginazione (con applicazione custom che gestisce il sistema; la segmentazione non può essere eliminata, ma si fa uso soltanto della paginazione);
- su DOS, in protected mode 386 usando la segmentazione e la paginazione (con applicazione custom che gestisce il sistema);
- su Windows dal 95 in sù (inclusa la famiglia NT), in protected mode 386.
- su Windows XP x64, in long mode (x86-64).

Il comportamento della CPU e del s.o. è diverso, a seconda dei casi. ;)

L'errore che commetti è quello di associare un valore numerico a un puntatore NULL: è una cosa che dipende dal compilatore per quella particolare architettura e quel particolare s.o. su cui girerà l'applicazione.

The3DProgrammer
29-06-2006, 15:25
si ma più precisamente se io dereferenzio un puntatore NULL cosa accade? come fa l'architettura ad accorgersi che deve lanciare eccezione mandando così in crash il programma il più delle volte? qualcosa mi dice che non lo sai nemmeno tu... :Prrr:
la risposta è semplice cmq, è la stessa che dovreste dare se vi fosse richiesto come mai non è valido l'indirizzo 0x00000001 o 0x00000002...



Mi viene da pensare che, visto che le pagine sono organizzate in modo gerarchico (e un indirizzo lineare identifica, nei suoi bit + significativi, le entries della page directory e della page table che portano alla pagina richiesta) gli indirizzi nella forma che tu hai scritto nn contengono le info necessarie per individuare una pagina nella gerarchia. Questo xò supponendo che gli indici delle directory e della page table nn partano da 0, cosa che onestamente nn so (e che, ancora + onestamente, nn sono nemmeno riuscito a trovare sul web :ciapet: )

ciau

cdimauro
29-06-2006, 15:39
Possono partire da qualunque posizione: dipende tutto da come si imposta l'albero delle pagine.

Il punto, però, qui è un altro: NULL è soltanto un simbolo per indicare un indirizzo non valido e null'altro. Non è un valore numerico né indica una particolare pagina: queste sono informazioni che dipendono esclusivamente dalla tripletta compilatore/architettura/s.o..

The3DProgrammer
29-06-2006, 15:51
Il punto, però, qui è un altro: NULL è soltanto un simbolo per indicare un indirizzo non valido e null'altro. Non è un valore numerico né indica una particolare pagina: queste sono informazioni che dipendono esclusivamente dalla tripletta compilatore/architettura/s.o..

Questo è fuor di dubbio. Infatti la mia reply non era diretta alla tua (corretta) spiegazione, ma alla domanda di 71104, che credo si sia espresso male nella prima domanda. Penso che 71104 intendesse dire "perchè gli indirizzi 00000000h, 00000001h, 0000000xh non sono validi in un sistema con paginazione". Non penso si riferisse a NULL in quanto simbolo di compilatore, ma a NULL in quanto generalmente associato all'indrizzo 0x00000000. Che poi il simbolo NULL possa essere associato a valori diversi in dipendenza dell'architettura/OS/Compilatore su questo nn ci piove ;).

cdimauro
29-06-2006, 16:21
Sì, infatti. Anch'io penso che Alberto voleva rifersi al fatto che in genere NULL è associato all'indirizzo 0.

Di conseguenza, in un sistema paginato, per intrappolare i tentativi di accesso a un indirizzo "illegale", viene "rimossa" (non viene mappata nell'albero delle pagine) la pagina a cui è mappato l'indirizzo (virtuale) 0, invalidando così anche gli indirizzi seguenti, fino alla dimensione complessiva della pagina.

Il che, come detto, dipende esclusivamente da quella tripletta, appunto (in questo caso dal s.o.), perché in linea teorica per rendere non valido esclusivamente l'indirizzo 0 se lo uso come NULL basterebbe (per il s.o.) intercettare il page fault, controllare se l'indirizzo è 0, se sì sollevare l'eccezione, altrimenti far procedere l'operazione.
D'altra parte è soltanto un valore che vogliamo associare a NULL: gli altri sono legittimi, sulla carta.
Non lo si fa perché è decisamente più comodo e più veloce togliere di mezzo l'intero spazio d'indirizzamento virtuale associato a una pagina.

71104
29-06-2006, 16:47
per quale architettura target NULL è associato a un valore diverso da 0...? :mbe:

cdimauro
29-06-2006, 17:08
Per quella 386, ad esempio: basta attribuire a NULL il valore 0xFFFFFFFF e rimuovere questa pagina dalla page table. ;)

The3DProgrammer
29-06-2006, 17:09
per quale architettura target NULL è associato a un valore diverso da 0...? :mbe:


leggi qua (http://lists.gnupg.org/pipermail/gcrypt-devel/1999-October/000013.html) ad esempio;)

ciau

The3DProgrammer
29-06-2006, 17:22
xò, se posso dirlo, nn capisco la relazione che intercorre tra non sapere/ricordarsi questa cosa (personalmente nn sapevo che si rimuovesse l'intera pagina - metti ke è una pagina da 4 MB mi gioco 4 Mega di RAM? :doh: :D - ma ragionandoci un po sembra la cosa + logica) e aver capito come funziona la paginazione :confused:. Cmq vi lascio, domani ho l'orale di sistemi distribuiti e devo ancora imparare il funzionamento di NFS, AFS e XFS, oltre che DES ed RSA :muro:.

ciau

cdimauro
29-06-2006, 17:26
Ma no guarda, non si perdono mica 4MB di memoria: stiamo parlando di indirizzi virtuali, non fisici. ;)

Si possono perdere 4MB (di memoria fisica) soltanto se hai un sistema con 4GB di memoria fisica, ma a questo punto penso che non te ne fregherebbe tanto... :p

The3DProgrammer
29-06-2006, 18:02
Ma no guarda, non si perdono mica 4MB di memoria: stiamo parlando di indirizzi virtuali, non fisici. ;)

Si possono perdere 4MB (di memoria fisica) soltanto se hai un sistema con 4GB di memoria fisica, ma a questo punto penso che non te ne fregherebbe tanto... :p

si lo so:fagiano:

ci ho pensato proprio adesso a quello che ho scritto ed ero accorso x editare prima ke mi linciaste :p ma nn ho fatto in tempo:D

il fatto è ke sto sclerando e nn so manko quello ke scrivo :muro:

ciau

Bonfo
29-06-2006, 18:20
Ma no guarda, non si perdono mica 4MB di memoria: stiamo parlando di indirizzi virtuali, non fisici. ;)

Si possono perdere 4MB (di memoria fisica) soltanto se hai un sistema con 4GB di memoria fisica, ma a questo punto penso che non te ne fregherebbe tanto... :p

:wtf: :wtf:

Scusate, ma a casa mia la dimensione delle pagine è fissa, quindi indipendente dalla memoria fisica.
Infatti io divido i 4GB di indirizzamento (virtuale) in "pagine" di 2Mb, poi alloco la pagina logica (ovvero una porzione dei possibili 4GB) in una pagina fisica, ovvero una porzione della stessa dimensione della memoria fisica.

Ho sbagliato qualcosa??

The3DProgrammer
29-06-2006, 18:40
:wtf: :wtf:

Scusate, ma a casa mia la dimensione delle pagine è fissa, quindi indipendente dalla memoria fisica.
Infatti io divido i 4GB di indirizzamento (virtuale) in "pagine" di 2Mb, poi alloco la pagina logica (ovvero una porzione dei possibili 4GB) in una pagina fisica, ovvero una porzione della stessa dimensione della memoria fisica.

Ho sbagliato qualcosa??


L'architettura x86 prevede la possibilità di implementare paging con pagine avente dimensione di 4KB e 4MB (forse anke 2MB, nn ne sono proprio sicuro), e eventualmente di mixarle tra loro (in modalità PSE36, anke qui vado a ricordo). Nel caso di paging con pagine da 4K avremo che l'indirizzo virtuale viene scomposto in page directory offset+page table offset+page offset mentre con pagine da 4MB avremo page directory offset+page offset (visto che sono pagine da 4 MB, il page directory offset dovrebbe essere di 10 bit, mentre il page offset di 22)

ciauz

EDIT: mi sono scordato di confermarti che, come correttamente dici, la dimensione delle pagine non dipende dalla dimensione della memoria fisica, ma solo dall'architettura. SPARC ad esempio dava la possibilità di scegliere tra pagine di 4K, 8K, 512K, 4MB e forse anke altre.

The3DProgrammer
29-06-2006, 18:47
:wtf: :wtf:
poi alloco la pagina logica (ovvero una porzione dei possibili 4GB) in una pagina fisica, ovvero una porzione della stessa dimensione della memoria fisica.


esatto.

71104
29-06-2006, 20:39
Per quella 386, ad esempio: basta attribuire a NULL il valore 0xFFFFFFFF e rimuovere questa pagina dalla page table. ;) ovviamente, anzi generalizzando è possibile attribuire a NULL un qualsiasi valore che si sa che per convenzione non sarà mai un indirizzo allocato; si da il caso che questo valore sia sempre 0, ma quale compilatore per 386 lo definisce diversamente?

^TiGeRShArK^
29-06-2006, 21:34
fiko...
non sapevo di scatenare un vespaio con la paginazione :D
cmq alla fine la mia amica l'ha capito da sola e non glielo devo spiegare :D
cmq leggendo la discussione mi sono ricordato tutti i vari ammenicoli del dos....
la modalità reale a 16 bit.. la modalità protetta a 32..... himem.sys ... emm386.exe... e il mitico dos4gw che usavano una marea degli ultimi gioki :D
cmq sto provando a rimettermi in pari col codice ma mi sono accorto che è un bel casino.....:mbe:
spero di riuscire a tornare operativo in max 2-3 giorni :p

71104
29-06-2006, 23:29
cmq sto provando a rimettermi in pari col codice ma mi sono accorto che è un bel casino.....:mbe:
ma ora certi pezzi stanno diventando dei veri gioiellini :)
guarda per esempio il package it.diamonds.log, non c'è manco un if :D :D :D

^TiGeRShArK^
30-06-2006, 03:27
mi sono messi a guardarli un pò... bellini :D
però mi sfugge una cosa.. :mbe:
come cacchio fa a funzionare se ci sono delle action che contentono oggetti non serializable e non dichiarati transient? :confused:
vabbè ke è tardino e non capisco un kazzo.. :p
domani forse capirò cosa mi sfugge :stordita:

cdimauro
30-06-2006, 08:35
L'architettura x86 prevede la possibilità di implementare paging con pagine avente dimensione di 4KB e 4MB (forse anke 2MB, nn ne sono proprio sicuro),
Sì, anche 2MB.
e eventualmente di mixarle tra loro (in modalità PSE36, anke qui vado a ricordo).
No, la dimensione delle pagine dovrebbe rimanere la stessa anche in modalità PAE.
EDIT: mi sono scordato di confermarti che, come correttamente dici, la dimensione delle pagine non dipende dalla dimensione della memoria fisica, ma solo dall'architettura. SPARC ad esempio dava la possibilità di scegliere tra pagine di 4K, 8K, 512K, 4MB e forse anke altre.
Esattamente: dipende soltanto dall'architettura. ;)

Finora la più bella e flessibile PMMU che ricordo è quella di Motorola (e te pareva :D), che col 68851 (PMMU da associare al 68000, 68010 e 68020) permetteva di definire in maniera arbitraria l'altezza dell'albero (numero di livelli di indirezione; da 1 a 4) e la dimensione delle pagine (da 256 byte a 32KB).

P.S Non volevo mica linciarti! :p

cdimauro
30-06-2006, 08:41
ovviamente, anzi generalizzando è possibile attribuire a NULL un qualsiasi valore che si sa che per convenzione non sarà mai un indirizzo allocato;
Esattamente: l'avevo già scritto. ;)
si da il caso che questo valore sia sempre 0,
Dipende dall'architettura. Il link di The3DProgrammer è piuttosto eloquente. ;)
ma quale compilatore per 386 lo definisce diversamente?
Che io sappia nessuno, ma non era certo questo il pomo della discordia. ;)

Comunque se vuoi te ne prendo uno open source e modifico il valore che attribuisce a NULL con uno diverso da zero. :D

P.S. Chi è che non sapeva certe cose? :Prrr:^:Prrr:

jappilas
30-06-2006, 10:28
Alberto vs. Cesare: 1 a 1 e palla al centro? :D

cdimauro
30-06-2006, 11:37
Mi son perso il gol di Alberto... :asd:

OK, chiudiamola qui perché siamo pesantemente OT e poi mi sembra che sia già stato detto tutto sull'argomento. ;)

^TiGeRShArK^
30-06-2006, 11:58
:stordita:
sono sempre + confuso sul codice del log.....
come fa a funzionare la serializzazione se gli oggetti serializzati contengono campi non serializzabili e neanche transient?
non spara eccezioni a palla? :mbe:
e inoltre, anche correggendo questo problema, non è troppo pesante serializzare anche oggetti pesanti del calibro di istanze di engine?:confused:

cdimauro
30-06-2006, 12:04
Ma non dovrebbe serializzare soltanto alcune action? Mi mi pare di aver visto la serializzazione di engine da qualche parte...

Comunque parliamo nell'apposito thread, che è meglio. :)

thebol
30-06-2006, 12:08
[cut]

71104
30-06-2006, 16:19
Comunque se vuoi te ne prendo uno open source e modifico il valore che attribuisce a NULL con uno diverso da zero. :D ma così i programmi generati non funzioneranno più su nessuna piattaforma :O

71104
30-06-2006, 16:21
non spara eccezioni a palla? :mbe: prima si ma ora non più, c'era un errore che ho corretto; guarda tu stesso, se spara eccezioni a palla appariranno tutte sulla console.

cdimauro
30-06-2006, 16:24
ma così i programmi generati non funzioneranno più su nessuna piattaforma :O
No, i programmi generati sono legati alla mia piattaforma e funzioneranno perfettamente su di essa.

Esattamente come quelli Win32, ad esempio, sono legati a questa piattaforma (e quindi alle convenzioni che sono state stabilite). ;)

The3DProgrammer
01-07-2006, 14:14
No, la dimensione delle pagine dovrebbe rimanere la stessa anche in modalità PAE.



Ciao, solo una precisazione visto ke siamo OT. Ero sicuro di aver letto da qualke parte la possibilità di mixare pagine a 4K e 4MB, così sono andato a controllare. Ho verificato sul volume 3 dell'intel software developers manual, par 3.7.3 che effettivamente c'è la possibilità di mixare pagine da 4K e da 4 MB, settando un flag in un control register. Praticamente si fa in modo che una directory entry possa puntare sia pagine da 4MB che a page tables che a loro volta puntano a pagine di 4K. Questa modalità è utile in diverse situazioni, ad es si può fare in modo che le componenti del kernel vengano memorizzate in pagine da 4MB in modo da ridurre i TLB miss, aumentando le prestazioni del sistema.

ciauz;)

71104
01-07-2006, 15:21
No, i programmi generati sono legati alla mia piattaforma e funzioneranno perfettamente su di essa. sono generati da un compilatore che non rispetta dei contratti (definizione di NULL)

Esattamente come quelli Win32, ad esempio, sono legati a questa piattaforma (e quindi alle convenzioni che sono state stabilite). ;) tra le convenzioni c'è anche che NULL debba essere "nullo"; se lo definisci diversamente il programma a runtime potrebbe avere comportamenti diversi

nig3D
02-07-2006, 17:46
Saluto Fra e saluto tutti quanti,

un pò sorrido quando leggo i vostri post a proposito del perfetto design, purtroppo non è per niente real life, a volte poi bisogna mandare a quel paese il design in cambio della velocità (sapete le scadenze).

Francesco sta facendo un ottimo lavoro, vorrei anche io saperne molto di più di pattern, XP e c.net, ma fin'ora non ne ho avuto veramente bisogno.

keep up the good work

cdimauro
03-07-2006, 08:33
Ciao, solo una precisazione visto ke siamo OT. Ero sicuro di aver letto da qualke parte la possibilità di mixare pagine a 4K e 4MB, così sono andato a controllare. Ho verificato sul volume 3 dell'intel software developers manual, par 3.7.3 che effettivamente c'è la possibilità di mixare pagine da 4K e da 4 MB, settando un flag in un control register. Praticamente si fa in modo che una directory entry possa puntare sia pagine da 4MB che a page tables che a loro volta puntano a pagine di 4K. Questa modalità è utile in diverse situazioni, ad es si può fare in modo che le componenti del kernel vengano memorizzate in pagine da 4MB in modo da ridurre i TLB miss, aumentando le prestazioni del sistema.

ciauz;)
Mumble. Quindi avremmo una sola page directory che, eventualmente, punta a pagine da 4MB o a un'altra page directory con pagine da 4KB. Molto strano.

Quindi dovremmo avere nell'entry della page directory un flag che indica se la pagina è da 4MB o invece è una page directory.

Sorge però un problema di "conti". Una pagina da 4MB occupa 22 bit in un indirizzo virtuale, mentre una da 4KB occupa 12 bit.

Ora, se la page directory principale dovesse contenere indifferentemente pagine da 4MB o da 4KB, vorrebbe dire che, in linea di principio, tutta la directory dovrebbe contenere al massimo 1024 entry (32 - 22 = 10 bit rimanenti).
I 22 bit più bassi dovrebbero, poi, indicare un indirizzo nel caso di una pagina da 4MB, oppure l'indice di una page entry nel caso di pagine da 4KB. In quest'ultimo caso, quindi, la seconda directory dovrebbe contenere 1024 entry (10 bit) e lasciare gli altri 12 bit per indicare la pagina (visto che sono pagine da 4KB).

Mi sembra un meccanismo alquanto contorto. :p

Gli darò un'occhiata appena ne avrò la possibilità. ;)

Grazie per l'informazione. :)

cdimauro
03-07-2006, 08:37
sono generati da un compilatore che non rispetta dei contratti (definizione di NULL)
Guarda che parlavo della MIA piattaforma, ossia della tripletta compilatore/s.o./applicazione, per la quale NULL è definito come voglio io. ;)

Esempio: se pongo NULL = 0xC0DEDBAD, vuol dire che il compilatore generà codice per cui al posto di NULL metterà il valore 0xC0DEDBAD, il s.o. si aspetterà questo valore quando avrà a che fare con puntatori, e le applicazioni idem.

Non vedo quale sia il problema: i contratti vengono assolutamente rispettati.
tra le convenzioni c'è anche che NULL debba essere "nullo"; se lo definisci diversamente il programma a runtime potrebbe avere comportamenti diversi
Certamente: la piattaforma Win32 ha le SUE convenzioni, che tutti (leggi: la tripletta di cui sopra) devono rispettare, pena il malfunzionamento del sistema.

Ma questo nessuno l'aveva mai negato. ;)