Pagina 1 di 2
[RISOLTO]Warning che non capisco in C
Inviato: gio 22 ott 2009, 0:23
da Slack_Eater
Ciao a tutti,
dopo aver compilato un programma in C mi appaiono questi warning:
Codice: Seleziona tutto
In file included from main.c:3:
log.c: In function 'append_error_log':
log.c:12: warning: comparison between pointer and integer
log.c:15: warning: comparison between pointer and integer
La funzione incriminata è questa
Codice: Seleziona tutto
void *append_error_log(char *message, int *warn){
char level[10];
if(warn == 0){
strcpy(level,"ERROR");
}
else if(warn == 1){
strcpy(level,"WARNING");
}
else if(warn == 2){
strcpy(level,"LOG");
}
//open the file for writing at the end of the stream
FILE *log;
log = fopen("lcud.log", "a");
fprintf(log, "[ %s ] %s: %s\n", return_time(), level, message);
}
Le linee 12 e 15 sono i due else if.
Se qualcuno piu esperto mi puo togliere questa curiosità!
Grazie!

Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 0:29
da Blallo
prova a sostituire nei due controlli al posto di warn => (*warn)
warn è un puntatore, quando gli dici warn == x (con x=numero qualunque)
tu confronti l'indirizzo di memoria puntato con x
se invece fai (*warn) == x gli dici "ciò che è puntato", ovvero il numero intero che ti interessa
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 0:54
da Slack_Eater
Mettendo *warn non mi ritorna nessun warning, però quando faccio partire il programma mi da
un "Segmentation Fault".
Grazie!
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 0:59
da Blallo
hai messo pure le parentesi?
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 1:04
da Slack_Eater
Si ho messo anche le parentesi (*warn)

Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 1:06
da Slack_Eater
mhhhh...allora ho trovato una cosa strana, se faccio cosi:
Codice: Seleziona tutto
if((*warn) == 0){
strcpy(level,"ERROR");
}
else if((*warn) == 1){
strcpy(level,"WARNING");
}
else if((*warn) == 2){
strcpy(level,"LOG");
}
mi da "Segmentation Fault".
Se faccio cosi:
Codice: Seleziona tutto
if(warn == 0){
strcpy(level,"ERROR");
}
else if((*warn) == 1){
strcpy(level,"WARNING");
}
else if((*warn) == 2){
strcpy(level,"LOG");
}
Funziona, è come se lo zero non fosse un intero, perchè anche nei warning quella linea non appariva.
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 1:09
da Blallo
se posti tutto il listato vediamo un po' insieme di capire perchè di questo strano comportamento..
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 1:11
da Blallo
oltretutto puoi anche alleggerirti il codice, ma per un mero fattore estetico che però fa sempre comodo (meglio è scritto più è facile da leggere)
Codice: Seleziona tutto
if(warn == 0)
strcpy(level,"ERROR");
else if((*warn) == 1)
strcpy(level,"WARNING");
else if((*warn) == 2)
strcpy(level,"LOG");
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 1:42
da Slack_Eater
Allora:
main.c
Codice: Seleziona tutto
#include "lcud_header.h"
#include "func.c"
#include "log.c"
int main(int argc, char **argv){
send_output_error();
append_error_log("Test", 0);
return(0);
}
lcud_header.h
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
func.c
Codice: Seleziona tutto
//function return the current time
char *return_time(){
time_t result;
result = time(NULL);
struct tm* brokentime = localtime(&result);
return asctime(brokentime);
}
log.c
Codice: Seleziona tutto
void send_output_error(){
printf("Error");
}
void *append_error_log(char *message, int *warn){
char level[10];
if(warn == 0)
strcpy(level,"ERROR");
else if((*warn) == 1)
strcpy(level,"WARNING");
else if((*warn) == 2)
strcpy(level,"LOG");
//open the file for writing at the end of the stream
FILE *log;
log = fopen("lcud.log", "a");
fprintf(log, "[ %s ] %s: %s\n", return_time(), level, message);
}
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 1:49
da Blallo
Mmmm...dal basso della mia poca esperienza..
non capisco perchè dichiari sia il char che l'int come puntatori, non serve dichiararli così
perchè l'int non lo devi modificare, e il char essendo lui stesso un puntatore ad un indirizzo di memoria anche senza essere scritto con * (grande "difetto" del C che poi difetto non è) non serve che li scrivi quindi con l'*.
toglili e togli le parentesi e l'* ai warn. Vedi se gira
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 7:59
da ulisse89
@jimmy_page89
Per l'int hai ragione perchè se fa solo dei confronti è inutile passarlo per riferimento. Per il char invece fa bene a mettere l'asterisco, perchè gli passa una stringa, cioè un puntatore a carattere.
@Slack Eater
La butto lì, perchè è un po' che non faccio il C. Tu nel main passi alla funzione appen_error_log una stringa di 4 caratteri. Non è che quando vai a fare la strcpy e ci metti dentro stringhe più lunghe ti provoca il segmentation fault?
Per vedere se è così prova a dichiarare nel main una stringa di 10 caratteri e ci metti dentro "Test". La passi alla funzione e vedi se adesso che è più lunga fa ancora il problema.
Re: Warning che non capisco in C
Inviato: gio 22 ott 2009, 13:06
da Slack_Eater
Grazie per le risposte, allora:
@ulisse89
La stringa non è il problema perche avevo gia provato in precedenza con stringhe piu lunghe e funzionava
@jimmy_page_89
Avevi ragione, senza passargli l'int come puntatore funziona tutto senza warning.
Problema Risolto!
Grazie!

Re: [RISOLTO]Warning che non capisco in C
Inviato: gio 22 ott 2009, 14:59
da Breier
Just to add some English:
WARNING is not ERROR
Since "warning" is just advertising you, you may not experience errors using the program if you just ignore it.
PS.: You may even find the same "pointer warning" when compiling kernel source from linux
see ya

Re: [RISOLTO]Warning che non capisco in C
Inviato: gio 22 ott 2009, 15:33
da ulisse89
You're right, but a warning is often a symptom that something will not work properly at run-time. Especially in this case, he was comparing a pointer to an integer. Since a pointer is an integer (is an address), the compiler gives you only a warning, but at run-time the program will not work very well.

Re: [RISOLTO]Warning che non capisco in C
Inviato: gio 22 ott 2009, 18:29
da Slack_Eater
Yeah,
with that WARNING the program runs anyway, but I don't like WARNING
