2012-03-29 9 views
5

Scusate se il titolo è un po 'confuso. Quello che sto facendo è la creazione di una struttura come:Assegnazione di valori a una chiave in un puntatore a un record in C

struct record 
{ 
    int value; 
    int key; 
}; 

Quindi, utilizzando un typedef per chiamare un puntatore per registrare "Item" come questo:

typedef struct record* Item; 

Fondamentalmente sto seguendo come era fatto in Algoriths in C di Robert Sedgewick (terza edizione) a pagina 290 nel caso in cui qualcuno capiti di avere questo libro.

Quello che sto avendo problemi è la lettura di un valore dalla console, quindi l'assegnazione alla chiave. Ecco quello che ho, e gli errori che sto ricevendo:

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 

Se potessi ottenere una piccola spinta nella giusta direzione, sarei davvero grato. Ho capito che il programma per questo compito funzionava perfettamente quando Item era solo semplice, ma ora sto cercando di usare Item-> Key e sono un po 'perso :) Grazie!

Se qualcuno ha bisogno di un'altra parte del codice che non ritenevo necessaria, la posterò non appena visualizzerò la richiesta.

Revisione: ho spostato la funzione setKey sopra standInput, quindi l'errore di compilazione è scomparso. Quello che sto ottenendo anche se è un difetto segmento, quindi sto ancora l'assegnazione di sbagliato :)

+2

+1 per una domanda completa e completa, che include la descrizione di ciò che hai provato e il messaggio di errore. * so * rinfrescante per vedere – bernie

+0

Stai allocando memoria per ogni articolo nell'array? – Cornstalks

risposta

1

Il tipo di primo argomento setKey s' dovrebbe essere Item, non Item *, poiché la Item digitare già è un puntatore. Si desidera passare un puntatore a un record, non un puntatore a un puntatore a un record.

3

È necessario passare l'indirizzo del elemento di matrice:

setKey(&A[i], x); 

Il tipo di A[i] è Item e non Item * come il metodo setKey aspetta

Modifica come sottolineato da Wyzard Item è già un puntatore ad una struct così si dovrebbe cambiare la vostra firma per setKey di prendere un Item e non uno Item * e chiamarlo come setKey(A[i], x).

+0

Hrm, non è andata proprio così, ma ci giocherò e vedrò se non riesco a farla funzionare. Non ho preso il problema della e commerciale, quindi grazie per questo! –

+0

@ user684594: ho aggiornato la mia risposta un po '. Per risolvere il segfault è necessario mostrare più codice (come il codice che sta chiamando 'standInput'). – ChrisWue

3

setKey prende un puntatore a Item. A[i] non è un puntatore a Item, ma un oggetto effettivo Item.

passarla come un puntatore do uno:

setKey(A + i, x);

o

setKey(&A[i], x);

+0

Credo che il secondo metodo sia preferito; è molto più chiaro cosa sta succedendo. –

+0

'setKey' prende un puntatore a un 'elemento', ma * non dovrebbe *. Il '->' nell'implementazione di 'setKey' prevede di dereferenziare un' Item' per ottenere un 'record', non dereferenziando un' Item * 'per ottenere un' Item'. – Wyzard

+0

Sì, sono d'accordo con te Wyzard. Ho già fatto +1 sulla tua risposta e posso solo incoraggiare gli altri a farlo. Questo risolverà solo il problema di compilazione relativo alla firma del metodo, anche se dovrebbe ricevere un altro errore sull'erronea utilizzazione di un doppio puntatore, come si fa notare. – Cornstalks

Problemi correlati