Primo/i programma/i C

Bazzaz
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
#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
Raptorista1
Quando usi [inline]printf[/inline] devi passare gli argomenti per copia, non per indirizzo.

Super Squirrel
Inoltre lo specificatore di formato dei double nella printf() è f e non lf.

vict85
"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.

Super Squirrel
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

#include <stdio.h>

int main()
{
    double a = 123.456;
    printf("%lf", a);
    return 0;
}

mi stampa 0.000000

vict85
Mi sembra strano, non ho provato con codeblocks, ma qui funziona https://ideone.com/u8byk9

Obidream
Per quel che può contare ottengo anche io gli stessi risultati di Vict con gcc e clang:


Super Squirrel
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.

universo1
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.

Raptorista1
"universo":
Usando un compilatore serio, ossia vsc++

AHAHAHAHHAHAHAHAHAHHAHAHAHAHHA

universo1
"Raptorista":
[quote="universo"]Usando un compilatore serio, ossia vsc++

AHAHAHAHHAHAHAHAHAHHAHAHAHAHHA[/quote]
Mi sembra una argomentazione molto valida, applausi =D>

Super Squirrel
Quindi quale potrebbe essere la diagnosi nel mio caso? Bug del compilatore?

apatriarca
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.

Bazzaz
"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

Raptorista1
Non è colpa tua, stiamo solo ammazzando il tempo tra flame e minuzie di standard :D

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.

Super Squirrel
"apatriarca":
Per curiosità, se chiedi la versione che cosa ti stampa?

Scusate la nabbaggine, ma come si fa? :D

Intanto se può essere utile



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

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.