View Full Version : [C] Ridimensionare array bidimensionale
VegetaSSJ5
01-07-2004, 19:57
Salve faccio questa domanda per un progetto che devo fare in C che dovrà girare sotto linux.
Poichè si tratta di un'applicazione che farà N fork (tante quante ne passerò come parametro da linea di comando) vorrei che l'array bidimensionale dichiarato dui sotto sia una variabile globale in modo tale che poi ogni processo figlio non abbia nel suo spazio di memoria un nuovo array visto che questo deve essere uguale per tutti i processi (padre e figli). Ecco l'arrayint automobili[1][2]A questo punto vorrei ridimensionare questo array in modo tale che sia lungo N colonne ed abbia sempre due righe ciooè del tipoautomobili[N][2]Siccome il numero N non lo conosco a priori allora devo per forza dichiararlo come automobili[1][2] e poi ridimensionarlo in automobili[N][2]. Ho provato quindi a fare questo ridimensionamento attraverso una realloc in questo modoautomobili=(int *) realloc (automobili, 2*N*sizeof(int));tuttavia in fase di compilazione mi segnala l'erroreerror: incompatible types in argumentCome mai mi segnala quest'errore? A me sembra che la realloc sia fatta in modo giusto! Qualcuno mi aiuta??
Ziosilvio
01-07-2004, 23:42
Uhm... ti sei preso una bella gatta da pelare!
Non ho mai fatto niente del genere, ma la sfida mi affascina, quindi ci metto i miei 10 centesimi.
Allora: anzitutto, hai dichiarato automobili come array e non come puntatore, quindi non puoi applicargli realloc.
D'altra parte, il tipo "matrice bidimensionale" in C non esiste, quindi devi implementarlo con i puntatori. Vediamo qualche alternativa...
Potenziale soluzione 1:
Dichiari automobili come puntatore a puntatori a int.
Quando inizializzi la prima volta, lo allochi con una (int**)malloc(nrighe*sizeof(int*)), poi per i da 0 a nrighe-1 allochi automobili[i] con una (int*)malloc(ncolonne*sizeof(int)).
L'elemento generico si chiama sempre automobili[i][j].
La riallocazione dovresti poterla fare (non lo so se funziona, però) chiamando prima realloc(automobili,new_nrighe*sizeof(int*)), e poi realloc(automobili[i],new_ncolonne*sizeof(int)) per i da 0 a new_nrighe-1.
Potenziale soluzione 2:
Ti crei una struttura dati che rappresenta matrici con un arbitrario numero di righe e colonne, con due campi int e un campo int**:
struct matrice {
int nrighe, ncolonne;
int **elem;
};
più tutte le funzioni che servono a fare somme, prodotti, inizializzazioni eccetera; poi dichiari automobili come puntatore a struct matrice.
L'elemento generico si chiamerà (automobili->elem)[i][j].
La riallocazione la fai creando una nuova matrice, copiandoci dentro la vecchia come sottomatrice, cancellando la vecchia e assegnando a automobili l'indirizzo della nuova.
Fammi sapere come va.
ilsensine
02-07-2004, 09:08
Originariamente inviato da VegetaSSJ5
si tratta di un'applicazione che farà N fork....ogni processo figlio non abbia nel suo spazio di memoria un nuovo array visto che questo deve essere uguale per tutti i processi (padre e figli).
Posizioni incompatibili. E' valido solo se l'array è in una pagina di memoria di sola lettura o se usi la shared memory.
Solo i thread condividono la tabella di paginazione (quindi tutta la memoria).
VegetaSSJ5
02-07-2004, 13:33
ho usato una soluzione più spartana: ho dichiarato 2 puntatori a int
int *automobili;
int *direzione;
e li ho riallocati singolarmente con lunghezza n.
x ziosilvio:
avevo pensato anch'io a soluzioni del genere ma a me interessava proprio ridimensionare un array bidimensionale senza usare atrifici di qualsiasi tipo e poi il gioco non valeva la candela.
x ilsensine:
thanks, cmq per ora gioco solo con i processi e non con i thread, mi stanno facendo impazzire, anche perchè non c'è nessuno che me li ha spiegati decentemente. Le slide del professore fanno pena, il libro che ho appena comprato (e che sembrava interessante) fa ancora + pena... dovrò provare a leggere gapil. cmq sto facendo un progettino per laboratorio di sistemi operativi e la domanda in questo thread (in questo contesto thread è una parola ambigua ;)) riguardava proprio questo progetto. se avrò altri dubbi (cioè subito e molti) cercherò prima di risolverli e poi posterò qui sul forum... conto in una vostra mano! ;) :eek: :sofico:
ilsensine
02-07-2004, 14:33
Originariamente inviato da VegetaSSJ5
thanks, cmq per ora gioco solo con i processi e non con i thread
Allora scordati che un processo può leggere un array modificato da un altro processo, a meno di non usare memoria condivisa o un mmap anonimo shared.
mi stanno facendo impazzire, anche perchè non c'è nessuno che me li ha spiegati decentemente
Allergico a google? ;)
http://www.llnl.gov/computing/tutorials/workshops/workshop/pthreads/MAIN.html
VegetaSSJ5
02-07-2004, 14:47
insensine io ho una variabile che devono leggere sia il genitore che i figli (non che ognuno ha la propria, ma tutti devono leggere solo quella variabile). come posso fare?
ilsensine
02-07-2004, 14:48
Tutto dipende se dopo il fork quella variabile deve essere modificata. Se _nessuno_ la modifica dopo il fork, allora ok.
VegetaSSJ5
02-07-2004, 14:55
Originariamente inviato da ilsensine
Tutto dipende se dopo il fork quella variabile deve essere modificata. Se _nessuno_ la modifica dopo il fork, allora ok.
dopo il fork quella variabile verrà cambiata solo dal processo padre ogni volta che riceve un SIGALRM da alarm(8). MI CORREGGO posso usare memoria condivisa perchè invece c'è nel programma! ;) :eek:
ilsensine
02-07-2004, 14:57
e allora usala, altrimenti i child non vedranno le modifiche a quella variabile...
VegetaSSJ5
02-07-2004, 15:00
Originariamente inviato da ilsensine
e allora usala, altrimenti i child non vedranno le modifiche a quella variabile...
ehm...
:idea:
http://www.di.univaq.it/~formisano/lso0304/pro5.txt
:fiufiu: :help: :sperem: :nonio: :ave: :ave:
ilsensine
02-07-2004, 15:06
Originariamente inviato da VegetaSSJ5
ehm...
:idea:
http://www.di.univaq.it/~formisano/lso0304/pro5.txt
:fiufiu: :help: :sperem: :nonio: :ave: :ave:
Si interessante, vuoi anche che te lo faccio io? :asd:
VegetaSSJ5
02-07-2004, 15:09
Originariamente inviato da ilsensine
Si interessante, vuoi anche che te lo faccio io? :asd:
la cosa non mi dispiacerebbe... cmq nooooo....... era solo per farti vedere cosa dovevo fare......
:rolleyes: :cry: :muro: :muro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.