Newsgroup: it.comp.os.linux.development
Titolo: Argc...

Salve,
uso da poco Linux, e gia ne sono entusiasta.
Ho compilato un sorgente C col GCC, il programma funziona benissimo.
Solo che, se da riga di comando non gli do tutti gli argomenti richiesti
ricevo il messaggio: Segmentation Fault (core dumped).
Per il dos, avevo inserito questa istruzione
if(argc < 7)
        {
          printf("\n Uso corretto del programma......);
           exit(1);
        }
e la eseguiva correttamente,mentre il GCC non la vede affatto..
Evidentemente sbaglio io in qualcosa.
Ringrazio anticipatamente chi volesse aiutarmi.

 Evidentemente sbaglio io in qualcosa.
...evidentemente! ;) 
In ogni caso, le informazioni che dai sono poche, ti consiglio di provare 
a debuggare il programma con gdb o, se ti piace l'interfaccia grafica, 
ddd.
 
-- 
HappyCactus - Registered Linux User #209744
http://utenti.tripod.it/happycactus

 Ringrazio anticipatamente chi volesse aiutarmi.
Postando un po' di codice, molto volentieri. Altrimenti
piu' di cosi' e' dura :-)
C:\>iao Angelo
[1] In lang.c c'e' stato un thread piuttosto infuocato per
    un carattere ';' dopo un if(). Non questo anche il tuo
    caso?
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 e la eseguiva correttamente,mentre il GCC non la vede affatto..
Penso che sia molto probabile che il problema stia prima della if(argc <
7).
Il programma tenta di accedere ad un'area di memoria protetta, prima di
fare il test sulla correttezza dei parametri. Probabilmente si tratta di
una qualche operazione sulle stringhe puntate da argv[x]. Controlla il
codice, oppure postalo.
Probabilmente in DOS non ti da problemi perche' il DOS e' monoutente.
Perlomeno non ti da problemi finche' il valore del puntatore al
parametro mancante non assume (del tutto casualmente) valori
corrispondenti ad aree critiche del sistema.
Ciao
kalb

 piu' di cosi' e' dura :-)
 Vi ringrazio,eccovi un po di codice...
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
        strcpy (stringa, argv[1]);
        step=atoi(argv[2]);
        jump=atoi(argv[3]);
        start=atoi(argv[4]);
        end=atoi(argv[5]);
        filtro=atoi(argv[6]);
        if(argc < 7)
        {
          printf("\n vis_mat ruota step jump start end filtro");
          printf("\n ESEMPIO: vis_mat b 13 104 1 2000 1");
          return 0;
        }
        f_d[0] = open("ba._x_", O_RDONLY);
        f_d[1] = open("fi._x_", O_RDONLY);
        f_d[2] = open("ve._x_", O_RDONLY);
        if(f_d[p] == -1)
        {
           printf("\n Impossibile aprire il file %d",f_d[p]);
           exit(1);
        }
   }
Per compilare:
gcc mio_file.c -o mio_file
Quando eseguo il programma:
./mio_file.......
Saluti
Michele

         filtro=atoi(argv[6]);
Mi sembra strano che te lo compili, visto che non hai dichiarato nessuna
delle variabili che usi...
Ma se per caso hai omesso nel messaggio le righe di codice nelle quali
dichiari le variabili, controlla che i tipi corrispondano all'utilizzo
che poi ne fai.
Infine, perche' non controllare la validita' dei parametri *prima* di
utilizzarli?
Ciao.
kalb

         if(argc < 7)
Ovviamente devi controllare prima che gli argomenti siano stati immessi, 
se no vai a leggere puntatori che non son validi. devi quindi porre l'if 
prima della strcpy...
BTW, meglio sarebbe utilizzare la strncpy, onde evitare spiacevoli buffer 
overflows...


 overflows...
Saggio consiglio anche questo.
C:\>iao Angelo.

 non gradisce.
La mia non vuole essere una critica, ma solo una domanda per curiosita': 
sei sicuro che in questo caso argv[1] valga NULL?
Cosi' a naso mi verrebbe da dire che possa avere un valore casuale dato 
dalla specifica configurazione della memoria nel momento dell'esecuzione. 
Oppure l'array di puntatori viene sempre inizializzato a NULL?
Ripeto, e' solo una curiosita (e anche un po' OT, e per questo mi scuso).
Grazie.
kalb


I'm not prejudiced, I hate everyone equally.

 Ripeto, e' solo una curiosita (e anche un po' OT, e per
  questo mi scuso).
Spero sia stata soddisfatta :-)
C:\>iao Angelo


 corrispondenti ad aree critiche del sistema.
Ed anche  in questo  caso, non  avresti un errore  (tipo il  segfault di
linux). Sotto DOS puoi  anche sovrascrivere aree dati  dell'OS senza che
questo faccia un piega (al massimo si pianta tutto).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Quando un uomo porta dei fiori a sua moglie senza motivo, 
un motivo c'e`.