2012-03-29 7 views
5

Sorry, wenn der Titel ein wenig verwirrend ist. Was ich tue, ist es, eine Struktur zu schaffen, wie:Zuweisen von Werten zu einem Schlüssel in einem Zeiger auf einen Datensatz in C

struct record 
{ 
    int value; 
    int key; 
}; 

Dann ein typedef mit einem Zeiger rufen zu „Item“ wie folgt auf:

typedef struct record* Item; 

Grundsätzlich folge ich, wie es war getan in Algorithms in C von Robert Sedgewick (dritte Ausgabe) auf Seite 290 für den Fall, dass jemand dieses Buch hat.

Worauf ich Probleme habe, ist das Einlesen eines Wertes von der Konsole und dann das Zuweisen des Schlüssels. Hier ist, was ich habe, und die Fehler, die ich bekomme:

void setKey(Item *element, int x) 
{ 
    element->key = x; 
} 

void standInput(Item A[], int length) 
{ 
    int i; 
    int x; 
    for(i = 0; i < length; i++) 
    { 
     printf("Enter a value for spot %i: ", i+1); 
     scanf("%d", &x); 
     setKey(A[i], x); 
    } 
} 

gcc Item.h 
Item.h:33:6: warning: conflicting types for ‘setKey’ 
Item.h:23:3: note: previous implicit declaration of ‘setKey’ was here 

Wenn ich einen Schub in der richtigen Richtung bekommen könnte, würde ich wirklich zu schätzen. Ich habe das Programm für diesen Auftrag perfekt funktioniert, als Item nur einfache Ints war, aber jetzt versuche ich Item-> Key zu benutzen und bin ein wenig verloren :) Danke!

Wenn jemand einen anderen Teil des Codes benötigt, den ich nicht für nötig hielt, werde ich ihn posten, sobald ich die Anfrage sehe.

Revision: Ich habe meine setKey-Funktion über StandInput bewegt, so dass der Kompilierungsfehler verschwunden ist. obwohl das, was ich bin immer ein Segment Fehler, so dass ich die Zuweisung noch es falsch :)

+2

+1 für eine gut formulierte, vollständige Frage einschließlich Beschreibung von dem, was Sie versucht und Fehlermeldung. * so * erfrischend zu sehen – bernie

+0

Ordnen Sie Speicher für jedes Element im Array zu? – Cornstalks

Antwort

1

Die Art der setKey s erste Argument Item sein sollte, nicht Item *, da die Item Typ bereits ist ein Zeiger. Sie möchten einen Zeiger auf einen Datensatz übergeben, keinen Zeiger auf einen Zeiger auf einen Datensatz.

3

Sie benötigen die Adresse des Array-Elements passieren:

setKey(&A[i], x); 

Die Art der A[i] ist Item und nicht Item * als die setKey Methode erwartet

bearbeiten wie Wyzard Item bereits ein Zeiger auf eine Struktur ist darauf hingewiesen, so sollten Sie Ihre Signatur ändern für setKey einenehmenund nicht ein Item * und nennen Sie es als setKey(A[i], x).

+0

Hrm, das hat es nicht ganz geschafft, aber ich werde damit herumspielen und schauen, ob ich es nicht schaffen kann. Ich habe das kaufmännische Problem nicht verstanden, also danke dafür! –

+0

@ user684594: Ich habe meine Antwort ein wenig aktualisiert. Um den segfault zu lösen, müssten Sie mehr Code anzeigen lassen (zB welcher Code 'standInput' aufruft). – ChrisWue

3

setKey nimmt einen Zeiger auf eine Item. A[i] ist kein Zeiger auf ein Item, sondern ein tatsächliches Item Objekt.

Um es als Zeiger übergeben Sie entweder:

setKey(A + i, x);

oder

setKey(&A[i], x);

+0

Ich glaube, dass die zweite Methode bevorzugt wird; Es ist viel klarer, was vor sich geht. –

+0

'setKey' nimmt einen Zeiger auf ein' Item', aber es * sollte nicht *. Die '->' in der Implementierung von 'setKey' erwartet, dass ein' Item' deneferenziert wird, um eine 'record' zu erhalten, die nicht einen' Item * 'dereferenziert, um ein' Item' zu erhalten. – Wyzard

+0

Ja, ich stimme dir zu, Wyzard. Ich habe deine Antwort bereits beantwortet und kann andere nur ermutigen, dies auch zu tun. Dies wird nur das Kompilierungsproblem bezüglich der Methodensignatur beheben, obwohl er einen weiteren Fehler bezüglich der irrtümlichen Verwendung eines Doppelzeigers erhalten sollte, wie Sie darauf hinweisen. – Cornstalks

Verwandte Themen