BandaAncha.eu

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

necesito ayuda urgente!!!! vectores dinamicos

Djimn

wenas!!!!! tengo ke hacer un trabajo para poder aprobarque consiste en hacer un programa para un administrar los socios de un video club ke muestre un menu con las opciones de insertar socio, listar por numero de cuenta, y buscar socio por nombre. tengo echo casi todo pero lo de los puntero y los vectores dinamicos no se me dan muy bien, la funcion de insertar me funciona bien pero cuando llamo a la funcion "visualizar" en la funcion "listar por numero", me da un ErrorRRR!!!!!

no se ke mas hacer!!!! si alguien pudiese ayudarme se lo agradeceria mucho por ke sino voy a suspender.aqui os dejo todo el codigo completo

muchisimas gracias

#include
#include
#include
#include
#define CADENA 30
#define MAX_SOCIOS 250

struct tsocios // tamaño variable
{ char *nombre;
char *apellidos;
int num_socio;
long fecha_ingreso;
long telefono;
};
struct tsocios *vsocios;

void Visualizar ( struct tsocios );
void IntroducirSocios ( struct tsocios * );
void ListarXNumero ( struct tsocios * );
void BuscarSocio ( struct tsocios * );
int Menu( void );

void main()
{ int opcion;

do{
opcion = Menu();
switch( opcion ){
case 1: IntroducirSocios ( vsocios );
break;
case 2: ListarXNumero( vsocios );
break;
case 3: BuscarSocio( vsocios );
break;
case 0: printf( "\nADIOS!!");
getchar();
break;
default: printf( "\n\nOpcion Incorrecta\n\n " );
break;
}getchar();
} while( opcion != 0 );
}
///////////////FUNCIONES////////////////
int Menu( void )
{
int opcion;
clrscr();
printf( "\n" );
printf( " CLUB DE SOCIOS\n\n\n" );
printf( "\t\t 1.INTRODUCIR SOCIOS.\n" );
printf( "\t\t 2.LISTAR POR NUMERO DE SOCIO\n" );
printf( "\t\t 3.BUSCAR SOCIO POR NOMBRE\n" );
printf( "\t\t 0.SALIR\n" );
printf( "\n\t\t\tElija una opcion: " );
scanf( "%d", &opcion );
fflush( stdin );
clrscr();
return opcion;
}
/////VISUALIZAR///// en esta es donde me el erroRR
void Visualizar( struct tsocios vsocios )
{
printf("\n Nombre: %s", vsocios.nombre );
printf("\n Apellidos: %s", vsocios.apellidos );
printf("\n Numero de socio: %d", vsocios.num_socio );
printf("\n Fecha de ingreso: %ld", vsocios.fecha_ingreso );
printf("\n Telefono: %ld", vsocios.telefono );
}
//////INTRODUCIR SOCIOS //////
void IntroducirSocios ( struct tsocios *vsocios ){
int nsocios, tam, i;
char nombre[ CADENA ];
char apellidos [ CADENA ];

printf("\n Introduzca el numero de socios a procesar: ");
scanf ("%d", &nsocios ); fflush( stdin );
vsocios =( struct tsocios *) malloc( nsocios * sizeof(struct tsocios));

// UN IF PARA KE NO SE PUEDAN INTRODUCIR MAS DE 250 SOCIOS
if ( nsocios <=MAX_SOCIOS ){

for ( i = 1; i <= nsocios; i++ )
{ printf("\n====================================\n");
printf("Nombre: \t\t");
gets ( nombre );
tam = strlen( nombre ) + 1; // para almacenar '\0'
vsocios[i].nombre = ( char *)malloc( tam * sizeof( char ));

if( tam == NULL )
printf("\n NO hay memoria suficiente ");

strcpy( vsocios[i].nombre, nombre );

printf("Apellidos: \t\t");
gets ( apellidos );
tam = strlen( apellidos ) + 1; // para almacenar '\0'
vsocios[i].apellidos = ( char *)malloc( tam * sizeof( char ));

if( tam == NULL )
printf("\n NO hay memoria suficiente ");

strcpy( vsocios[i].apellidos, apellidos );

vsocios[i].num_socio=i;
//ultimo=nsocios;

printf("NUMERO DE SOCIO ASIGNADO: %d \t\t",vsocios[i].num_socio );

printf("\nFECHA DE INGRESO \t\t");
scanf( "%l", &vsocios[i].fecha_ingreso ); fflush( stdin );

printf("TELEFONO\t\t");
scanf( "%l", &vsocios[i].telefono); fflush( stdin );
}
}
else
printf("\nERROR!!!, maximo 250 socios." );
}
/////LISTAR POR NUMERO DE SOCIO /////////
void ListarXNumero ( struct tsocios *vsocios ){
int i;

for( i=1; i<= MAX_SOCIOS; i++ ){
printf("\n\t\tLISTAR POR NUMERO DE SOCIO ");
Visualizar( vsocios[i] );
}
}
/////BUSCAR SOCIO POR NOMBRE ////////
void BuscarSocio ( struct tsocios *vsocios ){
int i;
char nombre[CADENA];
printf("\n NOMBRE DEL SOCIO A BUSCAR: ");
scanf("%d", &nombre );fflush( stdin );

for( i=1; i <= MAX_SOCIOS; i++){

if( strcmp( vsocios[i].nombre, nombre )==0)
Visualizar( vsocios[ i ] );
else
printf("\nNO EXISTE NINGUN SOCIO CON ESE NOMBRE ");
}
}

Rubik2k

Aprender a programar conlleva el aprender de tus errores y por ende, saber encontrarlos. Ya sé que no es la respuesta que esperabas, pero tampoco vamos a hacer tus deberes. ¿No crees?

¿Usas el debugger para mirar línea a línea dónde falla?

Saludos

🗨️ 3
Djimn

se ke se aprende de los errores pero este en especial no lo veo, porque no entiendo porque me compila y no me da ningun error ni ningun warning, y despues cuando llega a la funcion listar, en el bucle for que llama a la funcion visualizar salta. voy a probar con el debugger del borland C++, pero nose muy bien como funciona.

gracias

saludos

🗨️ 2
Rubik2k

Saber utilizar el debugger es esencial para todo programador, aunque lo principal es una buena estructuración del programa. Ya sé que con los profesores que hay hoy en día, esto es un milagro. Yo tuve la suerte de tener a un fantástico profesor, que antes de enserñarnos a programar nos eseñó las estructuras básicas (y no tan básicas).

Sólo piensa una cosa: Si ya te haces un lío con menos de un centenar de líneas. ¿Te imaginas el lío con 10.000?

Si puedo, te miro el código a fondo, pero estoy algo liado y no prometo nada.

Saludos y suerte

🗨️ 1
Djimn

siento tardar en contestar pero no tenia acceso a internet.

si lio no me hago pero no entiendo porque me salta y me gustaria saber porque salta y donde esta el error porque se ke no es un error grave pero como no funciona a la perfeccion, me toca irme a junio con todo C. y me gustaria acabarlo ya. Porque ando desesperado

gracias igualmente y si me lo pudieras mirar me harias un gran favor.

muchisimas gracias

Blue77

Creo que lo que intentas hacer es un vector de structs, y a la hora de visualizarlo deberías indicar q lea el struct de una determinada iteración.

Podrías crear una variable global a modo de contador para ir añadiendo una unidad cada vez que se inserte un nuevo usuario, o bien, ir pasando el contador a modo de parámetro entre las funciones.

Y... ¿es posible que te falte un asterisco?

Pusiste:

void Visualizar( struct tsocios vsocios )

No recuerdo bien C, pero en la función de abajo usaste el *

( struct tsocios *vsocios )

🗨️ 3
Djimn

muchas gracias, mira,la cambie a void visualizar (struct socios *vsocios) y sigue igual?? tendria ke hacer el bucle for dentro de esta funcion o eso da igual???

gracias un saludo

void Visualizar( struct tsocios *vsocios )

{ int i=0;

printf("\n Nombre: %s", vsocios[i].nombre );

printf("\n Apellidos: %s", vsocios[i].apellidos );

printf("\n Numero de socio: %d", vsocios[i].num_socio );

printf("\n Fecha de ingreso: %ld", vsocios[i].fecha_ingreso );

printf("\n Telefono: %ld", vsocios[i].telefono );

}

🗨️ 2
BocaDePez
BocaDePez

si tienes *vsocios en la cabecera, tendrás que acceder con * a la variable, ¿no crees?

BocaDePez
BocaDePez

¿cómo sabes en que parte del vector acaban los socios?

djnacho
1

Creo haber visto el error, aunque no estoy muy seguro. Mira bien, donde se halla la función Visualizar. Mira la linea donde pones el parámetro de entrada de la función. ¿No ves algo raro ahí? ;)
Vale.... te doy una pista. Trabajas con punteros que apuntan a una estructura. En la declaración de la función, trabajas con una estructura estática, y no digo más ;)

Un saludo :)

🗨️ 4
Djimn

pues he probado a cambiar la estructura estatica por la dinamica, quedando la funcion visualizar asi:

void Visualizar( struct tsocios *vsocios )

{ int i=0;

printf("\n Nombre: %s", vsocios[i].nombre );

printf("\n Apellidos: %s", vsocios[i].apellidos );

printf("\n Numero de socio: %d", vsocios[i].num_socio );

printf("\n Fecha de ingreso: %ld", vsocios[i].fecha_ingreso );

printf("\n Telefono: %ld", vsocios[i].telefono );

}

pero sigue dando el mismo error, y siempre se detiene en el primer printf.

para imprimir hay ke poner el [i]. o la ->????

muchisimas gracias pero sigo sin verlo

un saludo

🗨️ 3
djnacho

Se supone, que cuando estás accediendo a una estructura en C, y se trata de un puntero a una estructura, el . no sirve, deberías poner -> en su lugar, ya que el . es para estructuras estáticas, y -> es para punteros a estructuras.

Un saludo :)

🗨️ 2
Djimn

tbm lo he probado y nada, no abria una manera mas facil de de hacer la funcion listar para intentar ke no se produzca este error???

gracias

un saludo :)

🗨️ 1
BocaDePez
BocaDePez
khanwolf

printf("\n Fecha de ingreso: %ld", vsocios.fecha_ingreso );
printf("\n Telefono: %ld", vsocios.telefono );

mira si este este es el errores %d o es un fallo tuyo al copiarlo has puesto %ld

muchas veces al escribirlo no se ve

un abrazo

🗨️ 8
Djimn

muchas gracias por responder pero creo ke falla en el primer printf: nose xq , ke le puede faltar o sobrar????

void Visualizar( struct tsocios *vsocios )

{ int i=0;

printf("\n Nombre: %s", vsocios[i].nombre );

printf("\n Apellidos: %s", vsocios[i].apellidos );

...

gracias un saludo

🗨️ 7
Blue77

Inténtalo con puts();

🗨️ 6
Djimn

nada tampoco. mira este es la pantalla del error:

gracias igualmente

Imagen original en http://www.imagexhost.org/image/332575-Dibujo.jpeg
🗨️ 5
Blue77
🗨️ 3
Djimn
🗨️ 2
Blue77
🗨️ 1
Djimn
BocaDePez
BocaDePez