Primo/i programma/i C
Salve sto passando da Python a C e già cominciano i problemi
Sto facendo un programma per il calcolo di un'equazione di secondo grado ma quando vado ad inserire i valori da tastiera me li conta come se fossero 0
Risultato in fase di esecuzione

Questo problema mi si ripete per qualunque programma io scriva inserendo i dati me li conta come 0 a volte mi stampa "nan" come risultato
Cosa sto sbagliando?
Sto facendo un programma per il calcolo di un'equazione di secondo grado ma quando vado ad inserire i valori da tastiera me li conta come se fossero 0
#include <stdio.h> #include <math.h> int main() { double a, b, c; printf("Inserisci coefficienti a b c: \n"); scanf("%lf%lf%lf", &a, &b, &c); printf("coefficienti a = %lf b = %lf c = %lf: \n",&a,&b,&c); double delta = b*b -4*a*c; printf("delta %lf \n ",&delta); return 0; }
Risultato in fase di esecuzione

Questo problema mi si ripete per qualunque programma io scriva inserendo i dati me li conta come 0 a volte mi stampa "nan" come risultato
Cosa sto sbagliando?
Risposte
Quando usi [inline]printf[/inline] devi passare gli argomenti per copia, non per indirizzo.
Inoltre lo specificatore di formato dei double nella printf() è f e non lf.
"Super Squirrel":
Inoltre lo specificatore di formato dei double nella printf() è f e non lf.
Non è vero: https://en.cppreference.com/w/c/io/fprintf . Per i double puoi usare f, e, a, g, lf, le, la e lg (il numero viene mostrato in modi diversi).
La ragione per questo è che lo scanf fa differenza tra float e double, mentre printf converte entrambi a double.
Sono argomenti che non ho mai approfondito, così come non sono un esperto delle opzioni di compilazione e dei vari standard che si sono succeduti, ma sta di fatto che con codeblocks (-std=c11) il seguente codice
mi stampa 0.000000
#include <stdio.h> int main() { double a = 123.456; printf("%lf", a); return 0; }
mi stampa 0.000000
Per quel che può contare ottengo anche io gli stessi risultati di Vict con gcc e clang:
Sia con -std=c11 che con -std=c99 mi stampa 0, invece disattivando quel flag ottengo l'output corretto.
Come già detto utilizzo codeblocks e il compilatore, stando al build log, è mingw32-gcc.exe.
Come già detto utilizzo codeblocks e il compilatore, stando al build log, è mingw32-gcc.exe.
Usando un compilatore serio e una IDE adeguata, ossia Visual Studio 2019 e relativo vsc++, a me funziona correttamente, entro i limiti delle poche prove che ho fatto. Sento odore di DevCpp abbinato a qualche compilatore non nativo (MinGW e carrozzoni simili).
PS: la maggior parte dei compilatore di default usa lo standard più recente ossia il C11. Nella realtà dei fatti l'unico standard completamente implementato nei compilatori moderni è il C89 nel quale è prevista la dichiarazione delle variabili solo all'inizio della funzione.
PS: la maggior parte dei compilatore di default usa lo standard più recente ossia il C11. Nella realtà dei fatti l'unico standard completamente implementato nei compilatori moderni è il C89 nel quale è prevista la dichiarazione delle variabili solo all'inizio della funzione.
"universo":
Usando un compilatore serio, ossia vsc++
AHAHAHAHHAHAHAHAHAHHAHAHAHAHHA
"Raptorista":
[quote="universo"]Usando un compilatore serio, ossia vsc++
AHAHAHAHHAHAHAHAHAHHAHAHAHAHHA[/quote]
Mi sembra una argomentazione molto valida, applausi

Quindi quale potrebbe essere la diagnosi nel mio caso? Bug del compilatore?
Mi sembra che questa discussione stia velocemente entrando in argomentazione non particolarmente costruttive. A parte il fatto che l'argomento è stato un po' deragliato da quello originale.
Veniamo ora alle risposte.
@Super Squirrel. Guardando alla tabella in questa pagina, prima dello standard C99 era necessario usare [tt]%f[/tt] mentre è attualmente possibile usare anche [tt]%lf[/tt]. Si tratta quindi potenzialmente di un bug del compilatore o una qualche opzione sbagliata. Personalmente non uso mingw32 da anni e la mia impressione è che sia più o meno morto/antiquato. Meglio usare Clang o Visual Studio su Windows. Per curiosità, se chiedi la versione che cosa ti stampa?
@universo: C11 è supportato da ogni compilatore al di fuori di Visual C perché Microsoft non è interessata al linguaggio C. Tuttavia lo sviluppo in C sta ricevendo una nuova rinascita negli ultimi anni. È una specie di reazione agli ultimi standard del C++ che sono sempre più complessi. Per lo sviluppo in C su Windows, clang è sinceramente l'opzione migliore e ha un ottima integrazione con Visual Studio.
@Raptorista: Visual C++ ha negli ultimi anni ricevuto un rinnovato supporto e la qualità è aumentata rispetto a qualche anno fa. Ovviamente il discorso vale solo per il C++ (per il C fa schifo). Ma mingw32 e simili non sono sinceramente alternative valide per uno sviluppo serio su Windows. Sono sempre stati molto indietro rispetto alla versione principale di gcc e l'intera toolchain è incompatibile con la maggior parte dei progetti per Windows. Da questo punto di vista Visual C++ è certamente un progetto più serio, anche se ci sono senza dubbio compilatori migliori.
Veniamo ora alle risposte.
@Super Squirrel. Guardando alla tabella in questa pagina, prima dello standard C99 era necessario usare [tt]%f[/tt] mentre è attualmente possibile usare anche [tt]%lf[/tt]. Si tratta quindi potenzialmente di un bug del compilatore o una qualche opzione sbagliata. Personalmente non uso mingw32 da anni e la mia impressione è che sia più o meno morto/antiquato. Meglio usare Clang o Visual Studio su Windows. Per curiosità, se chiedi la versione che cosa ti stampa?
@universo: C11 è supportato da ogni compilatore al di fuori di Visual C perché Microsoft non è interessata al linguaggio C. Tuttavia lo sviluppo in C sta ricevendo una nuova rinascita negli ultimi anni. È una specie di reazione agli ultimi standard del C++ che sono sempre più complessi. Per lo sviluppo in C su Windows, clang è sinceramente l'opzione migliore e ha un ottima integrazione con Visual Studio.
@Raptorista: Visual C++ ha negli ultimi anni ricevuto un rinnovato supporto e la qualità è aumentata rispetto a qualche anno fa. Ovviamente il discorso vale solo per il C++ (per il C fa schifo). Ma mingw32 e simili non sono sinceramente alternative valide per uno sviluppo serio su Windows. Sono sempre stati molto indietro rispetto alla versione principale di gcc e l'intera toolchain è incompatibile con la maggior parte dei progetti per Windows. Da questo punto di vista Visual C++ è certamente un progetto più serio, anche se ci sono senza dubbio compilatori migliori.
"Raptorista":
Quando usi [inline]printf[/inline] devi passare gli argomenti per copia, non per indirizzo.
Non credevo che una cosa così semplice avrebbe scatenato una discussione così "lunga" comunque grazie in effetti togliendo "&" mi stampa i valori che ho inserito
Non è colpa tua, stiamo solo ammazzando il tempo tra flame e minuzie di standard 
Tornando al tuo problema: in Python le variabili "mutable" sono sempre passate per indirizzo, mentre in C devi distinguere i casi. Tipicamente variabili piccole e che non devono essere modificate [gli input] vengono passate per valore, mentre quelle che devono essere modificate [gli output] vengono passate per indirizzo.

Tornando al tuo problema: in Python le variabili "mutable" sono sempre passate per indirizzo, mentre in C devi distinguere i casi. Tipicamente variabili piccole e che non devono essere modificate [gli input] vengono passate per valore, mentre quelle che devono essere modificate [gli output] vengono passate per indirizzo.
"apatriarca":
Per curiosità, se chiedi la versione che cosa ti stampa?
Scusate la nabbaggine, ma come si fa?

Intanto se può essere utile

e gli unici flag che utilizzo sono:
-std=c++14
-std=c11
-pedantic
-pedantic-errors