Tento de todo o jeito, mas sempre fica dando erro sigsegv [RESOLVIDO]

1. Tento de todo o jeito, mas sempre fica dando erro sigsegv [RESOLVIDO]

Antonio Lorival Baesso
4n7onio

(usa Nenhuma)

Enviado em 27/05/2017 - 19:57h

Eu escrevi esse codico varias vezes, toh rescrevendo mais já toh cansado de toda vez que eu executo da o erro sigsegv, compilando no dev c++ por causa da faculdade

o código
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.c>
int main(void){
char switch_1, switch_2;
int alunos, notas;
int controle=0, aux, i, j;
char vetor_alunos[alunos][40], auxc[alunos][40];
float matriz_notas[alunos][notas], resultado[alunos];
do{
// Esse e o menu, alguns print e textcolor são estéticos.
textcolor(12);
printf("\t\t\t\tPrograma de cadastro de alunos v.0.236.n beta\n");
printf("\n\n");
textcolor(15);
printf("________________________________________________________________________________________________________________________");
printf("\n\n");
textcolor(13);
printf("Escolha umas das seguintes opcoes abaixo:\n\n");
textcolor(14);
printf("A) Quantidade dos dados");
textcolor(8);
printf(" (Numeros de alunos e numero de notas)\n");
textcolor(6);
printf("B)Cadastro dos dados");
textcolor(8);
printf(" (Digite a quantidade de dados antes, opcao 1)\n");
textcolor(6);
printf("C)Listar os dados");
textcolor(8);
printf(" (Execute primeiro a opcao 1, se ja realizado execute a opcao 2, depois volte aqui)\n");
textcolor(14);
printf("D)Limpar todos os dados");
textcolor(8);
printf(" (Reinicia todas as operacoes)\n");
textcolor(14);
printf("E)Sair\n");
textcolor(7);
// comando pra ler a escolha do usuário
scanf("%c",&switch_1);
// para declarar a matriz logo embaixo fiz o case a separado do resto
if(switch_1=='a'){
a:
printf("Digite a quantidade de alunos\n");
scanf("%d",&alunos);
printf("Digite a quantidade de notas\n");
scanf("%d",&notas);
};
// declaração de matriz logo embaixo
char vetor_alunos[alunos][40], auxc[alunos][40];
float matriz_notas[alunos][notas], resultado[alunos];
switch(switch_1){
case 'a':
goto a;
break;
case 'b':
b:
while(controle==0){
printf("Ainda precisa executar a opcao [A] antes de proseguir\n");
printf("Opcao [A]\n");
goto a;
};
do{
textcolor(3);
printf("Digite o nome do %d aluno\n",i+1);
scanf(" %[^\n]s",&vetor_alunos[i]);
i++;
}while(i<alunos);
for(i=0;i<alunos;i++){
printf("Digite a(s) nota(s) do aluno %s \n",vetor_alunos[i]);
aux=0;
// fica repitindo até dar os números de notas
for(j=0;j<notas;j++){
// Este do para não aceitar notas maiores que 10
do{
scanf("%f",&matriz_notas[i][j]);
}while(matriz_notas[i][j]>10);
// Aqui e feita a soma de todas as notas
aux += matriz_notas[i][j];
}
// Essa pra dividor a média
resultado[i]=aux/notas;
}
break;
case 'c':
if(controle==0){
printf("Ainda nao a quantidade de dados, volte a opcao [A] e registre-os\n");
printf("Opcao [A]\n");
goto a;
}
else{
if(controle==1){
printf("Opcao [B] nao acessada ainda, acesse-a e volte aqui\n");
printf("Opcao [B]\n");
goto b;
}
};
switch(switch_2){
printf("Digite a ordem da ");
case 'a':
for(i=0;i<=alunos;i++){
for (j=i+1;j<alunos;j++){
if(resultado[i]<resultado[j]){
aux=resultado[i];
resultado[i]=resultado[j];
resultado[j]=aux;
strcpy(auxc[i], vetor_alunos[i]);
strcpy(vetor_alunos[i], vetor_alunos[j]);
strcpy(vetor_alunos[j], auxc[i]);
}
}
};
break;
case 'b':
for(i=alunos;i>=0;i--){
for (j=i-1;j>alunos;j--){
if(resultado[i]>resultado[j]){
aux=resultado[i];
resultado[i]=resultado[j];
resultado[j]=aux;
strcpy(auxc[i], vetor_alunos[i]);
strcpy(vetor_alunos[i], vetor_alunos[j]);
strcpy(vetor_alunos[j], auxc[i]);
}
}
};
}
for(i=0;i<=alunos;i++){
printf("A media de %s e: %.2f\n",vetor_alunos[i], resultado[i]);
};
break;
}
}while(switch_1!='e');
return 0;
}



  


2. Re: Tento de todo o jeito, mas sempre fica dando erro sigsegv

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/05/2017 - 01:28h

Você faz um uso bem macarrônico (não é zoação: o nome em Inglês é mesmo spaghetti code) de goto no seu código. E, por causa desse uso, é possível que as declarações dos arrays de tamanho variável (VLAs) não sejam feitas com os valores lidos de alunos e de notas. Aliás, não é apenas com VLAs que gotos macarrônicos podem dar problemas, mas também com outras variáveis.

Veja o seguinte tópico no Stack Overflow: https://stackoverflow.com/questions/29124145/segmentation-fault-when-jumping-to-goto-over-vla-array.

Eu não sou categoricamente contra goto, mas existem bons usos, que são legítimos, e maus usos, que devem ser evitados. Os usos que você fez são exemplos de mau uso. A melhor solução seria reprojetar o código para os eliminar completamente.

Outro problema com seu código é a reutilização dos mesmos nomes de variáveis em diferentes escopos, com o escopo mais interno ocultando (i.e. tornando inacessíveis) os nomes declarados no escopo externo. Entretanto, essa declaração externa ainda pode ser problemática: você declara VLAs com valores desconhecidos de alunos e notas. De modo imprevisível, esses valores podem aparecer como valores absurdamente grandes, o que poderia provocar esgotamento de memória ou estouro de pilha, fazendo o programa capotar — e isso com variáveis que nem serão visíveis pelo resto do programa.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts