Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Bug

Diferenças de compililadores? (Turbo C vs Dev c++/Code::Blocks)

Mensagens Recomendadas

Bug

Boas programadeiros,

Eu tenho um livro que um amigo me emprestou ja à uns anos sobre programaçao em C, de Luis Damas (muitos devem conhecer este livro :)) e aprendi umas coisas  com ele. Mas recentemente conheci estes novos Compiladores/IDEs e gosto especialmente do CodeBlocks.

Mas ao compilar um dos programas que tinha feito no TurboC, tanto um como o outro devolvem-me 2 erros que nao entendo muito bem.

Um tem a ver com a funçao main() que no livro de Luis Damas aprendi a declarar (até ao ponto onde li o livro) como

void main()
{
}

e que no TurboC nao me da problema nenhum...

Pelo que ja percebi devo declarar como int main() e o problema fica resolvido. Mas fico com duvidas. Mas entretanto ainda tenho outro erro:

clrscr();

error: `clrscr' undeclared (first use this function)

Este ja nao percebo bem o que significa, ja que no TurboC nao me da nenhum erro nessa linha...

As minhas duvidas sao:

Que diferenças ha entre o antigo compilador de DOS e os novos compiladores?

Estarão os IDEs a interpretar o codigo como sendo C++ e terei que alterar alguma definiçao nas options?

Desde ja, obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Declarar a função main como void não é padrão, provavelmente deve dar-te um warning apenas.

Quanto à função clrscr não a conheço mas provavelmente também não é ansi. Procura sobre ela.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
anolsi

A função clrscr não faz parte do ANSI C, e como tal alguns compiladores podem inclui-la e outros não. Para isso tens que fazer o include do conio.h

Quanto à função main, eu pessoalmente conheço duas maneiras de a declarar:

void main(){
    //Faz as várias coisas
    exit(0); //Dá indicação que o programa terminou sem erros (para isso é que serve o 0)
}

ou então:

int main(){
    //Faz as várias coisas
    return 0; //Devolve um valor inteiro, por convenção costuma ser o 0, mas pode ser um qualquer
}

E prefiro a segunda.


"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

É necessário salientar que o que apresentaste foram IDEs e não compiladores. Mas o que afecta a compilação é o compilador e não o IDE, por exemplo, eu uso o IDE NetBeans para programar em C /C++ e em sistemas operativos diferentes uso compiladores diferentes mas sempre o mesmo IDE.

O primeiro erro é um erro na forma como estás a usar a declaração da função main, que tem uma declaração mais extensa do que o que colocaste. E que neste caso o compilador não estava a aceitar.

O segundo erro está relacionado com o facto de que a função que estás a tentar usar é exclusiva das bibliotecas da Borland que acompanhavam os IDEs e o compilador da Borland. Essa biblioteca, além de ser exclusiva da Borland também só existe em Windows. Não é uma biblioteca que faça parte do standard do C ou do C++ e por essa razão não está disponível com outros compiladores.

Se não estou em erro o Code::Blocks usa como compilador o GCC.

Resumindo, não se trata de uma questão de IDEs ou de definições, mas sim de estares a tentar usar coisas que são exclusivas de Windows e do compilador de C da Borland, que era usado nos IDEs da Borland desde o TurboC até ao Borland C/C++ Developer.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

@anolsi, a primeira forma como declaraste a função main não é padrão.

A maneira que costumo declarar é:

int main(void) {
  //code
  return 0;
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bug

Thx Knitter, não me tinha mesmo ocorrido isso, e isso explica tudo.

anolsi, tens rasão, faz parte do conio.h.

Mas então agora, se eu quiser criar um programa baseado em ms-dos, e se este compilador, pelos vistos, nao reconhece o conio.h, que alternativas tenho para limpar o ecrã?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Não é uma questão de não reconhecer, simplesmente a biblioteca não existe, os ficheiros não está lá para ele poder usar os headers e criar o código. A única solução é encontrares uma biblioteca alternativa e instalares. Crieo que as bibliotecas da Borland não estão disponíveis para download e apenas acompanhão os IDEs da Borland, pelo que não será muito legal ires lá buscar o ficheiro.

A única solução será encontrares uma implementação alternativa que, tendo em conta a popularidade da biblioteca, deve ser relativamente simples de encontrar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bug

Hmm, o DevC++ ja tras essa biblioteca conio.h, mas o seu conteudo é diferente e aparentemente nao inclui a funcção clrscr()...

Quanto ao codeblocks ainda nao percebi onde ele guarda as bibliotecas.

Mas isto agora deixou-me baralhado, nao vou substituir o ficheiro pelo mais antigo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

É possível que encontres implementações diferentes, aliás, conio.h é o ficheiro header que define as funções, e existem várias versões diferentes deste ficheiro, uns com mais funções que outras. A somar a isso, a implementação exacta de cada uma das bibliotecas varia, por isso podes ter duas implementações para o mesmo header file que são completamente diferentes, o que pode causar alguns problemas se estavas habituado a um funcionamento ou se determinada implementação tem algum problema.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bug

Aaah, como alternativa usei system("cls"); ... nem sei como é que nao me lembrei disso antes.  :-[

Agora sim o meu progzito compila sem problemas.

Obrigado a todos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Isso só funciona em Windows, para além de que constitui uma chamada ao SO, que é uma operação pesada.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bug

Mas cls é uma função do DOS... nao percebi bem o que queres dizer. Qto ao ser pesada, neste caso nao faz diferença, visto que o proprio programa é simples e nao faz assim tanto uso disso. Mas se vier a criar programas mais complexos terei isso em conta. Thx.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bug

ah, sim, claro. Tambem nao tinha pensado nisso. Neste caso é um programa simples so para ajudar um amigo que nao percebe nada de DOS a jogar alguns jogos antigos, e assim so precisa de excutar o meu programa e escolher no menu e jogar.

Mas sendo assim, se fosse caso de necessidade de portabilidade, que alternativas teria?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Não conheço nenhuma função/biblioteca independente da plataforma que possua uma funcionalidade de limpeza do ecrã. A solução que conheço é fazer um printf com muitos '\n'.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedroserra

Uma solução possível que abrange DOS e Linux é usar as sequências de escape ANSI que são suportadas nativamente pelas consolas linux e, com uma pequena configuração, nas do DOS também.

printf("\x1b[2J\x1b[0;0H");

Para funcionar em DOS terás de adicionar ao CONFIG.SYS a linha

device={drive:}{path}ANSI.SYS

Para o caso dos windows, deverá ser necessária alguma configuração semelhante. É uma questão de perguntar ao google.

Se pesquisares por "ansi escape codes" encontras outras sequências do tipo "ESC[#;#..." para posicionar cursor, mudar cores, etc....


Ah e tal não sei quê...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.