paulo1205
(usa Ubuntu)
Enviado em 27/11/2012 - 13:40h
silva.rodrigo escreveu:
Temos dois tipos de erro:
- Erros de compilação
- Erros de execução
Tal lista está incompleta: faltam outros erros que envolvem a compreensão do problema e a modelagem da solução.
Primeiro a falta de {} chaves, é sim um erro de execução, o programa compila normalmente sem erros, mas ao ser executado não faz aquilo que estamos à espera que faça. Na gíria informática, denominamos este tipo de erros por bugs.
Você está enganado. A falta de chaves, caso fosse o problema em pauta (no caso dele, não era -- essa parte do código estava totalmente correta), seria um erro de lógica ou de modelagem: o programa compilaria, e a execução se daria conforme o código compilado, mas o objeto submetido a compilação é que estaria em desacordo com o problema que se queria resolver.
Segundo removi o uso <conio.h>, pois no código não está servindo para nenhum propósito.
- O que a função vai fazer é retornar um caracter pressionado. A diferença de colocar um "scanf" no lugar do "Ch=getch()" é que no scanf você pressiona uma tecla e depois ENTER...
Exemplo:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main ()
{
char Ch;
Ch=getch();
printf ("Tecla pressionada: %c\n\n", Ch);
system("pause");
return (0);
}
Se estamos aprendendo devemos aprender de forma correta.
Você começou falando de uma coisa, mudou de assunto, e no final emendou com código que substitui uma prática ruim (usar a função não-padrão
getch()) com outra que é pior ainda (o famigerado
system("pause"), pois embora
system() esteja na biblioteca padrão do C, ela introduz custos ao invocar um comando externo, e ainda por cima chama um comando que é exclusivo da família de sistemas da Microsoft), sem ter explicado a colocação que estava fazendo antes sobre
scanf().
Obs. O código dele é perfeitamente valido em C, o suaurio está usando devc++ mas não disse estar programando em c++.
Permita-me mostrar, abaixo, que você está equivocado com relação ao "perfeitamente válido". Antes, porém, observo que eu não disse que ele estava usando uma linguagem nem outra, mas tão somente que se estivesse usando uma, o código seria inválido, e se a outra, estaria usando uma sintaxe obsoleta.
A revisão de 1999 do padrão da linguagem C (que já não é mais a mais recente, pois o último padrão é de 2011) tornou obsoleta a prática de omitir a declaração de tipo de retorno da função (a versão anterior do padrão, de 1989, especificava que o tipo de retorno, caso omitido, seria
int). Veja o "copy'n'paste" abaixo, com os resultados de invocações do compilador usando duas versões do padrão sobre o programa original dele (a menos da referênca a <conio.h> e a
getch() dessa ConIO, que não existem no Unix).
paulo@maquina:/tmp [520]: gcc -std=c89 prog.c
paulo@maquina:/tmp [521]: gcc -std=c99 prog.c
prog.c:4:1: warning: return type defaults to ‘int’ [enabled by default]
prog.c:10:1: warning: return type defaults to ‘int’ [enabled by default]
Como se vê, com a versão de 1989 (
-std=c89), a compilação vai sem erro algum. Com a versão de 1999 (
-std=c99), emite avisos sobre a sintaxe obsoleta.
A coisa "piora" quando se aumenta o nível de diagnóstico (que, aliás, é uma prática que eu
sempre recomendo, porque, a novatos, ajuda a educar no uso consciente da linguagem; a experientes, a evitar bugs que de outro modo ficariam latentes, resultantes de falhas de digitação, como a de trocar "==" por "=", ou pequenos equívocos, como o de esquecer de definir valores inciais de variáveis, que não são suficientes para causar erros de sintaxe durante a compilação). Como se pode ver abaixo, as opções de diagnótico impedem a compilação do mesmo programa até quando se usa o padrão da linguagem de 1989.
paulo@maquina:/tmp [522]: gcc -std=c89 -pedantic -O2 -Wall -Werror prog.c
prog.c:4:1: error: return type defaults to ‘int’ [-Werror=return-type]
prog.c:10:1: error: return type defaults to ‘int’ [-Werror=return-type]
prog.c: In function ‘main’:
prog.c:14:1: error: control reaches end of non-void function [-Werror=return-type]
prog.c: In function ‘linha’:
prog.c:9:1: error: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors