Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Oscaro55443 en 17 Marzo 2019, 06:57 am



Título: Alguien me puede ayudar, no funciona mi asignación dinámica para arreglos
Publicado por: Oscaro55443 en 17 Marzo 2019, 06:57 am
main.c
#include"menu.h"
#include<locale.h>
#include<stdlib.h>
#include<string.h>

int main() {
   //setlocale(LC_CTYPE,"Spanish");
   
    int *contadorindice;
    int opcion;
    int bfolio;
    Paciente *pacientes;
   //Asignación memoria dinámica
   if(pacientes==NULL)
   {
   printf("memoria de espacio no asginada");
   }
   else{
   pacientes=(Paciente *)malloc(MAX_PA*sizeof(Paciente));
   pacientes[*contadorindice].nombrepa->apellidopapaciente=(char *)malloc(MAX_TEXTO*sizeof(char));
   pacientes[*contadorindice].nombrepa->nombrepaciente=(char *)malloc(MAX_TEXTO*sizeof(char));
   pacientes[*contadorindice].nombrepa->apellidomapaciente=(char*)malloc(MAX_TEXTO*sizeof(char));
   pacientes[*contadorindice].estatus->motivo=(char *)malloc(MAX_MOTIVO*sizeof(char));
   pacientes[*contadorindice].genero=(char*)malloc(MAX_TEXTO*sizeof(char));
   
   do {
   
       printf("Ingrese una opcion\n\n");
        printf("1)Registrar paciente\n2)Listar pacientes\n3)Busqueda de paciente por clave\n4)Borrar paciente\n5)Actualizar datos\n6)Triage\n7)Salir\nOpcion:");
        scanf("%i",&opcion);
        system("cls");
        switch (opcion) {
            fflush(stdin);
            case 1: {
               capturarPaciente(contadorindice,pacientes);
                  printf("indice: %i",*contadorindice);
               system("pause");
              system("cls");
               break;
            }
               
            case 2: {
                fflush(stdin);
                listarPaciente(contadorindice, pacientes);
                system("pause");
              system("cls");
                }
                break;
           case 3:{
                 printf("\nIngrese el folio del paciente que desea buscar: ");
               scanf("%i",&bfolio);
               busquedaPacientefo(bfolio,pacientes);
               system("pause");
              system("cls");
               }
               break; 
           case 6:{
              char archivotriage[100]="triage.txt",linea[1000];
              FILE *archivo;
              archivo=fopen(archivotriage,"r");
              while(!feof(archivo)){
                 printf("%s",fgets(linea,999,archivo));
              }
              system("pause");
              system("cls");
              break;
           }
           case 5:{
              printf("\nIngrese el folio del paciente que desea actualizar: ");
               scanf("%i",&bfolio);
               //MenuactualizarPaciente(*paciente, bfolio);
              break;
           }
           case 4:{
              printf("\nIngrese el folio del paciente que desea borrar: ");
              scanf("%i",&bfolio);
              borrarPaciente(bfolio,contadorindice,pacientes);   
              break;
           }
           case 7:{
              printf("Hasta la proxima\n");
              break;
           }
           
    }
   }while (opcion != 7);
   
      free(pacientes->genero);
      free(pacientes[*contadorindice].estatus->motivo);
      free(pacientes[*contadorindice].nombrepa->apellidomapaciente);
      free(pacientes[*contadorindice].nombrepa->nombrepaciente);
      free(pacientes[*contadorindice].nombrepa->apellidopapaciente);
      free (pacientes);
   
   contadorindice=NULL;
   pacientes=NULL;

   return 0;
   }
}
 
paciente.h
#ifndef paciente_h
#define paciente_h
#define MAX_TEXTO 30
#define MAX_PA 5
#define MAX_MOTIVO 300
//Variables

//prototipos
typedef struct {
   int mes;
    int dia;
    int ano;
}Fecha;
typedef struct{
   int horai;
   int minutosi;
}Hora;

typedef struct {
   char *nombrepaciente;
   char *apellidopapaciente;
   char *apellidomapaciente;
}Nombrepa;

typedef struct{
   int peso;
   char *motivo;
}Estatus;

typedef struct {
    int edad;
    char *genero;
    int folio;
    int contadorindice;
    Estatus *estatus;
    Nombrepa *nombrepa;
    Fecha fecha;
    Hora hora;
   
} Paciente;
void capturarPaciente (int *contadorindice,Paciente *paciente);
void listarPaciente (int *contadorindice,Paciente *paciente);
void busquedaPacientefo(int b,Paciente *paciente);
void MenuactualizarPaciente(Paciente paciente,int b);
void borrarPaciente(int b,int *contadorindice,Paciente *paciente);
//void actualizarPacienteInt(int *b,Paciente *paciente);
//void actualizarPacienteChar();


#endif /* paciente_h */

paciente.c
#include <stdio.h>
#include "paciente.h"
#include<string.h>
#include<stdlib.h>

void capturarPaciente (int *contadorindice,Paciente *paciente){
   
    printf ("Folio: \n");
    scanf ("%i",&paciente[*contadorindice].folio);
    printf ("Nombre: \n");
    scanf ("%s", paciente[*contadorindice].nombrepa->nombrepaciente);
    printf ("Apellido paterno: \n");
    scanf ("%s", paciente[*contadorindice].nombrepa->apellidopapaciente);
    printf ("Apellido materno: \n");
    scanf ("%s", paciente[*contadorindice].nombrepa->apellidomapaciente);
    printf("Genero: \n");
    scanf("%s",paciente[*contadorindice].genero);
    printf ("Edad: \n");
    scanf ("%i",&paciente[*contadorindice].edad);
    printf ("Dia de ingreso: \n");
    scanf ("%i", &paciente[*contadorindice].fecha.dia);
    printf ("Mes de ingreso: \n");
    scanf ("%i", &paciente[*contadorindice].fecha.mes);
   printf ("Año de ingreso: \n");
    scanf ("%i", &paciente[*contadorindice].fecha.ano);
    printf ("Hora de ingreso: \n");
    scanf ("%i", &paciente[*contadorindice].hora.horai);
   printf ("Minutos: \n");
    scanf ("%i", &paciente[*contadorindice].hora.minutosi);
    printf("Breve explicacion del motivo de la visita del paciente\n");
    fflush(stdin);
    gets(paciente[*contadorindice].estatus->motivo);
       printf("indice: %i",*contadorindice);
    (*contadorindice)++;
       printf("indice: %i",*contadorindice);
}
void listarPaciente (int *contadorindice,Paciente *paciente){
    int i;
    for (i=0;i<*contadorindice;i++){
    printf ("Folio: %i \nNombre del paciente: %s %s %s\nGenero: %s\nEdad: %i\nDia de ingreso: %i/%i/%i \nHora de ingreso: %i:%i\n\n",
            paciente->folio, paciente->nombrepa->nombrepaciente, paciente->nombrepa->apellidopapaciente ,paciente->nombrepa->apellidomapaciente
         ,paciente->genero,paciente->edad,paciente->fecha.dia,paciente->fecha.mes,paciente->fecha.ano,paciente->hora.horai,paciente->hora.minutosi );
            paciente++;
            }//para arreglo de pacientes

}

void busquedaPacientefo(int b,Paciente *paciente){
   int i;

   for(i=0;i<MAX_PA+1;i++,paciente++){
      if(b==paciente->folio){
         printf ("Folio: %i \nNombre del paciente: %s %s %s\nGenero: %s\nEdad: %i\nDia de ingreso: %i/%i/%i \nHora de ingreso: %i:%i\nMotivo por el que ingresó:\n %s\n",
            paciente->folio, paciente->nombrepa->nombrepaciente, paciente->nombrepa->apellidopapaciente ,paciente->nombrepa->apellidomapaciente
         ,paciente->genero,paciente->edad,paciente->fecha.dia,paciente->fecha.mes,paciente->fecha.ano,paciente->hora.horai,paciente->hora.minutosi,paciente->estatus->motivo );
         
       }
   }
   printf("\nEste paciente no se encuentra en la sala de urgencias\n");
}
void MenuactualizarPaciente(Paciente *paciente,int b){
   int i,opcionact;
   int nuevodatoint;
   char nuevodatochar[MAX_TEXTO];
   
   printf("\n¿Que dato desea modificar?");
   printf("\n1)Edad");
   printf("\n2)Nombre");
   printf("\n3)Apellido Paterno");
   printf("\n4)Apellido Materno");
   printf("\n5)Genero\n");
   scanf("%i",&opcionact);
   system("cls");
   switch(opcionact){
      case 1:{
         printf("\nIngrese el nuevo dato\n");
         scanf("%i",&nuevodatoint);
         for(i=0;i<MAX_PA+1;i++,paciente++){
            if(b==paciente->folio){
               paciente.edad=nuevodatoint;
            }
         system("cls");
         }
         break;
      }
      case 2:{
         printf("\nIngrese el nuevo dato\n");
         scanf("%s",nuevodatochar);
         for(i=0;i<MAX_PA+1;i++,paciente++){
            if(b==paciente->folio){
               strcpy(paciente.nombrepa->nombrepaciente,nuevodatochar);
            }
         system("cls");
         }
         break;
      }
      case 3:{
         printf("\nIngrese el nuevo dato\n");
         scanf("%s",nuevodatochar);
         for(i=0;i<MAX_PA+1;i++,paciente++){
            if(b==paciente->folio){
               strcpy(paciente.nombrepa->apellidopapaciente,nuevodatochar);
            }
         system("cls");
         }
         break;
      }
      case 4:{
         printf("\nIngrese el nuevo dato\n");
         scanf("%s",nuevodatochar);
         for(i=0;i<MAX_PA+1;i++,paciente++){
            if(b==paciente->folio){
               strcpy(paciente.nombrepa->apellidomapaciente,nuevodatochar);
            }
         system("cls");
         }
         break;
      }
      case 5:{
         printf("\nIngrese el nuevo dato\n");
         scanf("%s",nuevodatochar);
         for(i=0;i<MAX_PA+1;i++,paciente++){
            if(b==paciente->folio){
               strcpy(paciente.genero,nuevodatochar);
            }
         system("cls");
         }
         break;
      }
      
   }
   
}
void borrarPaciente(int b,int *contadorindice,Paciente *paciente){//pequeño fallo al querer borrar el 2 paciente de 3
   int i;
   Paciente aux;
   printf("indice: %i",*contadorindice);
   for(i=0;i<MAX_PA+1;i++,paciente++){
      if(b==paciente->folio){
         aux=paciente;
         paciente=paciente[*contadorindice-1];
            printf("indice: %i",*contadorindice);
         (*contadorindice)--;
            printf("indice: %i",*contadorindice);
         printf("\nPaciente con folio %i fue borrado\n",b);
         system("pause");
         system("cls");
      }
   }
   
}



Título: Re: Alguien me puede ayudar, no funciona mi asignación dinámica para arreglos
Publicado por: MAFUS en 17 Marzo 2019, 11:13 am
Los dos primeros errores:
contadorindice es un puntero sin inicializar por tanto no lo puedes usar como índice. Tampoco lo podrías usar si fuera un entero sin inicializar.

Primero tienes que adquirir memoria dinámica para pacientes antes de hacer la comprobación del if. De nuevo estás usando un dato sin inicializar.