Duda con estructuras C

Iniciado por David8, 30 Abril 2014, 13:24 PM

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

David8

Si por ejemplo tengo la siguiente estructura de datos:


struct nombre{
   // código
};

struct nombre array[N];   // siendo N un entero cualquiera


Esto lo entiendo; creo un array que contiene N estructuras.

Ahora lo que quiero es hacer lo equivalente a lo anterior pero con un puntero.
Yo he intentado esto, pero seguro que es erróneo:


struct nombre{
   // código
};

struct nombre *puntero;
puntero = (struct nombre*)malloc(N * sizeof(nombre));


Espero que me puedan ayudar. Un saludo.

eferion

"nombre" como tal no es nada... el identificador real es "struct nombre"

puntero = (struct nombre*)malloc(N * sizeof(struct nombre));

rir3760

Solo agregar que en C la conversión explicita no es necesaria y si utilizas "sizeof *puntero" en la llamada a malloc:
puntero = malloc(N * sizeof *puntero);
Evitas indicar el tipo apuntado (lo que reduce errores lógicos).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

David8

#3
Cita de: rir3760 en 30 Abril 2014, 16:45 PM
Solo agregar que en C la conversión explicita no es necesaria y si utilizas "sizeof *puntero" en la llamada a malloc:
puntero = malloc(N * sizeof *puntero);
Evitas indicar el tipo apuntado (lo que reduce errores lógicos).

Un saludo

Gracias por el detalle.

Pero en este fragmento de programa:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef char* String;

struct jugador{
String nombreJugador;
int nFichas;   // número de fichas que tiene el jugador
int posicion;   // NO ES REALMENTE UNA POSICIÓN SINO EL ORDEN EN QUE VA A JUGAR
String cara;
String palo;
};


struct jugador *Jugador;

Jugador = malloc(5 * sizeof *Jugador);   // definimos 5 jugadores

int main(void){

// codigo

}


Me da error en
struct jugador *Jugador;

Jugador = malloc(5 * sizeof *Jugador);   // definimos 5 jugadores


Y no sé cual puede ser el fallo.

Un saludo




Cita de: rir3760 en 30 Abril 2014, 16:45 PM
Solo agregar que en C la conversión explicita no es necesaria y si utilizas "sizeof *puntero" en la llamada a malloc:
puntero = malloc(N * sizeof *puntero);
Evitas indicar el tipo apuntado (lo que reduce errores lógicos).

Un saludo

Perdona, ya vi que no funcionaba porque estaba definido como global.
Pero no sé porque.

Un saludo

rir3760

Porque cuando declaras una variable fuera de toda función (en tu caso "Jugador") y quieres darle un valor inicial este debe ser uno constante como 123 o "alguna cadena" (no puedes utilizar llamadas a función).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

David8

#5
Cita de: rir3760 en 30 Abril 2014, 17:52 PM
Porque cuando declaras una variable fuera de toda función (en tu caso "Jugador") y quieres darle un valor inicial este debe ser uno constante como 123 o "alguna cadena" (no puedes utilizar llamadas a función).

Un saludo

Esta duda la tengo porque estoy haciendo un programa que simule el juego del poker.
Y relacionado con esto tengo lo siguiente:


typedef char* String;

struct jugador{
String nombreJugador;
int nFichas;  
int posicion;  
String *cara;
String *palo;
};

// código

int main(void)
{
// código
Jugador = malloc(5 * sizeof(*Jugador));
//código
reservaMemoriaManos();
//código

return EXIT_SUCCESS;
}

void reservaMemoriaManos()
{
int i, j;

for(i = 0; i<5; i++){
(Jugador + i) -> cara = (char **)malloc(2 * sizeof(char *));
(Jugador + i) -> palo = (char **)malloc(2 * sizeof(char *));

for(j = 0; j<2; j++){
(Jugador + i) -> cara[j] = (char *)malloc(7 * sizeof(char));
(Jugador + i) -> palo[j] = (char *)malloc(10 * sizeof(char));
}
}

return;
}


Y en esta última función me parece que falla el programa. Pero no sé que es.
Lo que intento hacer es que cada uno de los 5 jugadores declarados con

Jugador = malloc(5 * sizeof(*Jugador));
tengan 2 cartas, por los que deberán tener 2 palos y 2 figuras.

Lo escribo aquí para no abrir un nuevo tema, ya que está relacionado con lo anterior.

Un saludo

rir3760

Falta entre otras cosas las directivas de inclusión y la declaración de la variable "Jugador", por favor publica el código fuente completo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

David8

Cita de: rir3760 en  2 Mayo 2014, 23:12 PM
Falta entre otras cosas las directivas de inclusión y la declaración de la variable "Jugador", por favor publica el código fuente completo.

Un saludo

Ya lo solucioné. Es que tenía un for que en un caso particular del índice cambiaba su valor a 0 y esto hacía un bucle infinito.

Muchas gracias por la ayuda, un saludo.