Verbrauchsrechner selber "bauen"
-
Hallo,
mein zweites Projekt besteht im Moment aus einem Verbrauchsrechner. Ich will ihm den alten Verbrauchswert/Tankinhalt/Durchschnittsverbrauch in einer Text-Datei hinterlegen lassen und dann beim erneuten Programm Start die txt.Datei auslesen lassen und neue Daten zukommen lassen und einen neuen Durchschnitt ausrechnen lassen...
#include <stdio.h> #include <conio.h> #include <string.h> int main () { char Fahrzeugmarke[100]; char Modell[100]; int Tankinhalt = 0; int NachTankMenge = 0; int Kilometerstand = 0; int KilometerstandNeu = 0; double Verbrauch = 0; char Datum[14]; FILE *Verbrauchsrechner; if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+"); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "Datum: %s \n", Datum); printf("Ihr alter Kilometerstand war %d KM. Bitte geben Sie den neuen KM Stand ein. \n", Kilometerstand); scanf("%i", &KilometerstandNeu); fprintf (Verbrauchsrechner, "Neuer Kilometerstand: %i \n", KilometerstandNeu); printf("Geben Sie bitte nun die Fuellmenge ein:\n"); scanf("%i", &NachTankMenge); fprintf (Verbrauchsrechner, "Nachtankmenge: %i \n", NachTankMenge); // fscanf(Verbrauchsrechner, "%i", &Kilometerstand); // printf("%i",Kilometerstand); fclose (Verbrauchsrechner); } else { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "w"); printf("Willkommen zum Verbrauchsrechner, bitte legen Sie ein Fahrzeug an: \n"); printf("Fahrzeugmarke: \n"); scanf("%s", &Fahrzeugmarke); fprintf (Verbrauchsrechner, "Der %s ", Fahrzeugmarke); printf("Modell: \n"); scanf("%s", &Modell); fprintf (Verbrauchsrechner, "%s", Modell); printf("Kilometerstand: \n"); scanf("%d", &Kilometerstand); fprintf (Verbrauchsrechner, " hatte einen Anfangskilometerstand von %d KM. \n", Kilometerstand); printf("Tankinhalt: \n"); scanf("%i", &Tankinhalt); fprintf (Verbrauchsrechner, "Der Tankinhalt betrug %i Liter.\n", Tankinhalt); fclose (Verbrauchsrechner); } getch(); return 0; }
Leider weiß ich nicht, wie ich das sinnvoll umsetzen soll... ich kann die Datei erstellen,aber wie ich sie auslese und die Werte wieder richtig zuweise, weiß ich im Moment leider nicht...
MfG
-
scanf ist dir doch anscheinend bekannt. fscanf verhält sich nicht großartig anders. Du solltest dich ein wenig mit den Möglichkeiten dieser sehr mächtigen Funktion auseinander setzen. scanf ist zu so viel mehr in der Lage als bloß einzelne Zahlen zu lesen. M einem passenden Formatstring bekommst du selbst kompliziertere Formate recht komfortabel verarbeitet. Insbesondere die Möglichkeit, bestimmte Zeichen zu prüfen könnte hier hilfreich sein. So oder ähnlich:
scanf("Neuer Kilometerstand: %i", &kilometerstand);
-
Hallo,
ja auch fscanf ist mir bekannt. Ich hätte ja sogar eine Vorstellung, wies laufen könnte.
Er soll immer die letzten 3 Zeilen der txt Datei auslesen und die Werte dann wieder den Variablen Tankinhalt/Kilometerstand/Durchschnittsverbrauch bis dahin zuordnen. Wie man das macht, weiß ich allerdings nicht...
Wobei das mit dem Durchschnittsverbrauch würde ich mit einer for-Schleife umsetzen, wo jeder Programmstart mitgezählt wird und dann auf den Wert aller Verbräuche der neuste Verbrauch draufgerechnet wird und dann durch die Zahl aller Programmstarts geteilt wird...
-
Sinnvoller ist doch eine Tabelle zu nutzen.
#Marke;Modell;Kilometerstand;Tank; Bugatti;Veyron;400;400;
Mit einer Zeile hast du alle Informationen.
(Und du kannst die Datei auch mit Excel oder anderen Programmen laden)
-
Okay, danke für den Hinweis.
Wie ich so eine Tabelle ins txt schreibe, weiß ich (glaube ich zumindest), aber wie lese ich die werte per fscanf aus und weise sie wieder den alten Variablen zu?
MfG
-
C-Tabaluga schrieb:
wie lese ich die werte per fscanf aus und weise sie wieder den alten Variablen zu?
Indem du fscanf benutzt. Kannst du etwas genauer beschreiben, was du dabei für Schwierigkeiten hast? Kannst du den Formatstring nicht bauen?
#include <stdio.h> int main() { char marke[100], modell[100]; int kilometerstand, tank; if(4 == sscanf("Bugatti;Veyron;400;400;", "%99[^;];%99[^;];%i;%i", marke, modell, &kilometerstand, &tank)) printf("Marke: %s\nModell: %s\nKilometerstand: %i\nTank: %i\n", marke, modell, kilometerstand, tank); else puts("Fehler beim Parsen!"); return 0; }
Dabei habe ich das "negated scanset"
%[^ ... ]
als Formatspezifizierer genutzt. Der Rest sollte bekannt sein, oder?
-
Hallo,
danke für eure Antworten!
if(4 == sscanf("Bugatti;Veyron;400;400;", "%99[^;];%99[^;];%i;%i", marke, modell, &kilometerstand, &tank)
Wie komme ich jetzt mit diesem sscanf immer jeweils in die letzte Zeile und kann diese dann einlesen?
Oder liest dieser Befehl die letzte Zeile aus?
Ich lasse für den Anfang mal Marke und Modell weg, damit er nur Zahlen einlesen muss und die neuen Daten hinzufügt um dann den neuen Verbrauch auszurechnen...
Hier mal mein neuster Stand, im Kommentar die Fragen:
#include <stdio.h> #include <conio.h> #include <string.h> int main () { int Tankinhalt = 0; int Kilometerstand = 0; int KilometerstandNeu = 0; double Letzterverbrauch = 0; double Durchschnittsverbrauch = 0; double Verbrauch = 0; char Datum[14]; FILE *Verbrauchsrechner; if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+"); sscanf("%i;%i;%i;%i;%99[^;]", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, Datum); // int mit const char inkompatibel, fehler bei Kilometerstand printf("Kilometerstand %s\nTankinhalt: %s\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum); printf("\nNeuer Kilometerstand:"); scanf("%i", &KilometerstandNeu); fprintf (Verbrauchsrechner, "%i;", KilometerstandNeu); printf("Geben Sie bitte nun die Fuellmenge ein:\n"); scanf("%i", &Tankinhalt); fprintf (Verbrauchsrechner, "%i;", Tankinhalt); // Letzter Verbrauch Letzterverbrauch = KilometerstandNeu - Kilometerstand / Tankinhalt; fprintf(Verbrauchsrechner, "%i;", Letzterverbrauch); // Gesamtverbrauch // double Durchschnittsverbrauch = Wie kann ich da den neustens KM Stand herholen, den ersten KM Stand abziehen und dann durch die Summe aller Tankinhalte dividieren? fprintf(Verbrauchsrechner, "%i;", Durchschnittsverbrauch); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;", Datum); fclose (Verbrauchsrechner); } else { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "w"); printf("Willkommen zum Verbrauchsrechner, bitte legen Sie ein Fahrzeug an: \n"); printf("Kilometerstand: \n"); scanf("%d", &Kilometerstand); fprintf (Verbrauchsrechner, "%d;", Kilometerstand); printf("Tankinhalt: \n"); scanf("%i", &Tankinhalt); fprintf (Verbrauchsrechner, "%i;", Tankinhalt); //beim ersten Start NULL anlegen für die Verbräuche fprintf (Verbrauchsrechner, "%i;"); fprintf (Verbrauchsrechner, "%i;"); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;\n", Datum); fclose (Verbrauchsrechner); } getch(); return 0; }
Müsste eben jetzt nur das ganze noch richtig aus dem txt File rausziehen und gut wäre die Sache
MfG
-
sscanf
steht für string scan formated.
Formatiertes erkennen aus einem String.
Darum erwartet die Funktion auch einen String als ersten Parameter.
Das kann ein Stringliteral sein, wie im Beispiel von SeppJ (Das "Bugatti;Veyron;400;400;") oder auch ein char-Array oder char*Dieser String fehlt bei dir. Darum kommt auch die Warnung:
int mit const char inkompatibel, fehler bei Kilometerstand
Diesen String kannst du vorher aus der Datei lesen. Z.B als ganze Zeile.
Du kannst aber auch dirket von der Datei lesen. Ein file scan formated wäre schön. Wie mag der Befehl wohl heißen?
Mach dir da aber mal Gedanken, was mit dem letzten ; ist.Wie kommst du jetzt an die letzte Zeile?
Datei zum lesen öffnen, Solange lesen, bis keine Daten mehr kommen (?scanf liefert dann die falsche Anzahl zurück). Datei schließen.
Dabei ist es dem Rechner egal, ob du nur Zahlen einliest oder auch Text.Danach erst zum schreiben/anhängen öffnen, Daten schreiben und Datei schließen.
Was soll die Zeile mit dem fopen(... "a+) ? Was passiert da?Auch wenn ich das schon in deinem anderen Thrad geschrieben habe:
Wenn du nicht weißt, was für Paramter eine Funktion braucht, kannst du da nachschauen. Es sind auch Beispiel dabei.
Oder stöbere da ein bisschen rum und entdecke andere Funktionen
-
DirkB schrieb:
sscanf
steht für string scan formated.
Formatiertes erkennen aus einem String.
Darum erwartet die Funktion auch einen String als ersten Parameter.
Das kann ein Stringliteral sein, wie im Beispiel von SeppJ (Das "Bugatti;Veyron;400;400;") oder auch ein char-Array oder char*Dieser String fehlt bei dir. Darum kommt auch die Warnung:
int mit const char inkompatibel, fehler bei Kilometerstand
Diesen String kannst du vorher aus der Datei lesen. Z.B als ganze Zeile.
Genauer gesagt war das sscanf bloß da, um das Beispiel vor zu führen. Ich hatte mir etwas mehr Enthusiasmus beim Nachschlagen unbekannter Funktionen erhofft, so dass der Threadersteller längst wüsste, dass es mehrere scanf-Variationen gibt, die sich jeweils nur darin unterscheiden, wo sie ihre Daten her bekommen, ansonsten aber genau gleich sind (also ideal, wenn man ein fscanf vorführen möchte, ohne die Datei zu haben).
-
Guten Abend,
ich mach jetzt erstmal das Projekt fertig und dann schau ich wegen dem anderen.
Mein Befehl sähe jetzt so aus:
if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { do { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r"); } while(fscanf(Verbrauchsrechner, "%i;%i;%i;%i;%s;", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, Datum)); fclose (Verbrauchsrechner);
Es kommt zwar kein Fehler, aber trotzdem wird das Programm unterbrochen und es kommt "Debug Assertion Failed, (Expression: stream!=Null)" Nach der Theorie müsste er bei mir bis zum Ende lesen, richtig?
fopen a+ soll die Datei erweitern, zumindest habe ich den Befehl im Internet gefunden.
Ich müsste jetzt erstmal rausfinden, warum er den Befehl (ohne while) nicht mag und dann kann ich den nächsten Schritt gehen, wie du sagst zur letzten Zeile.
MfG
-
Müll.
Was macht Zeile 1 und was macht Zeile 4?
Für welchen Variablentyp steht %i bei scanf?
Und welche Typen willst du einlesen.C-Tabaluga schrieb:
fopen a+ soll die Datei erweitern, zumindest habe ich den Befehl im Internet gefunden.
Ja, das tut es. Aber was soll er direkt hinter dem fopen "r"?
Die Datei wird einmal geöffnet und dann einmal geschlossen.
Und Programmieren ist nicht "learning by guessing". Du musst von jeder einzelnen Zeile wissen, wofür sie da ist.
-
Stimmt, eigentlich ist es Schwachsinn...
Ich hab das mit printf vertauscht, ich will ja nen double einlesen, also %lf...
Zeile 1 soll dazu dienen, dass es nur zur Datei was hinzufügt, wenn eine vorhanden ist.
Zeile 4 macht keinen Sinn...
Ich bin im Moment einfach im C Einstieg und bin bisher Java und noch lieber C# gewohnt, da ists ne kleine Umgewöhnung wieder...
Wirklich Lösungen so dass ich nicht gleich wieder aufgebe, finde ich im Internet einfach nicht... dabei wär die Sache und das Programm eig. schon ne sinnvolle Sache für mich zumindest zum lernen... wenn man wüsste, wo hinten und vorne ist.
Momentaner Stand:
#include <stdio.h> #include <conio.h> #include <string.h> int main () { double Tankinhalt = 0; double Kilometerstand = 0; double KilometerstandNeu = 0; double Letzterverbrauch = 0; double Durchschnittsverbrauch = 0; double Verbrauch = 0; char Datum[14]; FILE *Verbrauchsrechner; if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+"); fscanf(Verbrauchsrechner, "%lf;%lf;%lf;%lf;%s;", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, Datum); printf("Kilometerstand %s\nTankinhalt: %s\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum); printf("\nNeuer Kilometerstand:"); scanf("%lf", &KilometerstandNeu); fprintf (Verbrauchsrechner, "%f;", KilometerstandNeu); printf("Geben Sie bitte nun die Fuellmenge ein:\n"); scanf("%lf", &Tankinhalt); fprintf (Verbrauchsrechner, "%f;", Tankinhalt); // Letzter Verbrauch Letzterverbrauch = KilometerstandNeu - Kilometerstand / Tankinhalt; fprintf(Verbrauchsrechner, "%f;", Letzterverbrauch); // Gesamtverbrauch // double Durchschnittsverbrauch = Wie kann ich da den neustens KM Stand herholen, den ersten KM Stand abziehen und dann durch die Summe aller Tankinhalte dividieren? fprintf(Verbrauchsrechner, "%f;", Durchschnittsverbrauch); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;", Datum); fclose (Verbrauchsrechner); } else { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "w"); printf("Willkommen zum Verbrauchsrechner, bitte legen Sie ein Fahrzeug an: \n"); printf("Kilometerstand: \n"); scanf("%lf", &Kilometerstand); fprintf (Verbrauchsrechner, "%.2f;", Kilometerstand); printf("Tankinhalt: \n"); scanf("%lf", &Tankinhalt); fprintf (Verbrauchsrechner, "%.2f;", Tankinhalt); //beim ersten Start NULL anlegen für die Verbräuche fprintf (Verbrauchsrechner, "%.2f;"); fprintf (Verbrauchsrechner, "%.2f;"); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;\n", Datum); fclose (Verbrauchsrechner); } getch(); return 0; }
Aber das mag er immer noch nicht so.
-
Da ist nichts magisches. Immer der Reihe nach.
if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { while(4 == fscanf(Verbrauchsrechner , "%99[^;];%99[^;];%i;%i", marke, modell, &kilometerstand, &tank)) { printf("Marke: %s\nModell: %s\nKilometerstand: %i\nTank: %i\n", marke, modell, kilometerstand, tank); Andere Sachen mit den Variablen ... Berechnungen, ablegen ins Array, ... } fclose (Verbrauchsrechner); }
-
if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { while(5 == fscanf(Verbrauchsrechner , "%i;%i;%i;%i;%99[^;]", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, Datum)) { printf("Kilometerstand %s\nTankinhalt: %s\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum); printf("Neuer Kilometerstand:\n"); scanf("%lf", &KilometerstandNeu); fprintf (Verbrauchsrechner, "%f;", KilometerstandNeu); printf("Geben Sie bitte nun die Fuellmenge ein:\n"); scanf("%lf", &Tankinhalt); fprintf (Verbrauchsrechner, "%f;", Tankinhalt); // Letzter Verbrauch Letzterverbrauch = KilometerstandNeu - Kilometerstand / Tankinhalt; fprintf(Verbrauchsrechner, "%f;", Letzterverbrauch); // Gesamtverbrauch // double Durchschnittsverbrauch = Wie kann ich da den neustens KM Stand herholen, den ersten KM Stand abziehen und dann durch die Summe aller Tankinhalte dividieren? fprintf(Verbrauchsrechner, "%f;", Durchschnittsverbrauch); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;", Datum); fclose (Verbrauchsrechner); }}
Leider kommt da gar nichts, wenn ich das ausführe. Kann ich nicht nachvollziehen irgendwie...
-
C-Tabaluga schrieb:
Kann ich nicht nachvollziehen irgendwie...
Dann benutz einen Debugger oder andere Methoden, um das Problem nachzuvollziehen (Testausgaben oder ähnliches). Wir können so ein Problem auch nicht nachvollziehen, wenn du uns nicht alles zeigst, was dafür gebraucht wird.
-
Ich benutz das bei vielen ungeliebte Visual Studio, also hab einen Debugger und der sagt mir, wenn ich jetzt nur mal einlesen will:
"Zugriffsverletzung beim Lesen an Position 0x459c4000."
Ich will erst mal verstehen, wie das mit dem einlesen überhaupt funktioniert und hab deshalb den kompletten Code im Moment so:
#include <stdio.h> #include <conio.h> #include <string.h> int main () { double Tankinhalt = 0; double Kilometerstand = 0; double KilometerstandNeu = 0; double Letzterverbrauch = 0; double Durchschnittsverbrauch = 0; double Verbrauch = 0; char Datum[14]; FILE *Verbrauchsrechner; if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+"); fscanf(Verbrauchsrechner , "%f;%f;%f;%f;%99[^;]", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, Datum); // i ist glaube ich für mich die falsche formatierung, weil ich ja ein double will, also wsh d printf("Kilometerstand %s\nTankinhalt: %s\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum); printf("Neuer Kilometerstand:\n"); scanf("%lf", &KilometerstandNeu); fprintf (Verbrauchsrechner, "%.2f;", KilometerstandNeu); printf("Geben Sie bitte nun die Fuellmenge ein:\n"); scanf("%lf", &Tankinhalt); fprintf (Verbrauchsrechner, "%.2f;", Tankinhalt); // Letzter Verbrauch Letzterverbrauch = KilometerstandNeu - Kilometerstand / Tankinhalt; fprintf(Verbrauchsrechner, "%.2f;", Letzterverbrauch); // Gesamtverbrauch // double Durchschnittsverbrauch = Wie kann ich da den neustens KM Stand herholen, den ersten KM Stand abziehen und dann durch die Summe aller Tankinhalte dividieren? fprintf(Verbrauchsrechner, "%.2f;", Durchschnittsverbrauch); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;", Datum); fclose (Verbrauchsrechner); } else { Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "w"); printf("Willkommen zum Verbrauchsrechner, bitte legen Sie ein Fahrzeug an: \n"); printf("Kilometerstand: \n"); scanf("%lf", &Kilometerstand); fprintf (Verbrauchsrechner, "%.2f;", Kilometerstand); printf("Tankinhalt: \n"); scanf("%lf", &Tankinhalt); fprintf (Verbrauchsrechner, "%.2f;", Tankinhalt); //beim ersten Start NULL anlegen für die Verbräuche fprintf (Verbrauchsrechner, "%.2f;"); fprintf (Verbrauchsrechner, "%.2f;"); printf("Bitte geben Sie das heutige Datum ein: \n"); scanf("%s", &Datum); fprintf (Verbrauchsrechner, "%s;\n", Datum); fclose (Verbrauchsrechner); } getch(); return 0; }
Ich bekomme 3 mal "Schlechtes Ptr".
Was mich etwas stört beim debuggen mit Visual Studios ist das er dann eine andere Klasse öffnet und da etwas meckert, womit ich gar nichts anfangen kann... Wobei ich ansonsten mit C und Visual Studio einigermaßen zurecht gekommen bin...
-
Guck dir nochmal an, wie scanf genau funktioniert. Der Formatstring von scanf ist nicht das genaue Gegenstück von printf. Außerdem machst du komische Sachen mit deinen Dateien. Was sollen Zeilen 19-22 bewirken? Was immer du denkst, sie tun es wahrscheinlich nicht.
-
Schalte alle Warnungen an. (in den Projekt-Einstellungen /Optionen Compiler)
Beachte die Warnungen.*
Behebe die Ursache dafür.*Als Ausnahme gilt nur, wenn da steht du solltest scanf_s/fscanf_s nehmen.
Diese Warnung darfst du übersehen.
-
Also Zeile 19-22:
Soll checken, ob bereits eine Datei vorhanden ist und wenn sie zu lesen ist, soll sie zum schreiben geöffnet werden und das, was bisher drin steht, soll ausgegeben werden.
Wegen der Formatierung, selbst wenn ich statt %f %d nehme, passiert nicht das gewünschte.
Ich hab mir die Formatierung von scanf schon angesehen, aber egal, was ich einsetze, der gibt mir nichts aus, auch wenn eine Textdatei mit Inhalt existiert.
MfG
-
C-Tabaluga schrieb:
Also Zeile 19-22:
Soll checken, ob bereits eine Datei vorhanden ist und wenn sie zu lesen ist, soll sie zum schreiben geöffnet werden
Hier mal Stopp. Prüf mal, ob es das wirklich tut.
Wegen der Formatierung, selbst wenn ich statt %f %d nehme, passiert nicht das gewünschte.
Ich weiß nicht, was ich dazu noch sagen soll. Rätst du nur?
Ich hab mir die Formatierung von scanf schon angesehen,
Wo hast du das gelesen? Wie kommst du von dort auf %d?