Problema com realloc [RESOLVIDO]

1. Problema com realloc [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/05/2018 - 21:13h

Desculpem por não ser muito especifico no titulo da pergunta, mas é que eu não conseguir entender oque está acontecendo no meu código e na verdade nem sei se o problema é com a função realloc.

1 - Então, eu estava resolvendo o seguinte exercício:

Crie um programa que armazene dinamicamente números fornecidos pelo usuário.
O programa deve perguntar quantos números o usuário quer adicionar e receber tais números.
Não desperdice memória e tempo, use a função realloc() para realocar memória sempre que o usuário quiser inserir mais números.


2 - Então escrevi o código:


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

void add(unsigned int *size, unsigned int aux, double *ptr);

int main(void){

double *numbers=(double*)malloc(sizeof(double));

char opc;
unsigned int size=0, aux;

do{

printf("Inserir numeros...[1]\n");
printf("Exibir numeros....[2]\n");
printf("Limpar............[3]\n");
printf("Sair..............[4]\n->");

opc=getchar();

system("clear");
__fpurge(stdin);

switch(opc){

case '1':

printf("Digite a quantidade de numeros a serem inseridos ->");
scanf("%d", &aux);

system("clear");
__fpurge(stdin);

add(&size, aux, numbers);

break;

case '2':

for(unsigned int i=0; i<size; i++){

printf("%lf\n", numbers[i]);
}

printf("\n\n\n");

break;

case '3':

numbers=(double*)realloc(numbers, sizeof(double));

size=0;

printf("Valores removidos!\n\n");

break;

case '4':

break;

default:

printf("Opção incorreta\n\n");
}

}while(opc!='4');

free(numbers);
numbers=NULL;
}

void add(unsigned int *size, unsigned int aux, double *ptr){

double *ptr_aux=(double*)realloc(ptr, (*size+aux)*sizeof(double));

if(ptr_aux==NULL){

printf("Memoria insuficiente\n\n");

}else{

ptr=ptr_aux;
(*size)+=aux;

unsigned int i;
char opc;

for(i=(*size)-aux; i<(*size); i++){

printf("%d - Digite qualquer valor numerico ->", i+1);
scanf("%lf", &ptr[i]);

if(i+1==(*size)){

system("clear");
__fpurge(stdin);

printf("\n\nDeseja inserir mais numeros?\n[y/n] -> ");
opc=getchar();

__fpurge(stdin);

if(opc=='Y' || opc=='y'){

printf("\nInsira a quantidade de numeros -> ");
scanf("%d", &aux);

(*size)+=aux;

system("clear");
}
}
}

system("clear");
__fpurge(stdin);
}
}


3 - O programa roda quase como o esperado, pois quando quero adicionar mais de 4 números ele põe 0


Inserir numeros...[1]
Exibir numeros....[2]
Limpar............[3]
Sair..............[4]
->1

--------------------

Digite a quantidade de numeros a serem inseridos ->1
1 - Digite qualquer valor numerico ->666

-------------------

Deseja inserir mais numeros?
[y/n] -> n

Inserir numeros...[1]
Exibir numeros....[2]
Limpar............[3]
Sair..............[4]
->2

//Ele exibira normalmente o valor 666
-------------------


Agora, se eu quiser digitar 4 valores veja o que acontece na saida de exibição de numeros:


Inserir numeros...[1]
Exibir numeros....[2]
Limpar............[3]
Sair..............[4]
->2

*---------saida---------*

0.000000
0.000000
0.000000
0.000000

//WTF???


O oque tem de errado no código?


  


2. Re: Problema com realloc [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 03/05/2018 - 00:10h

Corrigido os erros (porém sem entender os erros do anterior)


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

double *add(unsigned int *size, unsigned int aux, double *ptr);

int main(void){

double *numbers=NULL;

char opc;
unsigned int size=0, aux;

do{

printf("Inserir numeros...[1]\n");
printf("Exibir numeros....[2]\n");
printf("Limpar............[3]\n");
printf("Sair..............[4]\n->");

opc=getchar();

system("clear");
__fpurge(stdin);

switch(opc){

case '1':

printf("Digite a quantidade de numeros a serem inseridos ->");
scanf("%d", &aux);

system("clear");
__fpurge(stdin);

numbers=add(&size, aux, numbers);

break;

case '2':

for(unsigned int i=0; i<size; i++){

printf("%lf\n", numbers[i]);
}

printf("\n\n\n");

break;

case '3':

free(numbers);
numbers=NULL;

size=0;

printf("Valores removidos!\n\n");

break;

case '4':

break;

default:

printf("Opção incorreta\n\n");
}

}while(opc!='4');

free(numbers);
numbers=NULL;
}

double *add(unsigned int *size, unsigned int aux, double *ptr){

double *ptr_aux=(double*)realloc(ptr, (*size+aux)*sizeof(double));

if(ptr_aux==NULL){

printf("Memoria insuficiente\n\n");

}else{

ptr=ptr_aux;
(*size)+=aux;

unsigned int i;
char opc;

for(i=(*size)-aux; i<(*size); i++){

printf("%d - Digite qualquer valor numerico ->", i+1);
scanf("%lf", &ptr[i]);

if(i+1==(*size)){

system("clear");
__fpurge(stdin);

printf("\n\nDeseja inserir mais numeros?\n[y/n] -> ");
opc=getchar();

__fpurge(stdin);

if(opc=='Y' || opc=='y'){

printf("\nInsira a quantidade de numeros -> ");
scanf("%d", &aux);

(*size)+=aux;

system("clear");
}
}
}

system("clear");
__fpurge(stdin);
}

return ptr;
}








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts