Post by Johnla piriforme dottoranda in filologia assiro-babilonese espulsa con
disonore dall'università per aver inavvertitamente pulito in lavatrice
Post by la piriforme dottoranda in filologia assiro-babilonese espulsa con disonore dall'università per aver inavvertitamente pulito in lavatrice il fondo manoscrittiPost by JohnGrazie. Mi serviva per dare una dimensione massima
all'array. Allora penso che con diecimila vado sul sicuro....
:-))))
Male: in C++ (e se non lo usi usalo :) la classe vettore si
ridimensiona automaticamente e personalmente lascio
l'allocazione statica a casi rarissimi :)
Io uso il C. Il C++ lo conosco ma non ho molta pratica. Ma 'non mi fido'
delle allocazioni 'runtime'. Mi hanno sempre fatto diventare pazzo a
cercare errori quando qualche pointer va per i ca§§i suoi. Non hai
controllo. Non sai mai 'in quel momento' quanto sono grandi gli arrays.
Se poi non sono solo vettori ma matrici, addio.
Allora preferisco dar loro uno spazio massimo e andare sul sicuro.
Intanto oggigiorno lo spazio costa poco.
Cavolate.
int data[100];
chissa' quante volte nel codice potra' capitare data[100] e sei in un
bel buffer overflow!
Oppure, peggio ancora, data[i], con i che assume un valore >= 100.
o metti
for ( j = 0; j <= 100; j++ )
data[j]...
altro errore!
o peggio
for ( j = 0; j < 100; j++ )
data[j+1] ...
altro errore! (ancora piu' "viscido").
Se usi std::vector risolvi tutti i tuoi problemi: hai un controllo
sull'indice del vettore, ed eviti buffer overflow (al max ti viene
lanciata una std::exception, che blocca tutto).
E il tuo vettore si ridimensiona da solo con .push_back().
Il C si usava probabilmente su Unix verso il 1975 come tecnologia
cutting-edge...
L'informatica grazie a Dio si e' evoluta, e ora c'e' il C++ con STL
(oltre a Java o C#)... siamo nel 2007 ormai ;)
I problemi di sicurezza nei programmi che *milioni* di persone usano
(incluso Explorer, Windows, etc.) sono spesso dovuti ad un uso
pericoloso e "legacy" (come tu proponi di fatto) di array o stringhe
alla C, con buffer-overflow (che spesso si nascondono in moduli con
1,000,000 di righe di codice o piu').
Scommetto che consigli magari di usare strcpy(), strcat() etc. e
stringhe alla C con "char *"... e' il modo migliore per andare
incontro a software scassato con attacchi di hacker dovuti a buffer
overflow & company.
Anche se uno non vuole usare una *classe* per le stringhe (perche'??),
ormai lo stesso Windows fornisce al programmatore C delle funzioni
piu' "serie" per gestire le stringhe, che evitano buffer overflow
(vedere libreria di sistema Win32 SafeString).
C'e' un motivo se sono state introdotte tecnologie piu' avanzate come
C++ o STL, con vettori con bounds-checking (che e' anche il default in
Java o C#!).
E poi l'ottimizzazione si fa sull'intera *architettura*, e poi alla
*fine* dopo un profiling del codice, e serve per casi moltooo
particolari (per un database non serve certo ottimizzare il codice
evitando il bound checking su array - che sono pochissime istruzioni
assembly - e portandosi dietro problemi ben piu' gravi come potenziali
buffer overflow, pericolossissimi e sfruttabili da hacker anche in
erba).
Post by JohnPensa che io, fino a poco tempo fa, mi facevo i databases da solo,
perchè non volevo rompermi il kakkio con SQL e i database engines che
sono lenti da morire.
Ma il tuo database forse aveva max 100 record?
Come li gestisci database con 100,000 o *milioni* di record?
Come gestisci il rollback?
Come gestisci la concorrenza di thread diversi?
Come gestisci la concorrenza di processi diversi che vogliono accedere
agli stessi dati?
etc. etc.
Non credo che tu da solo riesca a sostituire il team di software
design engineers che sta dietro a prodotti come database engine di
Oracle o di Microsoft...
Post by JohnEra tutto perfettamente sotto controllo e veloce !!
Per database di poche decine di centinaia record, senza rollback,
senza multithreading e accesso concorrente, forse...
Per la rubrichetta personale va bene un array alla C e va bene pure la
ricerca lineare per i record (quella logaritmica forse causerebbe un
overhead! :) ...per gestire database di una multinazionale o i
terabyte di dati di Google o applicazioni distribuite... forse bisogna
usare una tecnologia "un pizzico" piu' sofisticata ed evoluta.
BTW: Comunque mi pare molto OT per un NG di studenti di medicina...
MrAsm