Repository 32bit  Forum
Repository 64bit  Wiki

[RISOLTO]Warning che non capisco in C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[RISOLTO]Warning che non capisco in C

Messaggioda Slack_Eater » mer ott 21, 2009 23:23

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! :thumbright:
Ultima modifica di Slack_Eater il gio ott 22, 2009 12:06, modificato 1 volta in totale.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Warning che non capisco in C

Messaggioda Blallo » mer ott 21, 2009 23:29

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Warning che non capisco in C

Messaggioda Slack_Eater » mer ott 21, 2009 23:54

Mettendo *warn non mi ritorna nessun warning, però quando faccio partire il programma mi da
un "Segmentation Fault".

Grazie!
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Warning che non capisco in C

Messaggioda Blallo » mer ott 21, 2009 23:59

hai messo pure le parentesi?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 0:04

Si ho messo anche le parentesi (*warn) :thumbright:
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 0:06

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.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Warning che non capisco in C

Messaggioda Blallo » gio ott 22, 2009 0:09

se posti tutto il listato vediamo un po' insieme di capire perchè di questo strano comportamento..
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Warning che non capisco in C

Messaggioda Blallo » gio ott 22, 2009 0:11

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");
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 0:42

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);
}
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Warning che non capisco in C

Messaggioda Blallo » gio ott 22, 2009 0:49

Mmmm...dal basso della mia poca esperienza..
Codice: Seleziona tutto
void *append_error_log(char *message, int *warn)

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3226
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: Warning che non capisco in C

Messaggioda ulisse89 » gio ott 22, 2009 6:59

@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.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 12:06

Grazie per le risposte, allora:

@ulisse89
La stringa non è il problema perche avevo gia provato in precedenza con stringhe piu lunghe e funzionava :thumbright:

@jimmy_page_89
Avevi ragione, senza passargli l'int come puntatore funziona tutto senza warning. :thumbright:

Problema Risolto!

Grazie! :thumbright: :thumbright:
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: [RISOLTO]Warning che non capisco in C

Messaggioda Breier » gio ott 22, 2009 13:59

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 :shock:

see ya 8)
Avatar utente
Breier
Linux 1.0
Linux 1.0
 
Messaggi: 40
Iscritto il: dom set 13, 2009 4:56
Località: Brazil
Slackware: 13.0
Kernel: 2.6.31.1
Desktop: Xfce-4.6
Distribuzione: Slackware64

Re: [RISOLTO]Warning che non capisco in C

Messaggioda ulisse89 » gio ott 22, 2009 14:33

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. :D
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: [RISOLTO]Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 17:29

Yeah,

with that WARNING the program runs anyway, but I don't like WARNING :D
Ultima modifica di Slack_Eater il gio ott 22, 2009 17:42, modificato 1 volta in totale.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti