Cercherò di rispondere senza irritarmi..
sir_alex ha scritto:Purtroppo non ho nessun manuale di C e quindi non posso verificare nulla, ma [] è un operatore per creare array. Punto. Non ha alcun senso dire che per fare degli array devi crearti tu una libreria, giustificando il fatto che [] non è adatto: non è vero.
A si? Non è vero? Ed in base a che ragionamento?? Prova a fare un "sizeof(array)". Funziona? No. Perchè? Perchè non esiste il tipo "array" in C, che invece è un tipo nei linguaggi che, guarda un po' che caso, supportano il bound checking. Sai cosa significa che un linguaggio non supporta un tipo dati? Bene, in C non esiste un tipo dati per gli array, con tutto quel che comporta.
Lo ripeto: le parentesi quadre sono un operatore che dereferenzia un puntatore. L'ho ampiamente dimostrato nei miei esempi così come ho dimostato che quelli che chiamate array sono puntatori a matrici di dati uguali e nient'altro, che rispondono unicamente all'aritmetica dei puntatori e nient'altro. expr1[expr2] è uguale a *((expr1) + (expr2)), è la stessa cosa in C, non cambia nulla, a nessun fine. L'unica differenza, come è stato evidenziato dal mio esempio, risiede nella compilazione E BASTA.
Il nome di un array viene tradotto in una locazione di memoria, un puntatore è una zona di memoria della dimensione di un puntatore che contiene l'indirizzo dell'area di memoria.
Vuoi dire di no? Dillo. Dillo quanto ti pare. Ma questo non lo renderà vero, finchè non lo dimostri. Dimostra che ai fini del linguaggio C definire una matrice di valori con le parentesi [] rende il suo nome qualcosa di più di un puntatore ad un area di memoria contigua di dimensione sizeof(type) * elementi, e allora FORSE avrai ragione.
Anche se comunque, non avrai ragione lo stesso, e sai perchè?
Perchè i linguaggi di programmazione non devono implementare tutto. Ogni linguaggio implementa quello che vuole come vuole e se vuole. Sono i programmatori che decidono cosa usare e per quale motivo in base alle proprie esigenze e, perchè no, alle proprie capacità.
Se ti riesce così assurdo dividere le parentesi quadre dal tuo concetto di array, non è il C ad essere sbagliato, sei tu che stai sbagliando linguaggio.
E se ti mettessi a programmare in assembler allora, che è pure più povero, che diresti?
Ok, ha senso dire che se ti fai una libreria è meglio perchè puoi aggiungere tu i controlli che C non ha di default (come lo sforare appunto gli array), ma dire che fare array con [] è errato è campato in aria! Altrimenti per che cosa diavolo servono le parentesi quadre? L'unico uso che io conosco è questo!
Mi spiace che tu conosci solo quest'utilizzo, davvero. Ma ho dimostrato che ce ne sono altri. Li hai letti o no? Come fai a saltare fuori e dire che non c'è altro ultilizzo quando l'ho spiegato negli altri post e dimostrato con degli esempi di codice??????
Poi, ripeto, magari ho completamente sbagliato, non ho un manuale, ma a me ad Info 1 hanno insegnato così e non vedo perchè il prof dovrebbe dire cavolate...
Sai ad un certo galileo tutti dicevano che il sole girava attorno alla terra... pensa te!
Ma perchè, credi che il tuo prof ti abbia detto solo questa cavolata? Evidentemente deve darsi una ripassata di C o spiegarlo un po' meglio.
Per il discorso del topic invece, secondo me avere dei tools che ti indicano i bug di un software sono utili, sono d'accordo con chi dice "non chiamiamoli compilatori", ma d'altronde un compilatore come gcc o icc non fa solo il mestiere che gli dà il nome, fa anche altre cose (come le ottimizzazioni). E', se volete, lo stesso motivo per cui io ritengo (opinione personale) che usare un ambiente di programmazione è molto più utile di scrivere il codice in Vim (o qualunque editor puro), sia esso C, Java, quant'altro: un IDE spesso e volentieri effettua controlli per evitare gli errori "stupidi" (come quello di sforare un array per disattenzione, non per comportamento voluto)...
Ed è assolutamente assurdo dichiarare che chi fa un errore del genere non sa programmare, il saper programmare non ha nulla a che fare con il digitare una lettera per un'altra ad esempio!
E chi decide cosa è disattenzione e cosa no? Se gcc mi segnalasse cosa è disattenzione e cosa no SECONDO LUI, ne morirei. Sarebbe la prima opzione che disabiliterei, così come disabiliterei il codice che LUI genererebbe runtime per controllare quello che LUI suppone io voglia gestire come array o su cui LUI suppone io voglia avere dei controlli.. per carità di dio. E sai perchè? Perchè generalmente con il C si programmano cose a basso livello. Se si vuole programmare un software per, che so, calcolare quanto è stato speso in un mese per la gestione della casa, il C non è il linguaggio giusto (che una cosa si possa fare con uno strumento, non vuol dire che sia giusto farla con quello strumento. Prova a cuocere una pizza con un fornellino da campeggio... farlo puoi farlo.. ma... suvvia!)
Infine, se è vero che Intel e Microsoft fanno quello che vogliono, anche GNU fa quello che vuole quando scrive gcc, e le decisioni sono comunque prese da qualcuno sulla base della sua esperienza professionale o di una decisione magari presa discutendo con altri, ma come ogni discussione è ovviamente opinabile! Se Intel ha 12 cose che non fanno parte dello standard, anche GNU penso abbia implementato altre cose che magari non sono standard ma sono risultate comode da parte di chi ha creato il programma, per questo esistono flag come -ansi, che penso abbia anche icc (con cui purtroppo non ho esperienza).
IMHO
E dunque? E' ovvio che ognuno fa quello che vuole. La differenza però è nell'approccio. Vuoi forse paragonare l'approccio della Free Software Foundation a quello di una qualsiasi corporate?
Beh, non ce l'ho fatta a non irritarmi.
Per quanto all'inizio non volevo farlo, mi unisco a Vanoni: chi programma in C, deve sapere cosa sta facendo, perchè il C è un linguaggio che richiede questo: che la gente sappia cosa sta facendo.
Accoglimi nella tua scomoda posizione, Marco
Ci aggiungo solo una postilla: sbagliando s'impara. Invece d'intestardirvi a dire "NOOO! SONO ARRAY PERCHE' IL LIBRO DELLA WILBUR E SMITH DICE CHE SONO ARRAY" ed al contempo fate il salto logico "SICCOME SONO ARRAY ALLORA DEVONO (e sottolineo devono) FARE IL CONTROLLO SUI LIMITI", potete semplicemente prendere atto che il C non funziona così, che quello che vi aspettate che il C faccia NON LO FA e che o imparate a convivere con questa ed altre cose che il C non fa (ad esempio classi/oggetti), oppure cambiate linguaggio. Potreste semplicemente prendere atto che state chiedendo al C qualcosa di sbagliato e che quindi l'errore è vostro, non del C.
Ora flammatemi pure =)