PDA

View Full Version : [c++] Definizioni "variabili"


graffio83
04-10-2011, 14:52
Ciao, sto lavorando su un sw, in c++
sin ora ho lacoratu su un vettore da 50 elementi
quindi avevo:


#define X 50
int Vect[X];


Ora ho bisogno di variare questa dimenzione durante l'utilizzo del mio programma, leggendo un valore immesso da utente, mi consigliate un metodo per farlo?

GByTe87
04-10-2011, 16:27
http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

Floris
04-10-2011, 21:17
Come linkato da GByTe87 il modo migliore per creare array la cui dimensione sia nota solo a tempo di esecuzione è allocarli dinamicamente sullo heap.

graffio83
04-10-2011, 21:18
Grazie mille, domani provo e ti faccio sapere :D

graffio83
06-10-2011, 14:03
:D Mi sono impegnato ma non riesco :(
Il fatto è questo, se sotto gli include tolgo la definizione dei vettori, tutte le funzioni che richiamano quei dati non restituiscono errore ed ovviamente non parte nada.

mi aiutate con un esempio.

diciamo per esempio io ora abbia


#include ...
...

#define x 5
#define y 6
#define z x*y
unsigned short vett1[x];
unsigned short vett2[z];
unsigned short vett3[z*3];

...

void prova (void)
{
for (i=0;i<z*3;i++)
{vett3[i]=i;}
}



in questo banale esempio come avrei risolto, chiedendo all'utente di inserire x,y e z prima del for?

ovviamente il tutto deve continuare ad essere globale perchè mi servono anche in altre finzioni...

grazie

Ifrit_Prog
06-10-2011, 14:18
Potresti optare per il passaggio dei parametri attraverso le funzioni, cosi eviti di usare le definizioni globali =).

Indi o opti per una cosa simile:

....
int main(void)
{
int dim_array[3];

(Qui chiedi di inserire i sati e li inserisci in dim_array[0] , dim_array[1] e dim_array[2])
.......
.......
funzione_uno( parm , dim_array )
funzione_due( parm , dim_array )
.......
.......
return 0;
}

graffio83
06-10-2011, 14:31
in questo momento dovrei variare troppe cose per passare i parametri da funzione...

Ifrit_Prog
06-10-2011, 15:12
in questo momento dovrei variare troppe cose per passare i parametri da funzione...

Rimane comunque la soluzione piu' elegante secondo me... e poi hai la possibilita' di modificare i parametri in un tempo successivo

tomminno
06-10-2011, 16:30
in questo banale esempio come avrei risolto, chiedendo all'utente di inserire x,y e z prima del for?

ovviamente il tutto deve continuare ad essere globale perchè mi servono anche in altre finzioni...

grazie

Premesso che le variabili globali sono :banned:
Ripremesso che, parlando di C++, la soluzione migliore è usare std::vector, binaramente compatibile con gli array.

Nel tuo caso devi dichiarare le tue variabili come puntatori a short e poi usare new per allocare la dimensione che più ti aggrada.

graffio83
06-10-2011, 18:22
Alla fine ho risolto con le malloc...


#include ...
....
unsigned short *vett1;
int x;
int y;
...
int main(void)
{
...
x=20;
vett1 = (unsigned short *) malloc(x*sizeof(unsigned short));
...
}



ha problemi questa soluzione?

GByTe87
06-10-2011, 18:24
Questa è la soluzione ideale; rimane quanto detto dagli altri sulle variabili globali. :p

graffio83
06-10-2011, 18:27
grazie mille :)

GByTe87
06-10-2011, 18:33
Dimenticavo; in C++ sarebbe meglio usare new e delete invece di malloc e free. Soprattutto se la usi per istanziare classi (invece di tipi primitivi).

E concordo quanto detto sui std::vector, se puoi usali.

graffio83
06-10-2011, 18:35
ok grazie, per ora vorrei solo funzionasse il tutto, poi mi occupo delle migliorie quindi sempre buono a sapersi...

solo che le new le devo studiare...

GByTe87
06-10-2011, 18:38
ok grazie, per ora vorrei solo funzionasse il tutto, poi mi occupo delle migliorie quindi sempre buono a sapersi...

"Make it work, make it right, make it fast." :D

tomminno
07-10-2011, 00:21
"Make it work, make it right, make it fast." :D

Al di là della battuta, in un ambiente lavorativo come lo fai la prima volta e come te lo terrai tutta la vita. Nessuno ti pagherà mai per ottimizzare un programma, a nessuno gliene frega niente dell'ottimizzazione, basta che funzioni. Più facile che ti chiedano altre funzionalità, se non proprio altri software...

Mai trovato un committente a cui gliene possa fregare qualcosa se il software è composto da un main di 10000 righe oppure strutturato a pattern.

Io al contrario sono un committente a cui interessa particolarmente :D