2012-03-29 15 views
5

Przepraszam, jeśli tytuł jest trochę zagmatwany. Co robię jest stworzenie struktury, takie jak:Przypisywanie wartości do klucza w wskaźniku do rekordu w C

struct record 
{ 
    int value; 
    int key; 
}; 

Następnie za pomocą typedef zadzwonić wskaźnik do nagrywania „produkt” tak:

typedef struct record* Item; 

Zasadniczo Obserwuję, jak to było wykonane w Algoriths in C przez Roberta Sedgewicka (trzecie wydanie) na stronie 290 na wypadek, gdyby ktoś miał tę książkę.

Mam problem z odczytaniem wartości z konsoli, a następnie przypisaniem jej do klucza. Oto, co mam, i błędy, które dostaję:

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 

Gdybym mógł sugerować w dobrym kierunku, będę naprawdę wdzięczny. Dostałem program do tego zadania działającego idealnie, kiedy Przedmiot był po prostu prosty, ale teraz próbuję użyć Item-> Key i jestem trochę zagubiony :) Dzięki!

Jeśli ktoś potrzebuje jakiejkolwiek innej części kodu, o której nie myślałem, że to konieczne, opublikuję ją, gdy tylko zobaczę prośbę.

Rewizja: Przenieśliłem funkcję setKey powyżej standInput, więc błąd kompilacji zniknął. Co ja dostaję chociaż jest usterka odcinek, więc jestem nadal przypisując to źle :)

+2

+1 za dobrze sformułowane, pełne pytanie zawierające opis wypróbowanego i komunikat o błędzie. * więc * odświeżenie, aby zobaczyć – bernie

+0

Czy przydzielasz pamięć dla każdego elementu w tablicy? – Cornstalks

Odpowiedz

1

Typ pierwszy argument setKey „s powinna być Item nie Item *, ponieważ Item wpisz już jest wskaźnikiem w postaci. Chcesz przekazać wskaźnik do rekordu, a nie wskaźnik do wskaźnika do rekordu.

3

trzeba przekazać adres elementu tablicy:

setKey(&A[i], x); 

Rodzaj A[i] jest Item i nie Item * jako metoda setKey spodziewa

Edit jak podkreślił Wyzard Item jest już wskaźnikiem do struktury należy więc zmienić swój podpis na setKey wziąć Item, a nie Item * i nazywają to jako setKey(A[i], x).

+0

Hrm, to się nie udało, ale będę się z nim bawił i sprawdzę, czy nie mogę go uruchomić. Nie złapałem problemu z ampersandem, więc dziękuję za to! –

+0

@ user684594: Trochę zaktualizowałem swoją odpowiedź. Aby rozwiązać błąd segfault, musisz pokazać więcej kodu (np. Który kod wywołuje 'standInput'). – ChrisWue

3

setKey przyjmuje wskaźnik do Item. A[i] nie jest wskaźnikiem do obiektu Item, ale rzeczywistego obiektu Item.

Aby przekazać ją jako wskaźnik należy albo:

setKey(A + i, x);

lub

setKey(&A[i], x);

+0

Uważam, że druga metoda jest preferowana; o wiele jaśniej, co się dzieje. –

+0

'setKey' pobiera wskaźnik do' Item', ale * nie powinien *. '->' w implementacji 'setKey' oczekuje dereferencji' Item', aby uzyskać 'record', a nie dereferencję' Item * ', aby uzyskać' Item'. – Wyzard

+0

Tak, zgadzam się z tobą Wyzard. Otrzymałem już +1 od Twojej odpowiedzi i tylko zachęcam innych do zrobienia tego. Naprawi to tylko problem kompilacji związany z sygnaturą metody, chociaż powinien on otrzymywać inny błąd błędnie używając podwójnego wskaźnika, jak zauważyłeś. – Cornstalks

Powiązane problemy