[Risolto][C] Matrice in memoria codivisa

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
pitagora11
Prode Principiante
Messaggi: 84
Iscrizione: lunedì 14 giugno 2010, 12:59

[Risolto][C] Matrice in memoria codivisa

Messaggio da pitagora11 »

Salve a tutti,
ho problemi a gestire una matrice in memoria condivisa. Il mio codice è il seguente:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(void) {
	key_t key_matrix;
	int id_matrix;
	int **matrix;
	
	printf("Creo la memoria condivisa per la matrice...\n");
	key_matrix = ftok("./", 'a');
	id_matrix = shmget(key_matrix, sizeof(int[2][3]), IPC_CREAT|IPC_EXCL|0664);
	if(id_matrix==-1) (id_matrix = shmget(key_matrix, sizeof(int[2][3]), 0));
	
	printf("Collego la memoria condivisa per la matrice...\n");
	matrix = shmat(id_matrix, 0, 0);
	
	printf("Scrivo nella matrice...\n");
	matrix[0][0] = 14;
	printf("Ho scritto %d\n", matrix[0][0]);
	
	return 0;
}
Quando lo mando in esecuzione, ottengo

Codice: Seleziona tutto

Creo la memoria condivisa per la matrice...
Collego la memoria condivisa per la matrice...
Scrivo nella matrice...
Errore di segmentazione (core dump creato)
È evidente che sbaglio qualcosa nella gestione del puntatore alla matrice. Ho letto un po' in giro, ma non capisco proprio come risolvere. Sapete aiutarmi?
Ultima modifica di pitagora11 il lunedì 14 novembre 2016, 11:23, modificato 1 volta in totale.
pitagora11
Prode Principiante
Messaggi: 84
Iscrizione: lunedì 14 giugno 2010, 12:59

Re: [C] Matrice in memoria codivisa

Messaggio da pitagora11 »

Scusate il post consecutivo, ma credo di aver trovato una soluzione almeno temporanea. Se gestisco la matrice come un array e utilizzo degli opportuni offset per i righi e le colonne, non ho problemi:

Codice: Seleziona tutto

#define COL 3
#define RIG 2

int main(void) {
	key_t key_matrix;
	int id_matrix;
	int *matrix;
	
	printf("Creo la memoria condivisa per la matrice...\n");
	key_matrix = ftok("./", 'a');
	id_matrix = shmget(key_matrix, sizeof(int[COL])*RIG, IPC_CREAT|IPC_EXCL|0664);
	if(id_matrix==-1) (id_matrix = shmget(key_matrix, sizeof(int[COL])*RIG, 0));
	
	printf("Collego la memoria condivisa per la matrice...\n");
	matrix = (int*)shmat(id_matrix, 0, 0);
	int rigo,colonna;
	
	printf("Scrivo nella matrice...\n");
	for(rigo=0; rigo<RIG; rigo++)
	{
		printf("\n  |");
		for(colonna=0; colonna<COL; colonna++)
		{
			*(matrix+rigo+colonna) = rigo*colonna;
			printf("  %d  |", matrix[rigo+colonna]);
		}	
	}
       return 0;
}
Come detto, però, la ritengo una soluzione "temporanea". Come è possibile usufruire dell'astrazione del concetto di matrice utilizzando la memoria condivisa?
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [C] Matrice in memoria codivisa

Messaggio da ixamit »

In breve, puoi inserire l'array bidimensionale in una struttura in modo da non ricorrere all'utilizzo di array di puntatori come nel tuo primo esempio.

Codice: Seleziona tutto

dichiari la struttura
struct shared
{
    int m[R][C];
};
...
alloca
id_matrix = shmget(key, sizeof(struct shared), IPC_CREAT|IPC_EXCL|0664);
...
scrivi
shared->m[row][col] = ... ;
altrimenti devi definire i puntamenti come fai per le matrici dinamiche, o meglio un'unica allocazione https://ideone.com/zSgrnK
pitagora11
Prode Principiante
Messaggi: 84
Iscrizione: lunedì 14 giugno 2010, 12:59

Re: [C] Matrice in memoria codivisa

Messaggio da pitagora11 »

Scusa per il ritardo, sono stato fuori tutta la settimana.
Comunque ho capito, grazie mille.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 20 ospiti