Anfängerprobleme mit C

Piktogramm schrieb:
Ergänzung ()

Nachtrag,

Wieso steht in Post 1 jetzt scanf mit %f wenn Ganzzahlen gefragt sind? Das ist doch Käse!

Inzwischen sind a und b beide float.
 
Piktogramm schrieb:
1. Nutze bitte <CODE> </CODE> um Quelltext im Post einzubetten. Dadurch bleibt die Formatierung erhalten!

2.

Code:
#include <stdio.h>

int main(){

	int a;

	printf("Programm zur Berechnung von °C in °K!\n\n");
	printf("Bitte geben Sie die gewünschte Gradzahl ein: ");

	scanf("%i", &a);

	a=a+273.15;

	printf("\n\n");
	printf("entspricht %i K", a);

}

GCC kompiliert und zeigt kein auffälliges Verhalten.



3. Die Typedefinition der Variablen ist relativ egal. Wenn int = int * float gerechnet wird, wird normalerweise schlicht nur der ganzzahlige Anteil ins Ergebnis übertragen (ohne Runden). Das kann mitunter recht praktisch sein. Sollte jedoch in der Masse vermieden werden, da dieses Vorgehen mehr Rechenzeit benötigt als das Berechnen reiner Integerwerte.
Im Beispiel wäre ein Summand ohne Komma sinnvoller.


4. Rein aus dem Bauch heraus, es kann immer mal wieder sein, dass der Tastaturbuffer noch Daten enthält, die scanf nicht auf integer parsen kann. Erweitere dein Schnippsel probehalber einfach um eine Routine, die den Eingabebuffer leert, bevor die eigentliche Eingabe kommt.
Ergänzung ()

Nachtrag,

Wieso steht in Post 1 jetzt scanf mit %f wenn Ganzzahlen gefragt sind? Das ist doch Käse!

Ich habe das Programm laufend ergänzt. Habe die Variablen auf float abgeändert und habe einen Eingabepuffer-Entleerer vor und nach scanf gestellt.

So, nun funktioniert das ganze leider trotzdem noch nicht und ich habe immer noch besagten Fehler.
 
Endixt schrieb:
Ich arbeite mit Code:Blocks.

Übrigens vielen Dank für die schnelle Hilfe!

Wie führst du denn dein Programm aus ?
Lässt du es in Code::Blocks laufen oder in einer neuen Kommandozeile ?
Funktioniert es auch wenn du beim 2. mal nur Enter drückst und nichts eingibst ?
Wenn du die 2. Zahl eingibst, welche Zahl wird dann umgerechnet und welche ignoriert ?
 
Zuletzt bearbeitet:
Könntest du den aktuellen Quelltext bitte je einen neuen Post gönnen? Kommt der Nachvollziehbarkeit zugute ;). Auch eine gescheite Formatierung des Quelltextes solltest du dir angewöhnen.

Wieso die Variablen auf float geändert werden, obwohl das ursprüngliche Problem damit zu tun hat versteh ich nicht. BruteForce Debugging funktioniert in der Regel nicht -.-

Welchen Compiler nutzt du, und wie führst du das Prog aus?
 
Piktogramm schrieb:
Könntest du den aktuellen Quelltext bitte je einen neuen Post gönnen? Kommt der Nachvollziehbarkeit zugute ;). Auch eine gescheite Formatierung des Quelltextes solltest du dir angewöhnen.

Wieso die Variablen auf float geändert werden, obwohl das ursprüngliche Problem damit zu tun hat versteh ich nicht. BruteForce Debugging funktioniert in der Regel nicht -.-

Welchen Compiler nutzt du, und wie führst du das Prog aus?

Also ich werde das in Zukunft beachten.

Es gab kein ursprüngliches Problem mit float.

Ich nutze glaube ich den/einen Compiler Namens "GNU GCC Compiler".

Schrank schrieb:
Wie führst du denn dein Programm aus ?
Lässt du es in Code::Blocks laufen oder in einer neuen Kommandozeile ?
Funktioniert es auch wenn du beim 2. mal nur Enter drückst und nichts eingibst ?
Wenn du die 2. Zahl eingibst, welche Zahl wird dann umgerechnet und welche ignoriert ?

Ich starte das Programm per "Build and Run", ich hoffe das ist die Antwort auf deine Frage.
Es MUSS eine 2. Zahl eingegeben werden. Wenn ich nur Enter nach der Eingabe und Bestätigung der 1. Zahl drücke, springt die Eingabezeile einfach um eine Zeile nach unten, wie in einem normalen Textfeld, mehr passiert nicht.
Eine Reaktion passiert erst, wenn eine 2. Zahl eingegeben und mit Enter bestätigt wird. Diese wird jedoch komplett ignoriert, die Berechnung findet ausschließlich mit der 1. eingegebenen Zahl statt!
 
Endixt schrieb:
Vielleicht noch ein kurzer Hinweis: Ich starte das Programm von einem USB Stick, es ist nicht auf meiner Festplatte installiert....

Vielleicht macht das ja einen Unterschied, ich weiss es nicht...

Kompilierst du das Programm auf dem einen Rechner und führst es dann auf dem anderen PC aus ?
 
Ich weiß ja nicht wer auf fflush gekommen ist, aber fflush ist für Ausgabeströme gedacht (gewöhne dir an die Dokumentation zu C-Funktionen zu lesen bevor du sie verwendest!). Eingabebuffer lehrt man üblicherweise mit dem Lesen von eben diesem bis er leer ist.

Probier es mal selbst mit einer Schleife, die den Eingabebuffer liest und abbrift wenn EOF erreicht ist.
 
Schrank schrieb:
Kompilierst du das Programm auf dem einen Rechner und führst es dann auf dem anderen PC aus ?

Nein. Ich habe das Programm einzig und allein auf einen USB-Stick herunter geladen und auf diesem auch entpackt, sodass es möglich ist, das Programm von verschiedenen Rechnern aus zu starten. Hintergrund ist der, dass wir das Programm in unserer Uni ebenfalls so starten, eben von unserem USB Stick. Daher mach ich das eben auf meinem PC (Windows 10 übrigens) ebenfalls.
Ergänzung ()

Piktogramm schrieb:
Ich weiß ja nicht wer auf fflush gekommen ist, aber fflush ist für Ausgabeströme gedacht (gewöhne dir an die Dokumentation zu C-Funktionen zu lesen bevor du sie verwendest!). Eingabebuffer lehrt man üblicherweise mit dem Lesen von eben diesem bis er leer ist.

Probier es mal selbst mit einer Schleife, die den Eingabebuffer liest und abbrift wenn EOF erreicht ist.

Ich habe in einem anderen Forum gelesen, dass ein ähnliches Problem dadurch behoben wurde. Aus diesem Grunde habe ich das dort eingefügt.
Ehrlich gesagt möchte ich nicht wirklich so viel darüber wissen. Mir würde es reichen, wenn ich meine "Musts" der Uni schreiben könnte, und gut ist. So genau interessiert mich das Thema nicht, ich bin Rohstoffingenieur, kein Informatiker.
 
Ich kann es leider nicht reproduzieren, habe mir gerade Code::Blocks Portable herunter geladen und mit "Build and run" ausgeführt. Funktioniert alles mit einem Enter. Hier nochmal der Code.
Code:
#include <stdio.h>

int main ()
{
	float a;
	float b;

	printf ("Programm zur Berechnung von C in K!\n\n");
	printf ("Bitte geben Sie die gewuenschte Gradzahl ein: ");
	scanf ("%f", &a);

	b=a+273.15;

	printf ("\n\n%f C sind %f K!", a, b);

	return 0;
}
 
Schrank schrieb:
Ich kann es leider nicht reproduzieren, habe mir gerade Code::Blocks Portable herunter geladen und mit "Build and run" ausgeführt. Funktioniert alles mit einem Enter. Hier nochmal der Code.
<CODE>
#include <stdio.h>

int main ()
{
float a;
float b;

printf ("Programm zur Berechnung von C in K!\n\n");
printf ("Bitte geben Sie die gewuenschte Gradzahl ein: ");
scanf ("%f", &a);

b=a+273.15;

printf ("\n\n%f C sind %f K!", a, b);

return 0;
}
</CODE>


Nagut. Dann werde ich vielleicht einfach mal probieren, das Programm auf dem PC zu installieren, vielleicht klappt es ja dann.
Trotzdem vielen Dank, für die Mühe!
 
Endixt schrieb:
Nagut. Dann werde ich vielleicht einfach mal probieren, das Programm auf dem PC zu installieren, vielleicht klappt es ja dann.
Trotzdem vielen Dank, für die Mühe!

Ich habe es auch nicht direkt installiert, sondern die portable Version, also die für den USB-Stick.
 
Ich sende hier mal die Kompilierte .exe.
Öffne einfach mal eine Kommandozeile und zieh die entpackte .exe da rein und drück Enter.
Bei Doppelklick geht das Fenster sonst sofort wider zu, nachdem es fertig ist und du siehst die Ausgabe nicht.
 

Anhänge

  • Test.zip
    7,3 KB · Aufrufe: 155
Zuletzt bearbeitet:
Hi,

nettes Problemchen, welche gcc Version benutzt du denn?
Code:
gcc --version
in der Windows Eingabeaufforderung eingeben.

Ich schätze du hast eine Kombination aus gcc / Win10 die mit dem "Enter" nicht klar kommt.
Linux Enter = \n
Windows Enter = \r\n

Du könntest mal diese 3 Sachen gegentesten:
1.
Code:
scanf("%f%c", &a, &c);
c ist ein char
2.
Code:
scanf("%f%c", &a, &c);
3.
Code:
scanf("%f%*c", &a);
char nach float wird ignoriert
4.
Code:
scanf("%f%*c\n", &a);
voll definiert sollte klappen

Ich würde Abstand nehmen von der scanf Funktion und wenn dann den Rückgabewert mit auswerten...
uint8_t result = scanf(...)
siehe scanf Doku

Schöner geht das mit gets, das liest einen String bis zum \n ein. Danach in nen float parsen.

*edit
Grad beim Antworten klicken kams mir, welche gcc Compile Optionen sind den aktiv?
gcc -std=c99 sollte es tun.


Gruß
Alex
 
Zuletzt bearbeitet:
soyd schrieb:
Hi,

nettes Problemchen, welche gcc Version benutzt du denn?
Code:
gcc --version
in der Windows Eingabeaufforderung eingeben.

Ich schätze du hast eine Kombination aus gcc / Win10 die mit dem "Enter" nicht klar kommt.
Linux Enter = \n
Windows Enter = \r\n

Du könntest mal diese 3 Sachen gegentesten:
1.
Code:
scanf("%f%c", &a, &c);
c ist ein char
2.
Code:
scanf("%f%c", &a, &c);
3.
Code:
scanf("%f%*c", &a);
char nach float wird ignoriert
4.
Code:
scanf("%f%*c\n", &a);
voll definiert sollte klappen

Ich würde Abstand nehmen von der scanf Funktion und wenn dann den Rückgabewert mit auswerten...

siehe scanf Doku

Schöner geht das mit gets, das liest einen String bis zum \n ein. Danach in nen float parsen.

*edit
Grad beim Antworten klicken kams mir, welche gcc Compile Optionen sind den aktiv?
gcc -std=c99 sollte es tun.


Gruß
Alex

Das war der Fehler! Hatte in scanf ("") ein \n enthalten, das wollte er wohl nicht. Hatte das auch nicht in den angegebenen Quellcode reingeschrieben, da ich nicht davon ausging, dass es davon kommt. Das war dumm von mir, Entschuldigung an alle Beteiligten dafür!

Nochmal vielen Dank für den klasse Support von euch!

Viele Grüße,
Endixt
 
Zurück
Oben