2012-04-06 5 views
0
typedef struct _ut_slot { 
    ucontext_t uc; 
    .... 
}*ut_slot; 

static ut_slot* table; //array of the structs 

void foo (int tab_size){ 
    table = malloc (tab_size *(sizeof (ut_slot))); // memory allocation for array of structs 
    for(i = 0 ; i < tab_size ; i++ ){ 
     getcontext(&table[i].uc); <--- ?????? 
     } 
} 

Ich erhalte Fehler in "getcontext" Zeichenfolge. Wie kann ich einen Verweis auf ein Element des Arrays schreiben? Und wie kann ich mit "getcontext" das "uc" -Feld jedes Array-Elements initialisieren?Getcontext() gilt für die Elemente des Arrays mit Strukturen

Antwort

0

Sie haben eine mangelnde Übereinstimmung mit der Definition von ut_slot und den Gebrauch davon:

typedef struct _ut_slot { 
    ucontext_t uc; 
    .... 
}*ut_slot; //<--- pointer to struct 

Sie sagen, dass ut_slot ein Zeiger auf eine Struktur ist, dann sind Sie

statische ut_slot * Tabelle deklarieren ;

so haben Sie einen Zeiger auf den Zeiger zu Struktur.

Sie wollen wahrscheinlich ut_slot, um nur eine Struktur zu sein, oder table, um ein Zeiger auf Struktur sein.


Um genauer zu sein: table ein Zeiger-zu-Zeiger-to-Struktur ist, so ist table[i] ein Zeiger-to-struct, und Sie versuchen, ein struct Mitglied einer Nicht-Struktur für den Zugriff mit table[i].ut , was zu einem Kompilierungsfehler führt.


Versuchen Sie Folgendes:

typedef struct _ut_slot { 
    ucontext_t uc; 
    .... 
} ut_slot; //removed "*" 

static ut_slot *table; 

der Rest des Codes in Ordnung ist, und muss nicht geändert werden.

+0

Ich bearbeite meinen Kommentar. Wie kann ich richtig auf das UC-Feld zugreifen? – TatianaCooper

+0

Ich verstehe, dass Sie erklärt haben. Es funktionierte jetzt: getcontext (& (* table [i]). Uc)); – TatianaCooper

+0

@TatianaCooper Warten Sie, Ihr Malloc-Aufruf ist falsch, da sizeof (ut_slot) die Größe eines Zeigers (nur etwa 4 Byte) statt der Größe der Struktur hat - verwenden Sie die Lösung, die ich bearbeitet habe – Anthales

0

Das Handbuch für getContext stellt einen Prototyp wie folgt her:

int getcontext(ucontext_t *ucp); 

Sind Sie sicher, dass Sie es richtig Argument sind vorbei? ;)

Wenn Sie wirklich ein Array von Strukturen wollen, müssen Sie etwas Speicher für jedes beiseite legen. Beachten Sie, wie -> der Zeiger den Zeiger und & die Adresse der Member-Struktur erhält. Es ist verwirrend und schaut zurück.

Sorry, ich programmiere ohne geschweifte Klammern und Interpunktion. Anker C fügt sie automatisch hinzu.

#include <stdio.h> 
#include <stdlib.h> 
#include <ucontext.h> 
typedef struct _ut_slot 
    ucontext_t uc 
    ... 
*ut_slot 
static ut_slot *table 
int main void 
    static ucontext_t uc 
    table = malloc 1 * sizeof ut_slot 
    table[0] = malloc sizeof *ut_slot 
    getcontext &table[0]->uc 
    free table[0] 
    free table 
    return 0 
+0

Das ist genau das Problem. Ich möchte das uns-Feld des Array-Elements übergeben und ich weiß nicht, wie man es schreibt. – TatianaCooper

+0

danke! Ich hatte den Fehler "Segmentierungsfehler", bevor ich mich geändert habe, wie Sie gesagt haben. – TatianaCooper

Verwandte Themen