Newsgroup: it.comp.lang.c
Titolo: Dichiarazione array runtime

Vi espongo il mio problema.
Devo ricevere da input dei polinomi di grado qualsiasi in una sola
variabile, e del polinomio verranno solo salvati i coefficienti
all'interno di un array di double. E' possibile, una volta che
l'utente ha digitato solo i coefficienti del polinomio, ricavare da
questi il grado del polinomio e quindi dichiarare un array della
dimensione sufficiente?
Esempio:
L'utente digita: 3 2 1, che starebbe per 3x^2 + 2x + 1
Il programma è in grado a questo punto di dichiarare un array a di
dimensione 3 (ovvero grado del polinomio dato in input + 1),
inizializzando correttamente le sue celle: a[0] = 1, a[1] = 2, a[2] =
3.
Vengo da Java e questa cosa in quel linguaggio sarebbe piuttosto
immediata. Non so se in C esista una soluzione abbastanza semplice ed
efficace o se si possa concretamente fare (sono un neofita del
linguaggio).
Grazie mille in anticipo!

 linguaggio).
Semplice è definire il grado massimo polinomi che il programma tratterà 
e dichiarare un array di quella grandezza.
In alternativa puoi chiedere il grado del polinomio prima di lasciare 
inserire i coefficienti e fare una unica allocazione oppure avere una 
variabile d'appoggio per leggere il coefficiente corrente in ingresso e 
creare una lista. Eventualmente dopo aver terminato puoi creare un array 
eliminando la lista.

 eliminando la lista.
In realtà l'esercizio dice di farlo parametrizzando il tutto in
MAX_DEGREE, quindi credo che la soluzione più semplice che hai detto
sia quella corretta. Solo che dal punto di della memoria è totalmente
uno spreco dichiarare due array magari di dimensione 200 e poi usare
magari due polinomi di grado due. Per questo stavo pensando a
soluzioni alternative.

 soluzioni alternative.
ipotizzando 8 bytes per double:
200(locazioni) * 8(bytes per double) * 2(numero di array) = 3.2Kb (un
po' meno) in totale.
Direi che te li puoi permettere senza il minimo problema (chissà
quanti mega di memoria spreca Java per lo stesso task solo a caricare
la VM!)
Ciao!

 soluzioni alternative.
ma non ho capito perché non puoi chiedere quanti coefficenti uno vuole
inserire e poi fare una malloc...
tipo:
int nums;
double *arrayOfNums;
printf("numero di coefficenti da inserie\n");
scanf("%d",&nums);
arrayOfNums = (double *) malloc(nums*sizeof(double));
....
....
free(arrayOfNums);

 free(arrayOfNums);
Prima che qualcun'altro (più o meno giustamente) puntualizzi:
arrayOfNums = malloc(nums*sizeof(*arrayOfNums));
Per il resto ovviamente la soluzione è sicuramente migliore di quella
originale (sempre restando sull'ovvio fatto che la migliore in
assoluto sia fare il parsing una stringa generica ;) )
Ciao!

 
in caso di tipi predefiniti preferisco la versione con un casting e
sizeof(tipo) in quanto mi ricorda al volo cosa contiene la struttura...
per altro mi sembra che lo gnu-coding-std segua questo stile.
comunque questione di stile
:-)

 > Prima che qualcun'altro (più o meno giustamente) puntualizzi:

ehehe - non dirlo al vecchio amico "Andrea LaForgia" che se legge
queste parole ritira fuori il suo cavallo di battaglia preferito ;-)
Ciao!
P.S. In questo caso comunque anch'io sono della stessa idea - ovvero
che il cast non ci va mai.


buh!
allora in C standard no.. ma in ambiente misto C/C++ visto che malloc
torna void se compili con: -Wall -ansi -pedantic ...
è vero che in C++ c'è new ma alle volte si mischia con codice precedente
scritto in C... insomma io da programmatore C++ il casting ce lo metto!

 scritto in C... insomma io da programmatore C++ il casting ce lo metto!
Scusate ma stavolta mi sono spiegato malissimo.
allora in C standard non è necessario fare il casting...
ma in ambiente misto C/C++ visto che malloc torna un puntatore a void se
compili con: -Wall -ansi -pedantic hai:
error: invalid conversion from 'void*' to 'double*'
quindi si casta.