|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
[C] Ridimensionare array bidimensionale
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'array Codice:
int automobili[1][2] Codice:
automobili[N][2] Codice:
automobili=(int *) realloc (automobili, 2*N*sizeof(int)); Codice:
error: incompatible types in argument |
|
|
|
|
|
#2 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
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**: Codice:
struct matrice {
int nrighe, ncolonne;
int **elem;
};
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.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: [C] Ridimensionare array bidimensionale
Quote:
Solo i thread condividono la tabella di paginazione (quindi tutta la memoria).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
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 |
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
http://www.llnl.gov/computing/tutori...eads/MAIN.html
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
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?
Ultima modifica di VegetaSSJ5 : 02-07-2004 alle 14:57. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Tutto dipende se dopo il fork quella variabile deve essere modificata. Se _nessuno_ la modifica dopo il fork, allora ok.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
e allora usala, altrimenti i child non vedranno le modifiche a quella variabile...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
http://www.di.univaq.it/~formisano/lso0304/pro5.txt
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:37.


















