1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

comparação de argumentos

Discussão em 'Programação' iniciada por Neojag, 3 de Março de 2007. (Respostas: 13; Visualizações: 1365)

  1. Neojag

    Neojag Power Member

    Viva!
    Será que alguém me pode dizer porque raio é que este código não está a retornar nada? Se executar o programa com um argumento, argv[1] fica efectivamente com esse valor, mas nada do que está dentro dos if's aparece. Já se definir dentro do programa argv[1]="whatever" os ifs funcionam.
    Danke!

    Código:
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    int main (int argc, char *argv[]) {
            
        double x,y;
        cout << "Insira dois numeros separados por espaco:\n";
        cin >> x >> y;
        
    
                        if (argv[1]=="pow") {
                             cout << x <<"^"<< y << " = " << pow(x,y);
                             }
                        if (argv[1]=="mul") {
                             cout << x <<"*"<< y << " = " << x*y;
                             }
                        if (argv[1]=="div") {
                             cout << x <<"/"<< y << " = " << x/y;
                             }  
                        if (argv[1]=="sum") {
                             cout << x <<"+"<< y << " = " << x+y;
                             }
                        if (argv[1]=="diff") {
                             cout << x <<"-"<< y << " = " << x-y;
                             }
                             
    }
    
    
     
  2. HecKel

    HecKel The WORM

    Boas!

    O argv apenas é preenchido com os argumentos de quando executas o programa, por exemplo:

    ./programa umargumento doisargumentos tresargumentos

    É assim que o argv é preenchido, e tenho ideia que o array começa em zero..., experimenta a trocares o 1 por 0.

    abraços, HecKel

    EDIT: Outro problema, a comparação de strings com o == nem sempre funciona bem, sinceramente não me lembro do porquê mas sei que tem justificação :P

    Vê isto: http://www.cppreference.com/cppstring/compare.html
     
    Última edição: 3 de Março de 2007
  3. Neojag

    Neojag Power Member

    Viva!
    argv[0] é o nome do ficheiro que está a ser executado. Fazendo o output de argv[1] efectivamente ele tem o valor do argumento com que eu executei o programa, só que a comparação não funciona. Se definir o argv[1] dentro do programa, a comparação funciona perfeitamente. I don't get it O_o

    Edit: outra coisa que eu não percebi bem na passagem de argumentos na execução é que o array argv[] é um array de caracteres, mas cada um dos registos pode conter uma string...
     
    Última edição: 3 de Março de 2007
  4. HecKel

    HecKel The WORM

    Vê o link que meti no meu edit, certamente é esse o problema. Usa o compare em vez do ==.

    abraços, HecKel
     
  5. alph

    alph Power Member

    Claro, comparação directa de strings em C não existe.

    Em vez de argv[1]=="pow", faz strcmp(argv[1], "pow") == 0.
     
  6. Neojag

    Neojag Power Member

    Sim, ele com o strcomp está a funcionar, obrigado ;) O que é não percebo, é porque raio é que a comparação directa funciona se eu definir o valor do argumento dentro do programa!

    A propósito, arrays de caracteres não podem ser comparados directamente, mas variáveis do tipo "string" em c++ podem, correcto?
     
  7. alph

    alph Power Member

    Correcto. ;)
     
  8. guilherme

    guilherme Power Member

    Exactamente, só podes comparar tipos primitivos de dados, tal como int bool, string é um objecto, em c usas strcmp, tal como em java se usa o equals, em java esta muito bem definido o conceito de objecto pois quando defines uma variável string é com letra grande, tal como todos os objectos.
    Se recebesses os valores numéricos por argumento usavas o atoi e ai sim poderias comparar com o operador ==
     
  9. Psico_Mind

    Psico_Mind Banido

    Finalmente percebo porque é que é uma string é declarada em letra grande. :-D
     
  10. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    correcto, logo, se 'argv[1]' é do tipo 'char*' (array de caracteres) não podes comparar directamente. caso o quisesse fazer era só passar o valor de 'argv[1]' para uma string.
     
  11. TuxBoss

    TuxBoss Power Member

    Por acaso isso não é correcto.
    Se fizeres overload aos operadores podes redefinir os operadores básicos para serem utilizados com tipos "user defined", o que é uma boa prática de programação por vários motivos.
     
  12. alph

    alph Power Member

    Isso é C++, não C.
     
  13. TuxBoss

    TuxBoss Power Member

    Lol, é o que dá ler as coisas na diagonal, vi C++, strings com letra grande e a cena dos operadores e estava com outra tab aberta numa outra cena de C++ e olha.

    Tens toda a razão, operator overload só em C++.
     
  14. guilherme

    guilherme Power Member

    Entao estamos todos aqui para nos ajudar :)
    E sinceramente gosto do espirito aqui na parte de programação:)
    Confesso que tambem me fazia confusao quando comecei a aprender Java o porque de ser String e nao string :-D
    O que eu queria dizer era que se recebesse tambem os 2 valores por argumento usava o atoi apenas para converter e poder realizar operações numéricas.
     
    Última edição: 5 de Março de 2007

Partilhar esta Página