Configurar compilador mingw no eclipse[/resolvido]

Boa noite.

Estou tentando configurar o compilador mingw para rodar os aplicativos que crio em c ou c++ no eclipse. Instalei o Mingw primeiro para que o eclipse “enxergasse” o compilador, tanto que quando crio um projeto em c ou c++ aparece ao lado o compilador MinGW porém quando tempo compilar o código aparece a seguinte mensagem: Launch failed, Binary not found.. Lembrando que ja fiz isso varias vezes, até baixei o eclipse for c/c++ mas da o mesmo problema.
Por favor alguém pode me ajudar nesta questão. Desde de já agradeço.

Ps: 1° tem como configurar na IDE qual compilador que ela vai utilizar, mudar o compilador ou modificar o caminho que está o compilador(caso instale o mingw no pendrive)
2° O Eclipse que estou usando e o Helios para JEE.(não sei se isso importa muito…)
3° Baixei e instalei o plugin CDT para c/c++.

Alguém me ajude nessa questão por favor.

Por que você não usa outra IDE mais adequada para C++, como o Code::Blocks ou o próprio Visual C++ Express?

VinyGodoy, é que tenho alguns problemas com o codeblocks que não consigo solucionar, exemplo: num exercicio da faculdade que consistia em receber ‘n’ nomes de participantes ordena-los em um matriz receber as notas desse participantes, mostrar o participante vencedor e ordenar os nomes em ordem alfabética eu consegui fazer o algoritmo no Visual studio, porém usando a mesma idéia (praticamente o mesmo código) no codeblocks da esse erro.
undefined reference to `SortNamesAlpha(char*, int, int*)
Esse erro ocorre ao chamr a minha função SortNameAlpha.

Se quiser ver o código está anexado…

Outro problema do codeblocks é que não consigo criar funções do tipo void.

Se alguém tiver a solução para o meu problema com o eclipse por favor me ajudem.

Agradeço pela dica VinyGodoy

O Code::Blocks usa o MinGW. Se você tem esse erro no Code::Blocks, certamente o terá no Eclipse, quando configurar lá o MinGW. Afinal, esse é um erro do compilador ou do linker.
Vou ver o código aqui e já te explico pq do problema.

Existem mesmo pequenas diferenças entre o Visual e o C::B.

Ok. Aqui vai a lista dos problemas do seu código:

#include <conio.h>

Esse não é um cabeçalho do C++ padrão. O que significa que alguns compiladores podem implementa-lo, outros não. Na verdade, o conio.h foi criado pela Borland e sequer usava C++ padrão em sua estrutura. Dentro dele havia instruções específicas do compilador Borland.

cin.ignore(1, EOF);

EOF não é um caractere dentro de um arquivo. EOF é o valor de retorno de uma função. Não faz sentido chamar ignore nesse cara. No caso, você estaria pedindo para ignorar o caractere -1, que convertido para binário e sem sinal seria o caractere de código 255.
Simplesmente apague essa linha.

  1. strcopy_s

Essa função é exclusiva do Visual. Se você quiser compilar em outros compiladores, deve usar a strcpy padrão. É possível desativar o warning da MS, como explica esse artigo.

Removendo esses erro o seu código já compila no Code::Blocks e no Visual. Ele ainda não está correto, mas já estará funcional.
Um outro problema do seu código é que você mistura as APIs do C com as do C++. Existem funções e classes melhores e mais fáceis que as que você usou na Standard Library. Por exemplo, ao invés da string.h, você poderia fazer um #include <string> E usar a classe std::string.

O código também tem algumas más práticas, herdadas do C, como:

  1. Declarar todas as variáveis no início do método: Isso aumenta o escopo das variáveis desnecessariamente. O ideal é declarar as variáveis no momento que for utiliza-las;
  2. Retornar 0 e 1 ao invés de true e false: No C++, você não deve utilizar booleanos de maneira implícita (com int no lugar do tipo boolean);
  3. Usar #define para declarar constantes: No lugar, declare constantes com const;

Lembre-se que o C é uma linguagem extremamente madura. O compilador C++ deve ser mais antigo que eu e você. Então, é muito difícil que um erro seja do compilador, ou mesmo da IDE. Se está ocorrendo erro, as razões possíveis são:
a) Usar funções específicas de um compilador;
b) Erro no seu código.

Um parêntese no item b: Alguns tipos de erro geram comportamento undefined (indefinido). Um exemplo é o de usar uma variável não inicializada, ou de usar parâmetros incorretos em certas funções. Isso significa que pode ser que num compilador um código funcione perfeitamente com o erro, pois lá, “calha” da variável não inicializada cair numa região válida de memória, mas o problema se manifestará quando você trocar de compilador, ou de máquina. Portanto, caso você esteja rodando perfeitamente numa IDE, mas esteja tendo erros de ponteiro em outra, tenha certeza que isso ocorre por um erro no seu código.

Leia atentamente a documentação, para saber que situações geram o undefined behavior, e evite-as ao máximo possível, pois elas são erros de programação.

[quote=ViniGodoy]Ok. Aqui vai a lista dos problemas do seu código:

#include <conio.h>

Esse não é um cabeçalho do C++ padrão. O que significa que alguns compiladores podem implementa-lo, outros não. Na verdade, o conio.h foi criado pela Borland e sequer usava C++ padrão em sua estrutura. Dentro dele havia instruções específicas do compilador Borland.

cin.ignore(1, EOF);

EOF não é um caractere dentro de um arquivo. EOF é o valor de retorno de uma função. Não faz sentido chamar ignore nesse cara. No caso, você estaria pedindo para ignorar o caractere -1, que convertido para binário e sem sinal seria o caractere de código 255.
Simplesmente apague essa linha.

  1. strcopy_s

Essa função é exclusiva do Visual. Se você quiser compilar em outros compiladores, deve usar a strcpy padrão. É possível desativar o warning da MS, como explica esse artigo.

Removendo esses erro o seu código já compila no Code::Blocks e no Visual. Ele ainda não está correto, mas já estará funcional.
Um outro problema do seu código é que você mistura as APIs do C com as do C++. Existem funções e classes melhores e mais fáceis que as que você usou na Standard Library. Por exemplo, ao invés da string.h, você poderia fazer um #include <string> E usar a classe std::string.

O código também tem algumas más práticas, herdadas do C, como:

  1. Declarar todas as variáveis no início do método: Isso aumenta o escopo das variáveis desnecessariamente. O ideal é declarar as variáveis no momento que for utiliza-las;
  2. Retornar 0 e 1 ao invés de true e false: No C++, você não deve utilizar booleanos de maneira implícita (com int no lugar do tipo boolean);
  3. Usar #define para declarar constantes: No lugar, declare constantes com const;

Lembre-se que o C é uma linguagem extremamente madura. O compilador C++ deve ser mais antigo que eu e você. Então, é muito difícil que um erro seja do compilador, ou mesmo da IDE. Se está ocorrendo erro, as razões possíveis são:
a) Usar funções específicas de um compilador;
b) Erro no seu código.

Um parêntese no item b: Alguns tipos de erro geram comportamento undefined (indefinido). Um exemplo é o de usar uma variável não inicializada, ou de usar parâmetros incorretos em certas funções. Isso significa que pode ser que num compilador um código funcione perfeitamente com o erro, pois lá, “calha” da variável não inicializada cair numa região válida de memória, mas o problema se manifestará quando você trocar de compilador, ou de máquina. Portanto, caso você esteja rodando perfeitamente numa IDE, mas esteja tendo erros de ponteiro em outra, tenha certeza que isso ocorre por um erro no seu código.

Leia atentamente a documentação, para saber que situações geram o undefined behavior, e evite-as ao máximo possível, pois elas são erros de programação.[/quote]

Obrigado pela dica VinyGodoy. só para constar.

1° Na faculdade uso visual studio então o uso do cin.ingnore(1, EOF) eu ja havia percebido que nã funcionava no C::B
2° o strcpy_s funciona no C::B quando tiro o underline ‘s’ da frente, só coloquei para o MVS para de disparar warnings.
3° se meu professor ver um const ao invés de define ele vai ter um ataque na sala, ele ja é um sr. que viveu tudo (segundo ele) do que ocorreu na informática no Brasil.
4° usei a conio.h porque estava usando o getch para receber o caracter no final do programa quando pergunto se o usuário quer sair ou não, pergunto: Existe alguma função similar que não use a conio.h que poderia substituir no meu código???

Novamente agradeço a ajuda.

E não é necessário também no Visual Studio. Esse comando está errado mesmo.

Sim, é como eu falei. Sem o _s você volta a função strcpy, que é padrão do C. Funciona lá no Visual também, mas gera o warning. Linkei ali um artigo que explica como se livrar desse warning (basicamente é só dar um #include numa diretiva específica no seu código).

De qualquer forma, seria muito melhor usar o std::string. O código fica centenas de vezes mais limpo, e sem o warning também.
Sem falar que o std::string é mais rápido que os char*, graças a baixa performance da função strlen.

Nesse caso, mande ele ler o livro Effective C++, do Scott Meyers, mais especificamente o item 2 da página 13, que diz “Prefer consts, enums and inlines to defines”.
Esse livro é uma das bibliografias mais importantes do C++.

Não precisa desse treco. Se você rodar pelo console o programa não irá fechar. Se você rodar em modo debug do visual, também não. No code::blocks o programa também não fecha (ele até te mostra o tempo que o programa ficou executando).
É uma má prática pedir para o usuário pressionar uma tecla ao final do programa.

Valew VinyGodoy, tirou as dúvidas que eu tinha, vou usar o codeblocks agora e ler o artigo.