ponteiros para funções (error 127)

Programação C em geral

Moderadores: 51, guest2003

ponteiros para funções (error 127)

Mensagempor bfccardoso » 06 Fev 2009 13:37

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");
}
bfccardoso
Bit
 
Mensagens: 23
Registrado em: 23 Jan 2007 15:38

Mensagempor joao » 06 Fev 2009 14:56

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
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor joao » 06 Fev 2009 15:02

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
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 06 Fev 2009 15:55

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor bfccardoso » 06 Fev 2009 16:08

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!
bfccardoso
Bit
 
Mensagens: 23
Registrado em: 23 Jan 2007 15:38

Mensagempor bfccardoso » 06 Fev 2009 16:11

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
bfccardoso
Bit
 
Mensagens: 23
Registrado em: 23 Jan 2007 15:38

Mensagempor bfccardoso » 06 Fev 2009 16:39

problema resolvido, reinstalei e funfou.

Valeu galera!
Abraços.
bfccardoso
Bit
 
Mensagens: 23
Registrado em: 23 Jan 2007 15:38

Mensagempor joao » 07 Fev 2009 12:05

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
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 07 Fev 2009 13:11

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
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor joao » 07 Fev 2009 19:43

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
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor msamsoniuk » 07 Fev 2009 20:53

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
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor polesapart » 09 Fev 2009 14:17

Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor Cláudio » 09 Fev 2009 14:57

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...
[]´s
Cláudio
_______________________________________
"Quem quer, de verdade, faz. Quem não quer, inventa desculpas.
Avatar do usuário
Cláudio
Byte
 
Mensagens: 110
Registrado em: 17 Out 2006 09:19


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x