|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Trieste
Messaggi: 366
|
[C] Segmentation Fault e fopen
Ciao a tutti, sto cercando di fare qualche esercitazione con utilizzo di file.
Questo è il sorgente: Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* main (char* file1, char* file2, char valute){
char valuta[20];
char* ris=NULL;
double tax1, tax2;
double incremento;
char valutacercata[20];
printf ("valuta cercata?");
scanf ("%s", valutacercata);
FILE *fp1, *fp2;
fp1 = fopen (file1 , "r");
fp2 = fopen (file2 , "r");
while (fscanf (fp1, "%*s" "%s" "%lf", valuta, &tax1) != EOF){
fscanf (fp2, "%*s" "%*s" "%lf", &tax2);
if (strcmp (valuta, valutacercata) == 0){
incremento = ((tax2-tax1)/tax1);
if (incremento >= 0.01)
ris = "In rialzo";
else if (incremento <= -0.01)
ris = "In ribasso";
else ris = "stabile";
break;
}
}
fclose (fp1);
fclose (fp2);
return ris;
}
Codice:
USA Dollaro 0.750 GB Sterline 0.609 Svizzera Franco 1.309 Inoltre, utilizzando la funzione fopen basta inserirli nella stessa directory dell'eseguibile i file?
__________________
Macbook Pro '09 - 15" - 2,66Ghz - 9400m + 9600m gt - 8Gb ddr3 - 250GB samsung 840 + 1TB hdd |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
|
Mmmm ma il compilatore non di da alcun errore? Perchè la definizione della funzione main che ritorna un intero e accetta quei parametri mi pare strana.
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20" Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Trieste
Messaggi: 366
|
No, non ricevo alcun error, solo un warning che consiglia appunto di cambiare il tipo di main in int.
__________________
Macbook Pro '09 - 15" - 2,66Ghz - 9400m + 9600m gt - 8Gb ddr3 - 250GB samsung 840 + 1TB hdd |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Abilita SEMPRE i warning (in GCC: -W -Wall) e dagli SEMPRE retta.
In questo caso il prototipo standard del main è questo: Codice:
int main(int argc, char *argv[]); Codice:
int main(); In questo caso il programma ti esplode perché tratti il primo parametro (che è un intero) come un puntatore a stringa, ed il secondo parametro (che è un puntatore ad un vettore di stringhe) come un puntatore a stringa... Quindi, nel momento in cui cerchi di aprire il file "file1" vai a leggere delle zozzerie in memoria e ti esplode tutto. Prova così: Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
M_RIALZO,
M_RIBASSO,
M_STABILE,
M_COUNT
};
static const char const *messages[M_COUNT] = {
"In rialzo",
"In ribasso",
"Stabile"
};
int main(int argc, char *argv[])
{
const char *result = messages[M_STABILE];
char valuta[20];
char valutaCercata[20];
double tax1, tax2;
/*
* Non contare il primissimo parametro, che contiene
* sempre il comando col quale è stato lanciato
* l'eseguibile, e che qui non ci serve a niente.
*/
--argc;
++argv;
if (argc != 2) {
fprintf(stderr, " [**] Ho bisogno di esattamente due parametri!\n");
return EXIT_FAILURE;
}
/*
* TODO: scanf() non controlla la lunghezza massima
* della stringa, sarebbe consigliabile usare fgets().
*/
printf("Valuta cercata? ");
scanf("%s", valutaCercata);
/*
* TODO: controllare che l'apertura riesca correttamente!
*/
FILE *fp1 = fopen(argv[0], "r");
FILE *fp2 = fopen(argv[1], "r");
while (fscanf(fp1, "%*s" "%s" "%lf", valuta, &tax1) != EOF) {
fscanf(fp2, "%*s" "%*s" "%lf", &tax2);
if (strcmp(valuta, valutaCercata) == 0) {
double h = ((tax2 - tax1) / tax1);
if (h >= 0.01) {
result = messages[M_RIALZO];
}
else if (h <= -0.01) {
result = messages[M_RIBASSO];
}
break;
}
}
fclose(fp1);
fclose(fp2);
printf("%s\n", result);
return EXIT_SUCCESS;
}
P.S.: andrebbe ancora migliorato, eh. Intanto ti ho lasciato scritto qualche appunto lì nei commenti, e poi ci sarebbero ancora delle piccole modifiche da fare. A te il divertimento.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 25-05-2010 alle 18:49. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Trieste
Messaggi: 366
|
Molto
molto molto interessante. Grazie mille, anche se mi è ancora decisamente complicato il codice che hai scritto. Cioè, comprensibile, ma non sarei mai riuscito a scrivere qualcosa di simile (certe parti di codice non le ho mai viste..) Prendo il manuale e lo decifro per benino. Molto bravo!
__________________
Macbook Pro '09 - 15" - 2,66Ghz - 9400m + 9600m gt - 8Gb ddr3 - 250GB samsung 840 + 1TB hdd |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Grazie!
Figurati, non è niente di che. Sicuramente troverai tutto (e di più) su un buon manuale, se ti restano dubbi chiedimi pure.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:32.




















