Repository 32bit  Forum
Repository 64bit  Wiki

[RISOLTO]Warning che non capisco in C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 » gio ott 22, 2009 0: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 13:06, modificato 1 volta in totale.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 22: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: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: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 0: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 22: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:59

hai messo pure le parentesi?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 1: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 22: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 1: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 22: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 1: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: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Warning che non capisco in C

Messaggioda Blallo » gio ott 22, 2009 1: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: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Warning che non capisco in C

Messaggioda Slack_Eater » gio ott 22, 2009 1: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 22: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 1: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: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: Warning che non capisco in C

Messaggioda ulisse89 » gio ott 22, 2009 7: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 13: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 13: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 22: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 14: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 5: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 15: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 13: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 18: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 18:42, modificato 1 volta in totale.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 22: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 1 ospite