[C] - Duda estructuras

Iniciado por h0oke, 20 Mayo 2010, 23:32 PM

0 Miembros y 1 Visitante están viendo este tema.

h0oke

¿Cuál es el método utilizado en C para el ingreso de una estructura de datos? Me refiero a que si se deben leer las variables de la estructura por apartey luego asignarlas a los miembros de la esctructura... o bien, si se deben asignar directamente a cada miembro de la esctructura luego de un scanf().

nicolasblues86

#1
no entiendo bien la pregunta pero bueno te pongo un ejemplo de uso de estrocturas en c que tenía por ahí tirado


#include <stdio.h>


struct Ficha {

char Nombre[80];
int  Num_unidades;
int Precio_unidad;
int Estado;   // 0 = moroso; 1 = atrasado; 2 = pagado
};


typedef struct Ficha Fichas;


int main(int argc, char** argv)
{
Fichas Cliente[100];
int i;
char nombre[80];

for (i = 0; i < 99; i++)
{
if (nombre == Cliente[i].Nombre)
{
printf ("%s", Cliente[i].Nombre);
printf ("%i", Cliente[i].Num_unidades);
printf ("%i", Cliente[i].Precio_unidad);
switch  (Cliente[i].Estado)
{
case 0 : printf ("Moroso");
 break;
case 1 : printf ("Atrasado");
 break;
case 2 : printf ("Pagado");
 break;
};
   }
}


return 0;
}













Saludos!!
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

h0oke

Me refiero a las asignaciones:


//Suponemos la esctructura
struct Ficha {

char Nombre[80];
int  Num_unidades;
int Precio_unidad;
int Estado;   // 0 = moroso; 1 = atrasado; 2 = pagado
};
...
//Es esta la forma de asignacion?
int num, int pre;
Ficha F;
scanf("%d",&num);
scanf("%d",&pre);
F.Num_Unidades = num;
F.Precio_Unidad = pre;
...
/* O lo correcto seria que en el scanf haga una asignación directa?*/

nicolasblues86

seee.. lo podes hacer tanto así como directamente en el scanf




scanf ("%d" &f.numero);



o si nosotros pasamos por referencia el struct se haria



void ejemplo ( struct nom_del_struct *p )

scanf ("%d" &p->numero);



osea se utilaza  "->" en vez de de "."

saludos!!
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

.:BlackCoder:.

#4
Weno como no son clases... ni POO lo puedes hacer directamente... pero en la POO no es recomendable... Tu sabes para que no aya acceso directo con los miembros privados...

Saludos...

EDITO: aya xD!! va con 'h'... sorry
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




h0oke

Exacto a eso último me refería.

OFFTOPIC : Para que no hallan creo que es lo correcto  :xD

@synthesize

Para acceder o asignar a una variable normal dentro de una estructura:

estructura.elemento;


Para acceder o asignar a un puntero, dentro de una estructura:

estructura->puntero;


También te recomiendo declarar las estructuras como typedef:


typedef struct Nodo
{
    elementos...
};

h0oke

Gracias por la aclaración, pero no me refería a eso.

h0oke

#8
Miren el siguiente code:

Código (c,42) [Seleccionar]
#include <stdlib.h>
#include <string.h>

#define MAX_LIMIT 50

struct Persona{
 char *nom, *dom, *tel;
 int edad;  
};

typedef struct Persona stPersona;

void _ingreso(stPersona *);
void _imprimir(stPersona *);

int main()
{
 stPersona *User;
 //Aqui creo que deberia reservar el espacio para User
 _ingreso(User);
 _imprimir(User);
 
 return 0;
}

void _ingreso(stPersona *stP)
{
 char *nom;
 nom = (char *)(malloc((MAX_LIMIT)*sizeof(char)));
 stP = (stPersona *)(malloc(sizeof(stPersona)));
 stP->nom = (char *)(malloc((MAX_LIMIT)*sizeof(char)));
 fgets(nom,MAX_LIMIT,stdin);
 strcpy(stP->nom,nom);
}

void _imprimir(stPersona *stP)
{
 puts("------SALIDA------");
 puts(stP->nom);
}


¿Por qué se produce un error de segmentación en la salida?

EDITADO : Si reservo espacio para User, y luego utilizo printf("%s") la salida es (null).

Littlehorse

Es que reservas memoria utilizando el puntero stP pero dicho puntero deja de existir cuando termina el contexto de la función. User no apunta al contenido adecuado cuando se lo pasas a _imprimir y ademas cuando sales de _ingresar pierdes la referencia para liberar la memoria que reservaste.

Saludos.

PD: Necesitas incluir stdio.h para stdin.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.