View Full Version : array e costanti in c
mistermars
26-03-2005, 13:59
ciao a tutti ho un problema con l'utilizzo degli array.
Ho realizzato un programma di gestione di una rete in cui definisco degli array monodimensionali e bidimensionale, la cui dimensione dipende dal numero di nodi che compone la rete.
Il mio problema è dovuto al fatto che gli array quando vengono definiti hanno bisogno di un valore costante che definisce la quantità di memoria che deve essere allocata.
Io vorrei che il valore del numero di nodi e quindi della dimensione degli array fosse prelevato da un file di testo.
è possibile ciò?
Ziosilvio
26-03-2005, 14:16
Se definisci gli array dinamicamente, non c'è problema.
Anzitutto, anziché fare:
mytype a[len];
dichiari:
mytype *a;
int len;
poi leggi la dimensione dal file e la scrivi dentro len, per esempio con:
fscanf(file_input,"%n",&len);
poi fai:
a = (mytype*)malloc(len*sizeof(mytype));
Ovviamente devi accertarti che la memoria sia stata allocata davvero, ossia che a non sia NULL.
Quando hai finito, liberi la memoria con:
free(a);
mistermars
27-03-2005, 14:13
Originariamente inviato da Ziosilvio
Se definisci gli array dinamicamente, non c'è problema.
Anzitutto, anziché fare:
mytype a[len];
dichiari:
mytype *a;
int len;
poi leggi la dimensione dal file e la scrivi dentro len, per esempio con:
fscanf(file_input,"%n",&len);
poi fai:
a = (mytype*)malloc(len*sizeof(mytype));
Ovviamente devi accertarti che la memoria sia stata allocata davvero, ossia che a non sia NULL.
Quando hai finito, liberi la memoria con:
free(a);
ok cosi funziona, grazie. :D
Però ho problemi con questo tipo di variabili.
struct nodo *G[len];
int a[len][len];
come devo impostare l'allocazione dinamica in questi due casi?
h1jack3r
27-03-2005, 16:26
Devi usare i puntatori a puntatori.
Fai un **colonne con relativa malloc, poi devi inizializzare con malloc anche tutte le righe con un ciclo for
Ecco qui un esempio, qui ho inizializzato al matrice tutta a 0
Ah, poi la usi come una matrice normalissima matrice[N][N]
int **matrice;
//matrice dinamica e inizializzata
matrice=(int **)malloc(N*sizeof (int *));
for(i=0;i<N;i++)
{
matrice[i]=(int *)malloc(N*sizeof(int));
for(j=0;j<N;j++)
matrice[i][j]=0;
}
mistermars
28-03-2005, 10:01
Originariamente inviato da h1jack3r
Devi usare i puntatori a puntatori.
Fai un **colonne con relativa malloc, poi devi inizializzare con malloc anche tutte le righe con un ciclo for
Ecco qui un esempio, qui ho inizializzato al matrice tutta a 0
Ah, poi la usi come una matrice normalissima matrice[N][N]
int **matrice;
//matrice dinamica e inizializzata
matrice=(int **)malloc(N*sizeof (int *));
for(i=0;i<N;i++)
{
matrice[i]=(int *)malloc(N*sizeof(int));
for(j=0;j<N;j++)
matrice[i][j]=0;
}
vale per entrambe le variabili?
-- struct nodo *G[len];
-- int a[len][len];
mistermars
28-03-2005, 18:03
allora:
per l'array bidimensionale non c'è nessun problema.
ho problemi con la variabile struttura:
struct nodo *G[len];
come faccio a creare l'allocazione dinamica?
mistermars
29-03-2005, 09:21
up
h1jack3r
29-03-2005, 09:53
Originariamente inviato da mistermars
allora:
per l'array bidimensionale non c'è nessun problema.
ho problemi con la variabile struttura:
struct nodo *G[len];
come faccio a creare l'allocazione dinamica?
Te l'hanno spiegato sopra
G = (struct nodo*)malloc(sizeof(struct nodo));
Anche se non capisco bene a cosa serve una struttura che poi in realtà è un vettore,o è un array di putatori a struct?
mistermars
29-03-2005, 16:56
Originariamente inviato da h1jack3r
Te l'hanno spiegato sopra
G = (struct nodo*)malloc(sizeof(struct nodo));
Anche se non capisco bene a cosa serve una struttura che poi in realtà è un vettore,o è un array di putatori a struct?
Mi da errori usando quest'istruzione.
questo è un array di puntatori a struct
mistermars
29-03-2005, 17:37
questo è l'array originale in cui devo definire la costante
struct nodo *G[N];
queste sono le istruzioni usate per risolvere il problema di N variabile:
struct nodo **G;
G= (struct nodo **)malloc(N*sizeof(struct nodo));
for(i=0;i<N;i++)
{
G[i]=(struct nodo *)malloc(N*sizeof(struct nodo));
for(j=0;j<N;j++)
G[i][j]=0;
}
e questo è l'errore che viene generato:
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable conv
ersion)
dove sbaglio?
h1jack3r
29-03-2005, 17:49
Ho provatoa compilarlo e DEVc++ mi dice giustamente che non è corretto chiamare due cosa con lo stesso nome (G)
mistermars
29-03-2005, 18:12
Originariamente inviato da h1jack3r
Ho provatoa compilarlo e DEVc++ mi dice giustamente che non è corretto chiamare due cosa con lo stesso nome (G)
quindi come posso risolvere
h1jack3r
29-03-2005, 18:16
Chiamarlo con un nome diverso, se mi dici esattamente cosa vuoi fare posso provare ad implementarlo.
Ho capito che vuoi fare un vettore di puntatori a struct
poi allochi la memoria per ogni elemento del vettore per un sacco di struct
poi usi le struct come matrici cosa che non puoi fare, quello è un errore
mistermars
29-03-2005, 18:54
Originariamente inviato da h1jack3r
Chiamarlo con un nome diverso, se mi dici esattamente cosa vuoi fare posso provare ad implementarlo.
Ho capito che vuoi fare un vettore di puntatori a struct
poi allochi la memoria per ogni elemento del vettore per un sacco di struct
poi usi le struct come matrici cosa che non puoi fare, quello è un errore
Nel mio programma viene analizzata una rete rappresentata da una matrice in cui ogni elemento rappresenta il link di collegamento tra due nodi. Ciascun link a sua volta viene identificato da un costo , dal ritardo generato e dai nodi collegati.
le strutture le utilizzo per raccogliere tutte queste informazioni
h1jack3r
31-03-2005, 13:38
Originariamente inviato da mistermars
Nel mio programma viene analizzata una rete rappresentata da una matrice in cui ogni elemento rappresenta il link di collegamento tra due nodi. Ciascun link a sua volta viene identificato da un costo , dal ritardo generato e dai nodi collegati.
le strutture le utilizzo per raccogliere tutte queste informazioni
Si ma non capisco esattamente che dati devi inserire nelle strutture. Sennò basterebbe fare una lista o al max una lista di liste...
Usare una matrice come lista di puntatori a struct mi sembra un po' deleterio, soprattutto quando sulle liste una volta fatta una le hai fatte tutte, nel senso che fai un semplice copia e incolla da un vechio programma e sei a posto.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.