2012-03-29 12 views
5

Disculpe si el título es un poco confuso. Lo que estoy haciendo es crear una estructura como:Asignar valores a una clave en un puntero a un registro en C

struct record 
{ 
    int value; 
    int key; 
}; 

Luego, utilizando un typedef para llamar a un puntero a grabar "elemento" de esta manera:

typedef struct record* Item; 

Básicamente que sigo cómo era hecho en Algoriths in C por Robert Sedgewick (tercera edición) en la página 290 en caso de que alguien tenga este libro.

Lo que estoy teniendo problemas es leer un valor de la consola, luego asignarlo a la clave. Esto es lo que tengo, y los errores que estoy recibiendo:

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 

Si pudiera conseguir un empujón en la dirección correcta, yo realmente lo aprecio. Obtuve el programa para que esta asignación funcionara perfectamente cuando Item era simplemente de entrada simple, pero ahora estoy tratando de usar Item-> Key y estoy un poco perdido :) ¡Gracias!

Si alguien necesita alguna otra parte del código que no creí necesario, lo publicaré tan pronto como vea la solicitud.

Revisión: Moví mi función setKey por encima de standInput, por lo que el error de compilación desapareció. Lo que quiero decir es sin embargo un fallo segmento, así que todavía estoy asignando mal :)

+2

+1 para una pregunta bien redactada y completa que incluya una descripción de lo que ha intentado y un mensaje de error. * entonces * refrescante para ver – bernie

+0

¿Está asignando memoria para cada elemento de la matriz? – Cornstalks

Respuesta

1

El tipo de primer argumento setKey 's debe ser Item, no Item *, ya que el Item escriba ya es un puntero. Desea pasar un puntero a un registro, no un puntero a un puntero a un registro.

3

Es necesario pasar la dirección del elemento de matriz:

setKey(&A[i], x); 

El tipo de A[i] es Item y no Item * como el método setKey espera

Editar como ha señalado Wyzard Item ya es un puntero a una estructura por lo que debe cambiar su firma para setKey a tomar un Item y no un Item * y llámelo como setKey(A[i], x).

+0

Hrm, eso no fue suficiente, pero jugaré con él y veré si no puedo ponerlo en funcionamiento. No entendí el asunto del ampersand, ¡así que gracias por eso! –

+0

@ user684594: Actualicé mi respuesta un poco. Para resolver el segfault necesitarías mostrar más código (como qué código está llamando a 'standInput'). – ChrisWue

3

setKey toma el puntero a Item. A[i] no es un puntero a un Item, sino un objeto real Item.

que pasarla como un puntero hacer cualquiera:

setKey(A + i, x);

o

setKey(&A[i], x);

+0

Creo que se prefiere el segundo método; es mucho más claro lo que está pasando. –

+0

'setKey' toma un puntero a un' Item', pero * no debe *. El '->' en la implementación de 'setKey' espera desreferenciar un' Item' para obtener un 'record', no desreferenciando un' Item * 'para obtener un' Item'. – Wyzard

+0

Sí, estoy de acuerdo contigo Wyzard. Ya hice +1 en su respuesta, y solo puedo alentar a otros a hacerlo también. Esto solo solucionará el problema de compilación sobre la firma del método, aunque debería estar obteniendo otro error sobre el uso erróneo de un doble puntero, como usted señala. – Cornstalks

Cuestiones relacionadas