paulo1205
(usa Ubuntu)
Enviado em 17/09/2016 - 19:41h
Notoriobit escreveu:
Agradeço à dica do colega, porém descobri qual é o problema e sei que muitos também passam por isso:
É interessante que antes de você começar a trabalhar com o CODEBLOCKS dê uma limpada no cache do Debian, pois a numeração esquisita é lixo acumulado na memória, por isso que ele retorna esse número maluco. Eu utilizei esses comando para limpeza e deu tudo ok !
# echo 3 > /proc/sys/vm/drop_caches
# sysctl -w vm.drop_caches=3
A resposta certa foi dada pelo listeiro_037. Isso tudo que você disse sobre cache _de disco_ não tem a menor relação com o resultado esdrúxulo que você viu.
Todos aqui já fomos novatos em programação, do mesmo jeito como você é hoje. Às vezes, nossa inexperiência é tão grande que não conseguimos nem mesmo enxergar erros grosseiros que nós mesmos cometemos, e “preferimos” lançar a culpa do resultado aparentemente estapafúrdio que recebemos sobre fatores completamente alheios à real causa desse resultado.
No seu caso, o resultado era fruto de um erro no seu programa original: você dizia à função
printf() que ela deveria imprimir um valor inteiro, mas não passava esse valor como argumento para a função. Note bem a diferença.
/ * Modo correto */
printf("%d\n", cont);
Aqui,
"%d\n" é a string de formatação, que controla o comportamento de
printf(). A parte “
%d” diz que a função vai receber outro argumento, além da própria string, que corresponde a um valor inteiro, e que esse valor deve ser impresso como um numeral decimal (ou seja: usando os dez algarismos que vão de '0' a '9'). Já a parte “
\n” da string de formatação é a notação do C para indicar o caráter que representa a quebra de linha (você pode ler sobre as sequências de escape de caracteres em C em
https://en.wikipedia.org/wiki/Escape_sequences_in_C, por exemplo).
O segundo argumento passado à função é o valor da variável
cont. Esse é o valor que será usado para calcular o numeral a ser impresso, conforme especificado pela instrução “
%d” da string de formatação, conforme vimos acima.
/* Modo como você fez (ATENÇÃO: esse modo é ERRADO!) */
printf("%dn");
Aqui, a string de formatação diz que a função vai receber um segundo argumento do tipo inteiro, cujo valor deve ser usado para imprimir um numeral decimal, e logo em seguida imprime a letra “n” (para ser uma quebra de linha, faltou a barra invertida antes do “n”).
Só que você não colocou o segundo argumento, correspondente ao “
%d”, na chamada da função. Mas o interior da função
printf() não sabe que esse argumento faltou, e se comporta como se ele estivesse presente. Esse comportamento implica buscar na memória um dado inteiro. Mas em que lugar da memória? O que há nele?
Do ponto de vista do C, a resposta a essas perguntas é indeterminada. Na prática, as respostas dependem do compilador e de condições do ambiente de execução do programa no momento em que ele é executado. Seu programa é inválido, com qualquer coisa podendo acontecer: imprimir lixo, imprimir um valor constante, fazer o programa capotar, ou até mesmo corromper o funcionamento de outras partes do sistema.