Newsgroup: it.comp.lang.c
Titolo: 0 error(s), 0 warning(s) ... eppure non va!

Contiuno a dilungarmi sul capitolo dei puntatori, perchè
percepisco che afferrarlo bene non mi è semplice.
Faccio un ennesima prova: il compliatore dice tutto ok (
pag92-cap5.exe - 0 error(s), 0 warning(s) ) , poi lancio l'exe e
si pianta!
Cosa sbaglio in queste poche e semplici righe?
..è veramente scoraggiante quando in 6 righe non riesco ad
individuare l'errore...
#include <stdio.h>
int main(){
char par[]="nicola";
char *p;
p=par;
printf("%s",*p);
}
-- 
Inviato da Virgilio 
http://newsgroup.virgilio.it
..un servizio di news via web con in piu' l'antispam

 }
intanto se ti da 0 warning vuol dire che
non hai settato l'opzione con la quale ti deve dare
tutti i warning.... (rileggi le opzioni del tuo compilatore).
Infatti anche solo il fatto che il main sia
definito come int, ma tu alla fine dimentichi
il classico return 0;
dovrebbe essere sufficente a generare un warning.
Comunque l'errore e' nel fatto che
p e' un puntatore a char quindi per stamparlo
come stringa devi passargli p e non *p,
quindi printf("%s\n", p);
(Ho aggiunto un \n per mandare a capo...)
tieni conto che come valore *p corrisponde
al primo carattere puntato da p, quindi
il comportamento di printf("%s", *p) e':
prendi il primo carattere di "nicola", ovvero 'n',
convertilo in intero, e usa questo valore come puntatore...
(perche' "%s" si aspetta un puntatore) quindi ovviamente
il programma si pianta.
ciao,
e.

}
sbagli con i formattatori.
printf("%s",p) per stampare la stringa o
printf("%c",*p) per stampare un singolo carattere.
ricorda che *p serve ad ottenere il primo elemento dell'array non
l'intero array.

 }
Mi aggiungo alla lista delle repliche :-) dicendoti che purtroppo la 
teoria dell'informatica ci dice che non potra' mai essere scritto un 
compilatore che utilizzando controlli sintattico/semantico sappia anche 
dirti se un programma e' corretto o meno :-). Quindi, l'"eppure" e'... 
sbagliato, in un certo senso ;D
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

 sbagliato, in un certo senso ;D
Aggiungo che questo non vale solo per i linguaggi di programmazione ma per
qualsiasi linguaggio articolato: un conto è la "grammatica", un altro la
"semantica".
Di fronte alla frase "Gli elefanti depongono le uova sugli alberi", un
professore di italiano (il "compilatore") non troverebbbe niente da ridire
in quanto non c'è nessun errore di ortografia, grammatica o sintassi. Ma un
professore di zoologia (la "CPU") ti piglierebbe a male parole.
--
Cingar
P.S. Come sanno tutti, gli elefanti non salgono sugli alberi, per cui le
uova le deporranno senz'altro a terra.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 uova le deporranno senz'altro a terra.
:-) LOL

 dovrebbe essere sufficente a generare un warning.
Hmmm... non necessariamente.
Credo che la conformità allo standard ISO non preveda il sollevamento di
un warning.  Bada che il comportamento di un particolare compilatore non è
sufficiente a tirar fuori una regola.  Qualcuno più saggio di me in
materia di "compliance" sa dirmi se mi sbaglio ?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 un warning.
Lo standard non dice esattamente quali siano i warning da generare,
specifica solo alcune situazioni in cui un compilatore conforme deve
farlo:
"A conforming implementation shall produce at least one diagnostic
message (identified in an implementation-defined manner) if a
preprocessing translation unit or translation unit contains a violation
of any syntax rule or constraint, even if the behavior is also
explicitly specified as undefined or implementation-defined. Diagnostic
messages need not be produced in other circumstances."
Sulla return mi pare proprio che si stia violando un constraint:
6.8.6.4 The return statement
Constraints
1 A return statement with an expression shall not appear in a function
  whose return type is void. A return statement without an expression
  shall only appear in a function whose return type is void.
...se si da per buono il fatto che il raggiungimento della fine funzione
equivale ad una return. Lo standard, tuttavia, tratta esplicitamente
solo il caso in cui una funzione con tipo di ritorno non void termina
senza un'instruzione return (undefined behaviour).
Quindi se ammettiamo che
int foo(void) {
}
e` equivalente a
int foo(void) {
        return;
}
allora il compilatore (per essere conforme) deve emettere un messaggio
diagnostico.
Luca
-- 
Home: 
http://kronoz.cjb.net
Regole per la felicità:
1. Sii soddisfatto di quello che hai.
2. Assicurati di avere tutto.

_Flavio_ ha scritto:

Ok grazie. Capito l'inghippo.
Ciao
