Página 1 de 1

ponteiros para funções (error 127)

MensagemEnviado: 06 Fev 2009 13:37
por bfccardoso
Estou aprendendo C com a ajuda do livro C completo e total e o DEV-C++, quando estava estudando ponteiros para funções, copiei do livro este código abaixo e o DEV-C++ me da o seguinte erro:

command not found
[Build error] n\make.exe: ***[main.o]Error 127

alguém já viu algo parecido?


Código: Selecionar todos
#include<stdio.h>
#include<string.h>

void check(char *a, char *b, int (*cmp)(const char *, const char *));

void main(void)
{
     char s1[80], s2[80];
     int (*p)();
     
     p = strcmp;
     
     gets(s1);
     gets(s2);
     
     check(s1,s2,p);
}

void check(char *a, char *b, int (*cmp)(const char *, const char *))
{
   printf("tstando igualdade\n");
   if(!(*cmp)(a, b)) printf("igual");
   else printf("diferente");
}

MensagemEnviado: 06 Fev 2009 14:56
por joao
hmmm

Mesmo nunca tendo visto uma implementação desta do livro, no qual vc passa uma função(strcmp) como parametro, eu acho que esse defeito é do compilador.

Faça um teste: crie um novo projeto e apenas copmpile. Veja se dá esse erro. Se não der, dai sim copie esse seu código, sobrescrevendo todo o seu arquivo principal( main.c ???) e veja se acontece esse erro.

Porque aparentemente parece que ele não está com o PATH correto.

[]'s

MensagemEnviado: 06 Fev 2009 15:02
por joao
Acabei de testar no Dev-Cpp aqui e funcionou corretamente. Só mudei um pouco para poder ser mais entendivel quando roda:
Código: Selecionar todos
#include<stdio.h>
#include<string.h>

void check(char *a, char *b, int (*cmp)(const char *, const char *));

int main(int argc, char* argv)
{
     char s1[80], s2[80];
     int (*p)();

     p = strcmp;

     printf("Entre primeiro valor\n");
     gets(s1);
     printf("Entre segundo valor\n");
     gets(s2);

     check(s1,s2,p);

    system("PAUSE");
    return 0;
}

void check(char *a, char *b, int (*cmp)(const char *, const char *))
{
   printf("tstando igualdade\n");
   if(!(*cmp)(a, b)) printf("igual\n");
   else printf("diferente\n");
}


Tente apenas criar um novo projeto(Projeto, Ok? não novo arquivo!) e eu acho que vai solucionar o seu prob.

Caso vc realmente queira achar o erro, copie aqui o seu compile log. É uma tag que fica embaixo, do lado da tag de debug. É lá que está a sua linha de comando.

Olhando aqui, vc pode ir também em:
tools->compiler options->Tab Directories
A minha linha é:
C:\Program Files\Devcpp\Bin

Essa linha que apontar para aonde se encontra o arquivo mingw32-make.exe

NA aba compiler, vc tem que estár com o MinGW selecionado como Compiler Type.

[]'s

MensagemEnviado: 06 Fev 2009 15:55
por msamsoniuk
o erro que deu foi "command not found", ou seja, eh erro na sua instalacao... em tempo, testei *exatamente* o seu codigo, compilou e rodou sem problemas.

unica reclamacao do compilador eh que nao existe "void main()"... se esta assim no livro, realmente esta errado! main() sempre retorna int, pq eh exigencia do sistema operacional.

MensagemEnviado: 06 Fev 2009 16:08
por bfccardoso
Tente apenas criar um novo projeto(Projeto, Ok? não novo arquivo!) e eu acho que vai solucionar o seu prob.


Criei um novo projeto mas o mesmo problema continua.

Caso vc realmente queira achar o erro, copie aqui o seu compile log. É uma tag que fica embaixo, do lado da tag de debug. É lá que está a sua linha de comando.


Compilador: Default compiler
Building Makefile: "C:\Dev-Cpp\ponteiro_funcao2\Makefile.win"
Executando make...
C:\Dev-Cpp\bin\make.exe -f "C:\Dev-Cpp\ponteiro_funcao2\Makefile.win" all
C:\Dev-Cpp\bin\gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"
/usr/bin/sh: C:Dev-Cppbingcc.exe: command not found
C:\Dev-Cpp\bin\make.exe: *** [main.o] Error 127
Execução terminada

Olhando aqui, vc pode ir também em:
tools->compiler options->Tab Directories
A minha linha é:
C:\Program Files\Devcpp\Bin

Essa linha que apontar para aonde se encontra o arquivo mingw32-make.exe


A minha linha também é esta e o arquivo se encontra na pasta

NA aba compiler, vc tem que estár com o MinGW selecionado como Compiler Type.


eu só tenho o "Default compiler"
tem como eu adicionar outro?



Obrigado!

MensagemEnviado: 06 Fev 2009 16:11
por bfccardoso
o erro que deu foi "command not found", ou seja, eh erro na sua instalacao... em tempo, testei *exatamente* o seu codigo, compilou e rodou sem problemas.


é...
vou reinstalar para ver se deixei passar algo enquanto ia só clicando onde aparecia a palavra "next".

valeu

MensagemEnviado: 06 Fev 2009 16:39
por bfccardoso
problema resolvido, reinstalei e funfou.

Valeu galera!
Abraços.

MensagemEnviado: 07 Fev 2009 12:05
por joao
Só para explicar:

O problema é que eu acho que vc baixou apenas a IDE do DevCpp e não o compilador que é o MinGW. Existe uma opção para baixar os dois em apenas uma instalação.

No MinGW não é necessário retornar int no main. Ele apenas gera um warning, mas não gera erro.

Para quem for usar o MinGW sempre use está dica: Pegue o maior arquivo e não esqueça de fazer uma instalação default.

[]'s

MensagemEnviado: 07 Fev 2009 13:11
por msamsoniuk
joao escreveu:No MinGW não é necessário retornar int no main. Ele apenas gera um warning, mas não gera erro.


opa! cuidado! nao passe dicas erroneas! :D isso de retornar void no main eh uma mancada frequente, tem que tomar cuidado e enchergar a frente! o retorno de main eh um requisito do sistema operacional, baseado em um requisito mais basico de testar se a aplicacao falhou ou nao durante a execucao... e nao eh dificil vc ver o quanto de estrago faz ignorando main.

no unix eh comum utilizar:

if programa
then
echo sucesso
else
echo falha
fi

ou seja, qualquer aplicacao no unix pode ser usado em um teste logico em um if ou while. se vc por omissao usa void main(), sua aplicacao automaticamente passa a nao ser unix-like, causando odio e desgosto por parte dos administradores unix... por exemplo:

mkdir encontrado
for i in *
do
if grep -q valor $i
then
cp $i encontrado
fi
done

que eh uma copia condicional: ele procura uma string "valor" em todos os arquivos do diretorio corrente. se o arquivo contem esta string, o que eh feito no unix atraves do comando grep, ele retorna true e entao a copia eh feita, do contrario ele retorna false e continua o loop do for. um utilitario que nao segue essa regra basica rapidamente se torna um inutilitario :)

no msdos eh perfeitamente possivel fazer algo similar. de fato, eh muito comum encontrar arquivos bat com o comando if errorlevel, que permite o tratamento de falhas de um aplicativo. normalmente as pessoas no msdos sao menos gabaritadas e no lugar de fazer scripts fazem tudo na mao como os macacos. isso nao quer dizer que vc deva tratar eles como completos animais e usar isso como justificativa para omitir funcionalidades que poderiam ajudar eles a se tornar mais inteligentes (ou que possam ser usadas por pessoas inteligentes de passagem pelo sistema operacional).

no sistema operacional dos macaquinhos existe inteligencia:

http://www.computerhope.com/if.htm

afinal, eles copiaram quase tudo do unix na decada de 80 hehehe e claro, como todo mundo espera, o mingw eh apenas um compilador de unix q roda num shell de unix... ele adora que main retorne int! :)

imagina se vc vai sacar dinheiro no banco e o desenvolvedor faz uma mancada no codigo que controla a saida da grana. dae para facilitar, ele faz tudo retornar void? se a saida da grana falha, para o aplicativo mestre tudo funcionou perfeitamente e ele te avisa "saque realizado com sucesso!", pq o outro programador rodou um system() e esperava que vc seguisse a regra, mas vc usou void main() :)

mesmo no caso mais basico, onde nao existe sistema operacional, o retorno do main, na minha opiniao, deveria ser tratado por um exception handler (caso de microcontroladores menores)...

se vc sabe q existe potencial para uma falha, pq ser omisso? nao acho que seja nem questao de preguica, visto que void tem mais letras que int, mas uma questao de conhecer melhor o potencial das coisas! vou ateh iniciar uma nova campanha educativa tipo "retornar int no main eh legal e previne doencas do coracao", "os vencedores nao precisam retornar void" e "seja livre! retorne int no main" :)

e soh por curiosidade, olha o topico inicial do post e compara com isso:

marcelosamsoniuk@marcelo-samsoniuks-macbook:~$ asdf; echo $?
-bash: asdf: command not found
127

que foi a forma que o make descobriu que o compilador nao estava instalado... este mundo dah voltas neh ? :D hahaha

MensagemEnviado: 07 Fev 2009 19:43
por joao
marcelo,

O problema é que vc falou que estava errado!
E não está!
Você pode sim fazer.
Concordo plenamente que você deve ter um int no main, mas não é necessario! O compilador no máximo irá dar um warning e não iria crashear o build por causa disto.

[]'s

MensagemEnviado: 07 Fev 2009 20:53
por msamsoniuk
eu nao falei q o erro no build era causado pelo void... apenas observei que o compilador emitiu um warning referente a isso e eu considero isso um erro basico de programacao. apenas indiquei q deveria ser evitado, pq pode causar outros problemas.

bom, veja bem, quando vc declara um ponteiro, nao inicializa ele e usa ele direto, o compilador tambem emite apenas um warning... vc acha q isso nao eh um erro? existe uma funcao que chama main e espera um resultado... de onde vem esse resultado? se vc nao passa resultado nenhum, ela simplesmente vai puxar um valor aleatorio que estiver na stack. isso, claramente, eh um erro equivalente a uma variavel nao inicializada... certamente vai dar resultados nao previstos em tempo de execucao.

enfim, custa assim tao caro fazer a coisa certa e evitar um potencial problema? depois usinas nucleares explodem, avioes caem e o povo fica se perguntando pq erros basicos sempre passam... sei lah, dae vai da consciencia de cada um neh...

joao escreveu:marcelo,

O problema é que vc falou que estava errado!
E não está!
Você pode sim fazer.
Concordo plenamente que você deve ter um int no main, mas não é necessario! O compilador no máximo irá dar um warning e não iria crashear o build por causa disto.
[]'s

MensagemEnviado: 09 Fev 2009 14:17
por polesapart

MensagemEnviado: 09 Fev 2009 14:57
por Cláudio
depois usinas nucleares explodem, avioes caem e o povo fica se perguntando pq erros basicos sempre passam...

Tomara que Bin Laden não ouça isso... Senão, tome Main sem retorno por aí!! :lol:
Desculpem a fuleragem, mas já tinha virado off-topic msmo...