Problema simples em C

1. Problema simples em C

Rogue
roguewh

(usa Debian)

Enviado em 04/06/2014 - 18:35h

Bom pessoal, sou membro do vivaolinux tem tempo (+ - 2011), mas só agora estou postando algo. (No caso, uma dúvida besta =/).

Bom, peguei um exercício da faculdade pra resolver, mas não estou conseguindo encontrar o erro dentro do MEU próprio código. Tentei fazer um debug, minha IDE não está ajudando (geany) e resolvi tentar algo aqui.

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


int main(){


int a =0, i=0; // ???
float num[a];
char nomeArq[50];

printf("Digite o nome do arquivo: ");
gets(nomeArq);

FILE *arqBin = fopen("Nrs.bin", "rb");
FILE *arqTxt = fopen(nomeArq, "w");

if(arqBin == NULL){
printf("Erro ao tentar abrir arquivo binário. Tentar novamente!");
return 0;
}
// Laço pra ler o arquivo binário
int cont=0;
while(!feof(arqBin)){
fread(&num[a], sizeof(float), 1, arqBin );
if(num[a] >= 50){
i++; // Toda vez q entrar ele adiciona +1(final de 7 fazer um \n)
fprintf(arqTxt, "%.1f ", num[a]);
printf("%.1f \n", num[a]);
cont++; // Contagem pra ser usado mais tarde / Organizar (?)

if(i == 7){ // Pular linha...
fprintf(arqTxt, "\n");
i = 0; // Libera tudo pra recomeçar
}
}
}
printf("\n%i\n", cont);

for (a=0;a<1000;a++){ // For com problema, não lista nada e dá erro
printf("%.1f \n", num[a]); // na metade da execução...
}
return 0;
}
(desculpe, não sei o melhor modelo de formatar aqui.)

O principal problema é o seguinte: Se eu retirar esse ultimo FOR (problema ao executar), o arquivo é lido e enviado para um arquivo texto normalmente (o arquivo binário foi desenvolvido em outro programa), mas preciso pegar esse arquivo.txt e organizar os valores DENTRO dele.

QUALQUER ajuda é muito bem vinda, obrigado!
Alex.


  


2. Re: Problema simples em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/06/2014 - 10:00h

Para formatar o código no fórum, cerque-o com as tags “[code]” e “[/code]”.

No seu programa, algumas coisas estranhas já vêm logo na declaração das variáveis.

int a =0, i=0; // ???
float num[a];


O fato de o tamanho declarado para o array num ser uma variável (a) faz com que ele seja interpretado como array de tamanho variável (VLA). Só que a, como se vê na linha anterior, vale zero. Logo, você está alocando um array no qual não pode colocar nenhum elemento, pois, se o fizer, estará possivelmente sobrescrevendo memória do programa destinada a outras finalidades.

Por "sorte", durante a fase de leitura, você esquece de incrementar o valor de a, armazenando todos os valores lidos em a[0]. Ou seja: você só corrompe uma posição de memória após o final do array.

Quando você tenta imprimir os elementos do array naquele loop final (de mil iterações, para imprimir mil elementos de um array de tamanho zero -- algo que claramente não faz sentido), o que acontece nos primeiros elementos é que você faz acesso a memória pertencente ao programa, mas utilizada por outras coisas. A partir de um determinado elemento, no entanto, o loop ultrapassa até mesmo a memória que o sistema operacional tinha reservado para o programa, provocando erro (você não disse qual é, mas eu suponho que seja de falha de segmentação).


3. Re: Problema simples em C

Rogue
roguewh

(usa Debian)

Enviado em 05/06/2014 - 10:36h

Paulo, muito obrigado...!!

Sabia que era um erro bobo. Eu realmente tinha encontrando um problema na execução do código quando incrementava o a, mas tinha "esquecido", e como printou vários v[0] achei que estava funcionando (mesmo sabendo que o problema estava em acessar o vetor adiante..). Bom, vou arrumar aqui e consertar os erros.

Obrigado novamente!

Alex.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts