2016-03-20 8 views
1

Ich versuche, ein 2D-Array (Matrix) im Shared Memory zu speichern. Ich bin mit ubuntu und C.Speichern einer Struktur mit Vektoren im Shared Memory inc C

Das ist mein Code:

Die Struktur

typedef struct { 
    int data[COLUN_CAP]; 
} Colonna; 

typedef struct { 
    int nc; 
    key_t colK; 
    Colonna colonne[10]; 
} Matrix; 

Die Funktion, die die Matrix initiiert:

void iniz_mat(Matrix *M, int n) { 
    M->nc = n; 
    int i, k; 
    for (i = 0; i < M->nc; i++) {  
     printf("Colonna: %d \n", i); 
     for (k = 0; k < COLUN_CAP; k++) { 
      M->colonne[i].data[k] = rand() % 10; 
     } 
    } 
} 

Hauptprogramm

key_t shmKM; 
int n; 

shmKM = ftok(PATH_SHM, CHAR_SHMM); 
scanf("%d", &n); 
int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * 10, IPC_CREAT | 0664); 
Matrix *Mat; 
Mat = (Matrix *)shmat(idshmM, 0, 0); 
iniz_mat(Mat, n); 

ich ge t Segmentierungsfehler (Core Dumped) Fehler. Ich habe versucht, eine Matrix mit einer variablen Anzahl von Spalten zu speichern, aber anscheinend kann ich keine feste speichern. Tipps?


edit: Also, für die Variable Menge von Spalten Ich habe versucht:

typedef struct { 
    int nc; 
    key_t colK; 
    Colonna colonne[]; 
} Matrix; 

und natürlich:

int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664); 

es keine Fehler nicht geben, aber wenn ich drucke die Matrix Ich bekomme nur die ersten 2 Zeilen jeder Spalte.

Der Code für die Druckfunktion ist die folgende:

void print_matrix(Matrix *M) { 
    int i, k; 
    for (k = 0; k < COLUN_CAP; k++) { 
     for (i = 0; i < M->nc; i++) 
      printf("%d ", M->colonne[k].data[i]); 
     printf("\n");  
    } 
} 

So bekomme ich die visuelle Darstellung der Matrix. COLUN_CAP ist die Anzahl der Elemente jeder Spalte und wird auf 5 festgelegt.


Oh die Druckfunktion ist falsch (invertiert ich und k) Ich fühle mich so dumm. Danke an alle für die Hilfe!

+0

Ihr Code enthält kein 2D-Array. Und nichts, das man mit entsprechender Semantik als Eins verwenden könnte. – Olaf

+0

Wie könnte ich diese Struktur im Shared Memory speichern? – alteration

+0

Vorschlagen Sie, indem Sie Fehlerprüfcode hinzufügen, um den Rückgabewert aller Funktionen zu überprüfen. Wenn der Fehler nicht angezeigt wird, verwenden Sie einen Debugger. Und schließlich, wenn Sie es immer noch nicht erarbeiten können, posten Sie bitte ein [minimales vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) einschließlich des Eingabewertes. – kaylum

Antwort

0

In Ihrem Beispielcode, warum Sie Platz für 10 Colonna Strukturen zuweisen? Matrix hat Platz für bis zu 10 Colonna, Handhabung mehr als 10 würde eine flexible Anordnung erfordern. Mit einem flexiblen Array können Sie Platz für die entsprechende Anzahl von Colonna Strukturen zuweisen und diese auf tragbare Weise adressieren. Verwenden Sie diese Option:

typedef struct { 
    int data[COLUN_CAP]; 
} Colonna; 

typedef struct { 
    int nc; 
    key_t colK; 
    Colonna colonne[]; 
} Matrix; 

int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664); 

Futhermore, Sie auf Fehler in den shmget und shmat Systemaufrufe überprüfen sollten. shmat gibt (void *)-1 bei einem Fehler zurück. Verwenden Sie strerror(), um eine informative Fehlermeldung auszugeben.

+0

edit: Es funktionierte tatsächlich nach dem Neustart der VM. Jetzt möchte ich eine variable Anzahl von Spalten übergeben. Ich bearbeite den Hauptbeitrag, damit ich den Code schreiben kann, den ich versucht habe. – alteration

+0

@alteration: * Ich bekomme nur die ersten 2 Zeilen jeder Spalte * ... was ist der Wert von 'COLUN_CAP'?Veröffentlichen Sie auch den Code für die Druckfunktion – chqrlie

+0

Der Segmentierungsfehler Fehler Ich denke, war, weil ich den Speicher am Ende des Programms nicht freigegeben habe, so musste ich nach mehreren Läufen neu starten. Das Problem, das ich an erster Stelle hatte, war das, das ich in der Bearbeitung des Hauptposts beschrieben habe. – alteration