Alguém pode me ajudar com este programa? Quando escolho a opção 1 e digito um valor qualquer, ele aparece o erro: Program received signal SIGSEGV,segmantation fault e aponta a linha 80, ou seja, esta: “return (n + MinhaFuncao(n - 1));”…
Por outro lado, quando eu uso o código que está abaixo, comentado, isto é, entre /* */, em vez do código que está dando erro, tal erro não ocorre… contudo, esta mesma linha está nos dois programas (no que está comentado, e no que não está).
Se alguém puder, gostaria que me mostrasse como resolver este erro, e também como evitá-lo. Agradeço desde já!
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <locale.h>
#define TITULO_OPCAO1 "1. Efetue o cálculo com uma função recursiva;"
#define TITULO_OPCAO2 "2. Mostre-me a função recursiva utilizada;"
#define TITULO_OPCAO3 "3. Sair."
#define N_OPCOES 3
#define OPCAO1 1
#define OPCAO2 2
#define OPCAO3 3
void LimparBuffer(void)
{
int valorLido;
do{
valorLido = getchar();
} while((valorLido != '\n') && (valorLido != EOF));
}
int LeOpcao(int menorValor, int maiorValor)
{
int op;
while(1){
printf("\nDigite a opção desejada: ");
scanf("%d", &op);
if((op >= menorValor) && (op <= maiorValor)){
LimparBuffer();
break;
} else{
printf("ERROR: Digite um número inteiro entre: %d e %d", menorValor, maiorValor);
LimparBuffer();
}
} return op;
}
int LeInteiro(void)
{
int umInt;
int nValores;
printf("\nDigite um valor inteiros e pressione ENTER: ");
nValores = scanf("%d", &umInt);
while(nValores == 0){
printf("\nERROR: Você digitou um valor inválido.");
printf("\nDigite um valor inteiros e pressione ENTER: ");
LimparBuffer();
nValores = scanf("%d", &umInt);
}
return umInt;
}
void ApresentaMenu(int nOpcoes, int menorOpcao, ...)
{
int x;
va_list argumentos;
va_start(argumentos, menorOpcao);
for(x = 0; x < nOpcoes; x++){
printf("%c-%s\n", menorOpcao, va_arg(argumentos, char *));
}
va_end(argumentos);
}
int MinhaFuncao(int n)
{
if(!n){
return 0;
}
return (n + MinhaFuncao(n - 1));
}
int main(void)
{
int x;
unsigned char op;
setlocale(LC_ALL, "Portuguese");
ApresentaMenu(N_OPCOES, OPCAO1, TITULO_OPCAO1, TITULO_OPCAO2, TITULO_OPCAO3);
op = LeOpcao(OPCAO1, OPCAO3);
switch(op)
{
case 1:
LeInteiro();
printf("Retorno da função: %d", MinhaFuncao(x));
printf("\n\n");
break;
return 0;
case 2:
printf("\n\nint MinhaFuncao(int n)\n{");
printf("\n\tif(n == 0){");
printf("\n\t\treturn 0;");
printf("\n\t}");
printf("\n\treturn (n + MinhaFuncao(n - 1));");
printf("\n}\n\n\n\n\n\n\n\n\n\n\n\n\n");
break;
case 3:
printf("\n\n\n\t\t\t\tENCERRANDO PRORAMA...\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\n");
break;
system("PAUSE");
return 0;
default:
printf("\nERROR: Este programa tem um bug.\n");
printf("\n\n\n\t\t\t\tENCERRANDO PRORAMA...\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
system("PAUSE");
return 0;
}
/*
extern int MinhaFuncao (int);
int main()
{
int x;
setlocale(LC_ALL, "Portuguese");
printf("\nDigite um número inteiro maior que zero: ");
scanf("%d", &x);
MinhaFuncao(x);
printf("Retorno da função: %d", MinhaFuncao(x));
printf("\n\n");
system("PAUSE");
return 0;
}
//CONSTRUIR UMA FUNÇÃO INTERATIVA QUE TENHA O MESMO EFEITO DA FUNÇÃO ABAIXO:
int MinhaFuncao(int n)
{
if(!n){
return 0;
}
return (n + MinhaFuncao(n - 1));
}*/