Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154

    [C] problema con argc e argv

    Ciao a tutti.
    Vorrei passare dei parametri nella chiamata del mio programmino, ma non riesco a capire perchè cavolo non fa quello che voglio io!!!
    Questa è parte del codice:
    codice:
    ...
    if(argv[1] == "x")
    		nomeFile = "/home/Andrea/dati.txt";
    	else
    		nomeFile = argv[1];
    	numNodi = atoi(argv[2]);
    	numGrafi = atoi(argv[3]);
    	if(argv[4] == "a") // apertura file in appendice
    				tipoAperturaFile = 'a';
    			else
    			if(argv[4] == "w") // apertura file in scrittura
    				tipoAperturaFile = 'w';
    			else{ // errore
    				printf("Errore nel passare il tipo di scrittura su file!\n");
    				return 0;
    			}
    ...
    La chiamata dovrebbe essere tipo:
    codice:
    ./a.out x 10 2 a
    per il percorso di default del file, altrimenti
    codice:
    ./a.out path/dati.txt 10 2 a
    Il problema è che mi dà come percorso "x" nel caso del passaggio veloce del path (invece di "home/Andrea/dati.txt"), e nell'if di argv[4] ricevo sempre il printf di errore (cioè tipoAperturaFile non me lo pone ad 'a' che in questo caso gli passo nella chiamata).
    Per quanto riguarda argv[2] e argv[3] va tutto ok.
    Qualcuno può farmi un po' di luce?

  2. #2
    Controlla l'ordine degli argomenti passati...
    Questo può aiutarti a chiarirti le cose :

    codice:
      for(int i=0; i < argc; i++)
        printf("argv[%i] = %s\n", i, argv[i]);
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    è sulla condizione dell'if che sbaglia
    usi == per confrontare una array di char e un carattere
    prova
    codice:
    if(strcmp(argv[1],"X") == 0)
         fai qualcosa
    ...
    cmq il suggerimento di samuele_70 è giusto...prova a vedere che parametri hai passato ciclando su argv[i]

    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  4. #4
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Ecco la stampa:
    codice:
    [Andrea@MSHOME ~]$ ./a.out x 10 2 w
    argv[0] = ./a.out
    argv[1] = x
    argv[2] = 10
    argv[3] = 2
    argv[4] = w
    nomeFile: /home/Andrea/dati.txt
    Cmq sembra andare con strcmp. Non capisco come mai. Non dovrebbe solo controllare se le due stringhe hanno la stessa lunghezza? Qui invece se ho ben capito mi vede se le due stringhe sono uguali!
    Ah, a proposito... grazie 1000!

  5. #5
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    infatti è giusto proprio strcmp...
    se usi l'operatore == esegui il test su puntatori, e quindi il test di uguaglianza è considerato positivo quando i puntatori individuano la medesima locazione di memoria...

    poiché sicuramente argv[1] punta a una locazione diversa rispetto a "x" stringa(che di solito viene memorizzato nell'heap del programma)... il test sicuramente fallisce


    ciò sonno

    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  6. #6
    Originariamente inviato da Alcott
    Ecco la stampa:
    codice:
    [Andrea@MSHOME ~]$ ./a.out x 10 2 w
    argv[0] = ./a.out
    argv[1] = x
    argv[2] = 10
    argv[3] = 2
    argv[4] = w
    nomeFile: /home/Andrea/dati.txt
    Cmq sembra andare con strcmp. Non capisco come mai. Non dovrebbe solo controllare se le due stringhe hanno la stessa lunghezza? Qui invece se ho ben capito mi vede se le due stringhe sono uguali!
    Ah, a proposito... grazie 1000!
    Forse ti sei un pò confuso...
    codice:
       int lunghezza = strlen( stringa );
    Restituisce la lunghezza di una stringa
    codice:
       int res = strcmp(stringa1, stringa2);
    Restituisce (secondo le regole lessicografiche):
    codice:
       Minore di 0 se stringa1 < stringa2
                 0 se stringa1 = stringa2
     Maggiore di 0 se stringa1 > stringa2
    Le istruzioni che avevi scritto :
    codice:
       ...
       if(argv[4] == "a") // apertura file in appendice
       ...
    
       ...
       if(argv[4] == "w") // apertura file in scrittura
       ...
    Entrambe darebbero sempre falso come risultato (puoi provare) perchè esse confrontano i puntatori alle stringhe
    non il loro contenuto.
    Potresti usare quel modo confrontando però ogni singolo carattere
    di ogni stringa con quello dell' altra es:
    codice:
       if( stringa1[0] == stringa2[0] )
    ...oppure ...
       if( stringa1[0] == 'w' ) // dati char tra apici singoli !
    Sicuramente più comodo 'strcmp()'
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Originariamente inviato da byaur
    infatti è giusto proprio strcmp...
    se usi l'operatore == esegui il test su puntatori, e quindi il test di uguaglianza è considerato positivo quando i puntatori individuano la medesima locazione di memoria...

    poiché sicuramente argv[1] punta a una locazione diversa rispetto a "x" stringa(che di solito viene memorizzato nell'heap del programma)... il test sicuramente fallisce


    ciò sonno

    He he he ... Mi hai battuto sul tempo ...

    Mi sa che ciò più sonno io
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061

    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.