selfmademan ha scritto:
Okok grazie ragazzi! Sono un meccanico, non amo particolarmente battere i tasti dietro a uno schermo
Bene, la domanda è
cosa vorresti che facesse quella funzione?
Chiedere due numeri da tastiera, e riportarne la somma.
Oppure sommare due numeri che le vengono passate?
Ma se voglio definire n variabili di tipo int, ad esempio int indice1; int indice 2;..........; int indicen; come posso fare?
Cioè io scelgo il valore di n e quindi mi vengono definite le n variabili.
Stavo pensando a
for(i=1; i<=n; i++)
{int indicen;} ma ovviamente non funziona poichè indicen viene riconosciuto come il nome della variabile.
Direi a "occhio" che non hai una gran dimestichezza, ma è normale.
Rammenta che il C non è altro che una sorta di "assembly semplificato", nasce una 50ina di anni fa, quindi è tutto molto più semplice e "brutale" di quanto puoi pensare.
Nel bene, e nel male.
Tornando alla domanda come sopra specificato esiste il concetto di array, o vettore, di "qualcosa".
Che non è altro che un blocco di memoria lungo dimensionedell'elemento*numeroelementi (in realtà la cosa non è proprio così banale con le struct, e con packet, ma non complichiamo il discorso più del necessario).
C lavora unicamente (a parte i tipi "banali", quali interi, float e poco più) con... celle di memoria, proprio come un programma Assembler.
L'allocazione di queste memorie (tralascio i formalismi dei linguaggio, le mitiche funzioni di allocazione che si studiavano a MTI) può avvenire, alla stragrossa, in 3 modi
1) implicito, sullo stack (e facciamo finta di niente, per ora)
2) esplicito, con dichiarazione statica (cioè dici "voglio 143 variabili intere, non una di meno, non una di più, e te lo dico quando scrivo il programma
3) esplicito, a runtime. Il programma ti chiede "quante variabili intere vuoi?" e ne crea TOT (quante richieste). Usualmente si usano funzioni di libreria tipo malloc() (e cugine varie) le quali predispongono una certa "fetta" della memoria diciamo "libera" (una volta si chiamava heap, ma poi --- cuttone ---).
Nel tuo caso, quindi, puoi utilizzare i metodi 2 o 3.
Il metodo (2) non prevede la "crescita": se hai 143 variabili, e ne vuoi 144, non puoi.
Il metodo (3) neppure prevede l'aumento: hai allocato 143 variabili, e 143 rimangono. Tuttavia, essendo strutture dati allocate dal programma, sta al programma (quindi al programmatore, cioè ... te...) nel caso prevedere la possibilità di aumentare lo spazio.
Come? Fatti tuoi.
Devi inventarti, proprio di sana pianta (a meno che non utilizzi librerie già confezionate) come operare.
Puoi utilizzare sistemi "brutali", tipo "se vuoi una variabile in più rispetto alle K iniziale, ne allochi altre K+1, poi ci copi sopra le K, e rilasci le prime K".
A variazioni tra le più disparate: se vuoi una variabile in più, ne allochi T in più (cioè K+T) nell'ipotesi che se ne vuoi una, poi ne chiederai 2, e fino a T non sarà necessario ricopiarle.
Oppure con una lista, cioè il vettore in realtà non esiste, ma avrai una struttura più complessa (con chunk di dati e un puntatore al prossimo chunk), che potrà essere di due elementi (valore-puntatore), ma con grande overhead ed inoltre frammentazione dello heap, oppure "figa"; cioè chunk-dimensione-puntatore, eventualmente a dimensione variabile (queste strutture dati sono usate più in situazioni come filesystem che algoritmi da RAM, ma nulla lo vieta).
Insomma O utilizzi strutture predisposte dal linguaggio (in C praticamente non esistono, o meglio sono banali), O utilizzi funzioni di libreria, O te le scrivi "a manina" O utilizzi librerie "più potenti" (quelle di C++).
Per inciso non parto sul pippone di C++ e perchè ormai è diventato una schifezza stile Java, e infatti mentre negli anni 90 sembrava IL linguaggio "fico", ora è non dico abbandonato, ma comunque molto ridimensionato e più un C "con qualcosa" che un idioma a tutto tondo [niente spiegone difetti C++, non li capiresti, ancora ]