Jump to content
  • 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)

Recommended Posts

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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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ã?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
Baderous

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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'.

Share this post


Link to post
Share on other 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ê...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.