|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2006
Città: alessandria
Messaggi: 1693
|
[C] mai vista una cosa del genere
ciao a tutti, vi espongo brevemente qual'è il problema. . .sto facendo un programmino leggermente complesso (quantomeno piu del solito helloworld.c) ma mi capita una cosa incredibile. . .quando compilo ed eseguo il codice in universita' il programma gira perfettamente, quando invece compilo ed eseguo il medesimo codice a casa (sia sulla virtual machine che su una macchina dedicata) questo mi da una segmentation fault che a detta di gdb viene generata nel momento in cui faccio una fopen su un file. . .voi mi direte "be lo hai programmato male" e vi darei ragione visto che non sono proprio un fenomeno, ma com'è possibile che in uni funziona e a casa addirittura va in segmentation fault?. . .compilato con -Wall -pedantic non mi restituisce neanche un warning. . .ora se il programma non dovessi inviarlo al mio professore non ci sarebbero problemi, lo faccio andare in uni e chi si è visto si è visto. . .ma visto che il prof nelle migliori delle ipotesi lo compilera' sul suo portatile. . .puo' dipendere dalla versione di gcc? in uni usiamo fedora5 mi pare mentre a casa ho una suse virtuale e una mepis sul portatile. . .
__________________
Ho concluso affari positivamente con: Kawa, maxb81, pinok, DeicidE, borty, sprec13, Shandar, vtecb4st4rd, WhiteWolf42, feba, Bobosassa, devon_rex, cristianobon70, pingu79, Rospaccio, ces53, messmaker, iridio80, ilayu81, marcasso, imu, gianni165, Nike86, mojito |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
bla bla bla... sarebbe bastato incollare il sorgente correttamente formattato tra i tag CODE
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2006
Città: alessandria
Messaggi: 1693
|
ma sono 420 righe di codice. . .
__________________
Ho concluso affari positivamente con: Kawa, maxb81, pinok, DeicidE, borty, sprec13, Shandar, vtecb4st4rd, WhiteWolf42, feba, Bobosassa, devon_rex, cristianobon70, pingu79, Rospaccio, ces53, messmaker, iridio80, ilayu81, marcasso, imu, gianni165, Nike86, mojito |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
beh incolla solo la parte che secondo te dovrebbe contenere l'errore...
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Beh, fatto sta che senza codice noi non possiamo farci niente
![]() "Ti chiedi il come mai, ti chiedi il quasi quasi, dov'è la risposta? La risposta non la devi cercare fuori. La risposta è dentro di te ... epperò è sbagliata!" ![]()
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2006
Città: alessandria
Messaggi: 1693
|
grazie a tutti ho risolto
__________________
Ho concluso affari positivamente con: Kawa, maxb81, pinok, DeicidE, borty, sprec13, Shandar, vtecb4st4rd, WhiteWolf42, feba, Bobosassa, devon_rex, cristianobon70, pingu79, Rospaccio, ces53, messmaker, iridio80, ilayu81, marcasso, imu, gianni165, Nike86, mojito Ultima modifica di caustico : 31-01-2008 alle 17:39. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Mi sembra il classico caso di memoria inizializzata (generalmente tutta azzerata) in una piattaforma e NON inizializzata (quindi con valori casuali) nell'altro.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2006
Città: alessandria
Messaggi: 1693
|
e come potrei risolvere? cioè non alloco una struttura, non ancora perlomeno per cui cosa dovrei andare a inizializzare?
__________________
Ho concluso affari positivamente con: Kawa, maxb81, pinok, DeicidE, borty, sprec13, Shandar, vtecb4st4rd, WhiteWolf42, feba, Bobosassa, devon_rex, cristianobon70, pingu79, Rospaccio, ces53, messmaker, iridio80, ilayu81, marcasso, imu, gianni165, Nike86, mojito |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: May 2006
Città: alessandria
Messaggi: 1693
|
ho capito il problema. . .inizializzo una char descrizione[10000000] (lo avevo detto che non sono buono a programmare
![]()
__________________
Ho concluso affari positivamente con: Kawa, maxb81, pinok, DeicidE, borty, sprec13, Shandar, vtecb4st4rd, WhiteWolf42, feba, Bobosassa, devon_rex, cristianobon70, pingu79, Rospaccio, ces53, messmaker, iridio80, ilayu81, marcasso, imu, gianni165, Nike86, mojito |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
In pausa pranzo stavo controllando il tuo codice, ed avrei un paio di suggerimenti da dare: Codice:
void aggiungi_feed(){ char ind[100], tmp[10], str[100], cmd[]="wget -O tmp "; printf("\nInserisci l'indirizzo URL del feed da aggiungere ai preferiti\n"); scanf("%s", ind); strcpy(str,ind); strcat(cmd,str); system(cmd); Sempre nella stessa funzione: Codice:
fp = fopen("tmp", "r"); fgets(tmp, 6, fp); if(strcmp(tmp,"<?xml")==0){ fp=fopen("rss","a"); fprintf(fp,"\n"); fprintf(fp,ind); fclose(fp); printf("\nFeed aggiunto ai preferiti\n"); } else{ system("clear"); printf("\n\n\tL'indirizzo URL inserito non si riferisce a un feed, digita nuovamente 3 per riprovare\n"); } Supponi ora che le aperture dei file vadano bene. Siccome usi la variabile fp per entrambi i file, quando eseguirai la seconda fopen() ti perderai il file precedente, senza aver nemmeno la possibilita' di chiuderlo. Pertanto, siccome il numero di file che puoi aprire e' limitato, ad un certo punto il tuo programma non potra' piu' aprire file, e siccome non hai fatto il controllo sull'esito dell'apertura, andra' in crash. Attenzione che questo tipo di crash e' di quelli che definisci "stranissimi": sono effettivamente difficili da trovare semplicemente analizzando l'output (del tipo "perche' funzionava correttamente fino a 10 min. fa ed ora va in crash?") Codice:
void memorizza(char *in){ char tmp[5], titolo[500], descrizione[10000000], link[500], data[55], enclosure[500],type[500]; char fine; Per risolverlo, prima di tutto valuta se e' davvero necessario avere una variabile cosi' grande (sai, l'hai chiamata descrizione....). In secondo luogo, puoi valutare se allocare dinamicamente o metterla globale/statica. Anche in questa funzione apri un file senza controllare, ma ne abbiamo gia' parlato. ATTENZIONE - attento al "gioco" che fai chiamando leggi_file() che richiama apri_file() che a sua volta richiama leggi_file(). Non e' sano. Controlla se puoi risolvere in altro modo (sicuramente lo puoi fare).
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: May 2006
Città: alessandria
Messaggi: 1693
|
innanzi tutto grazie sottovento passo subito a qualche delucidazione,allora: non faccio ulteriori controlli che il file sia stato aperto correttamente o meno all'interno della apri_file perchè questi vengono fatti dalla void controlla_input che passa alla apri_file solo nel caso in cui l'apertura avviene con successo; per quanto riguarda il gioco che faccio chiamando leggi_file() che richiama apri_file() che a sua volta richiama leggi_file() pur convenendo con te che non sia il massimo è l'unica soluzione pseudoplausibile che mi è venuta in mente per permettere al programma di non uscire dall'esecuzione qualora non venga passato un argomento durante l'esecuzione o nel caso in cui il file specificato non esista. . .per quanto riguarda il resto hai ragionissima su tutta la linea, la var descrizione contiene quello che c'è all'interno dei campi <description></description> di un rss, di conseguenza non ha una lunghezza fissa, e pur essendo discretamente grande non è infinito. . .quindi di sicuro se lo sapessi fare char descrizione sarebbe una var dinamica. . .
__________________
Ho concluso affari positivamente con: Kawa, maxb81, pinok, DeicidE, borty, sprec13, Shandar, vtecb4st4rd, WhiteWolf42, feba, Bobosassa, devon_rex, cristianobon70, pingu79, Rospaccio, ces53, messmaker, iridio80, ilayu81, marcasso, imu, gianni165, Nike86, mojito |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
per quanto riguarda leggi_file() e apri_file() direi che cambiare non e' difficilissimo. Tutto sommato, visto che apri_file() e' chiamata in due punti soltanto (uno di questi e' appunto leggi_file()) potresti semplicemente scrivere: Codice:
void apri_file(char *i) { char s[20]="wget -O file "; char op[500], str[500]; fp=fopen(i,"r"); while (fp == NULL) { printf("Il File non esiste!!!\n"); leggi_file(i); fp=fopen(i,"r"); } Non spaventarti se leggi_file contiene solo un paio di righe di codice: e' segno che stai andando nella direzione giusta. Inoltre otterrai anche il vantaggio che le funzioni, cambiate in questo modo, fanno esattamente quello che il loro nome suggerisce, e non qualcosa di piu'. Per questo stesso motivo, mi permetterei di suggerirti di togliere la chiamata ad apri_file da controlla_input(). Fai fare a controlla_input() solo il controllo e fagli ritornare un risultato. Usa poi questo esito per chiamare o meno la apri_file(). Altro suggerimento: spesso trovare gli errori run time e' piuttosto difficile. Invece che fare una printf ("Il file non esiste\n") (che potrebbe non esser vero, magari il problema e' un altro), scrivi Codice:
perror ("non posso aprire il file"); Per quanto riguarda la tua descrizione, puoi fare come ti e' stato suggerito prima: dichiarare quel campo come puntatore a char (del tipo char *descrizione) e scrivere: Codice:
void memorizza(char *in) { char tmp[5], titolo[500], *descrizione, link[500], data[55], enclosure[500],type[500]; descrizione = (char *)malloc (10000000); if (descrizione == NULL) { printf ("Impossibile allocare memoria per la descrizione!!\n"); // Non usare perror qui! // Esegui ora qualche altra operazione. Non puoi seguire il normale flusso di esecuzione. } ... qui usi la memoria ... free (descrizione); // Restituisci la memoria al sistema
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6183
|
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:09.