Alguien me puede ayudar, no funciona mi asignación dinámica para arreglos

Iniciado por Oscaro55443, 17 Marzo 2019, 06:57 AM

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

Oscaro55443

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");
      }
   }
   
}


MAFUS

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.