Problemas com argumentos da Linha de comando

Problemas com argumentos da Linha de comando

por Bruno Pfefferkorn -
Número de respostas: 10

Olá! Estou tendo problemas quando eu compilo um simples exemplo para armazenar nL, nC, nB e semente. quando eu atribuo o valor de argv[1] e argv[2] às variáveis, tudo corre bem, mas quando eu adiciono duas novas atribuições de argv[3] e argv[4], eu compilo e após a janelinha do dos abrir, aparece uma janelinha de erro de aplicativo: "A instrução no "0x77bfeab" fez referência à memória no "0x000c01ca". A memória não pôde ser "read". Clique em 'Ok' para encerrar o programa. Clique em 'Cancelar' para depurar o programa". Isso é algum problema com a minha máquina ou há algo de errado no script? (segue abaixo):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{  char nL, /* número de linha da matriz */
        nC, /* número de colunas da matriz */
        nB, /* número de bombas */
        semente; /* semente a ser usada */
   
    nL = atoi(argv[1]);
    nC = atoi(argv[2]);
    nB = atoi(argv[3]);
    semente = atoi(argv[4]);
   
    printf("%d %d %d %d", nL, nC, nB, semente);


    return 0;
}

Em resposta à Bruno Pfefferkorn

Re: Problemas com argumentos da Linha de comando

por Wellington Castello -
Se você usou atoi então nL, nC, nB e semente deveriam ser ints e não chars.

int atoi(const char *nptr);
Em resposta à Wellington Castello

Re: Problemas com argumentos da Linha de comando

por Bruno Pfefferkorn -
Obrigado pela dica, Wellington, mas infelizmente o problema persiste.. =/
Em resposta à Bruno Pfefferkorn

Re: Problemas com argumentos da Linha de comando

por Wellington Castello -
Não sei dizer, o seu programa compila e roda normalmente aqui depois de trocar o char pra int triste

wcastello@ubuntu:~$ gcc -o bla -pedantic -ansi -Wall -O2 bla.c
wcastello@debian:~$ ./bla 1 2 3 4
1 2 3 4
wcastello@ubuntu:~$

Nunca usei o DevCpp no windows e não sei bem o que acontece, mas quando você compila o programa ele já roda em seguida?

Porque o seu programa não testa se os argumentos foram dados na linha de comando, e nesse caso, uma tentativa de acesso a argv[i], i = 1, 2, 3 daria um segmentation fault no linux (um erro ao acessar a memória, que é o que está acontecendo aí também).

Tente colocar um teste antes de atribuir as variáveis, do tipo:

if(argc < 4) {
printf("Uso: %s <nL> <nC> <nB> <semente>\n",argv[0]);
exit(EXIT_FAILURE); /* ou return 1; */
}

Isso vai garantir que a atribuição só aconteça se argv[i], i = 1, 2, 3, realmente apontar para locais válidos.

Até mais!

Em resposta à Wellington Castello

Re: Problemas com argumentos da Linha de comando

por Carlos Hitoshi Morimoto -
voce testou a recomendacao do Welington?
tambem me parece que seu programa esta tentando acessar algo que nao existe, por exemplo, voce pode nao estar passando parametros suficientes para o programa.
tente passar ate mais parametros que voce precisa, sempre colocando um espaco em branco entre os numeros, e imprima tambem o valor do argc
antes de acessar os argv's.
ht

ps: exemplo
prog 1 2 3 4 5 6

nao pode ser
prog 123456

Em resposta à Bruno Pfefferkorn

Re: Problemas com argumentos da Linha de comando

por Carlos Hitoshi Morimoto -
Como você está chamando o programa (ou como/o que voce passa ao programa), se o devcpp abre a janelinha do dos para voce?
ht

Em resposta à Carlos Hitoshi Morimoto

Re: Problemas com argumentos da Linha de comando

por Bruno Pfefferkorn -

Professor,

Eu compilo no Devcpp, assim, é criado um arquivo executável. Aí então eu abro o DOS e digito

nome_do_programa.exe 1 2 3 4 ...

e aí o aviso aparece...
Em resposta à Bruno Pfefferkorn

Re: Problemas com argumentos da Linha de comando

por Tatiane Casanova Penteado -
Bom se vc ja colocou int para nL, nC, nB e semente, e se no DOS ja tirou o .exe do nome do arquivo como vc croda no Dev talvez seja melhor colocar:
system("PAUSE");
antes do:
return 0;
Espero que ajude!