Na, na, aufgeben is nich'.
Und siehe da, der Erfolg (ver)spricht Lottogewinn.
Gruß Sternthaler
danke!!!!Zitat von Sternthaler
![]()
doch! Dann habe ich das nächste Mal vielleicht weniger Probleme beim Programmieren. Mit diesem Ding habe ich stundenlang gekämpft, fast hätte ich aufgegeben oder hier um Hilfe gerufen.Mal sehen, ob man da noch was verbessern sollte. Lohnt sich aber keinesfalls
Gruss
M.
Na, na, aufgeben is nich'.
Und siehe da, der Erfolg (ver)spricht Lottogewinn.
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
OK, dann hier eine 'geschrumpfte' Version.
Komplett anderer Ansatz die Zeichenfläche zu füllen.
Und noch ein Gruß von Sternthaler
Lieber Asuro programieren als arbeiten gehen.
Du Ressourcenfresser!![]()
Hallo Sternthaler,
o je - lauter mir unbekannte Funktionen.
Wird die hex-Datei wegen stdio.h und math.h so "riesig"?
Deine Schrumpfversion sieht ja schön übersichtlich aus, aber leider kommt mein ASURO nicht besonders gut damit zurecht. (siehe Anhang)
Gut, dass du daran gedacht hast:
aus rechtlichen Gründen ist der Zusatz "Ohne Gewaehr " natürlich unbedingt notwendig!
Gruss
M.
@damaltor
Ja, beim musizieren bin ich total der Geizhalz gewesen und hier nun solche Verschwendung. Was soll man da nur von halten. Ich baue auf dich, wenn ich mal Code mit mehr als 3MB posten möchte.
Hallo M1.R,
ja, es werden von den #include's die beiden Funktionen fprintf() und fmod() benötigt.
Es würde dir aber nichts nützen, wenn du das #include wegläßt, ausser das du beim Übersetzten Warnings bekommst, und dein Programm im schlimsten Fall nicht funktioniert.
Die #include-Anweisung holt nur die Information, wie Funktionen aus den Lib's zu benutzen sind, und welche Returnwerte sie liefern. (Deshalb unter anderem auch das #include "asuro.h")
Wenn du nochmal in den von mir geposteten Code oben schaust, findest du auch die 'Bedinungsanleitung' für die beiden Funktion von dir als:
uint8_t zufallbat(void); <-- MIT ;
uint8_t zahl(void); <-- MIT ;
Diese 'Bedinungsanleitung' habe ich noch aufgenommen, um keine Warnings beim Übersetzen zu bekommen. (Die mag ich nicht, da sie teilweise extreme Fehler zur Folge haben können.)
Ich denke, dir werden folgende Funktionsbeschreibung weiterhelfen:
fprintf-Beschreibung. Du solltest dir die da angegebene 'Formatierung' auf alle Fälle ansehen.
fmod-Beschreibung
Das ! vor der fmod-Funktion heisst nur 'nicht'. Also "if ( 'nicht' fmod (...))"
Als Hinweis noch folgendes: Deine Variable Lottozahl ist nun ein Array für 49 Text-Strings mit JE einer maximalen Länge von 5 (6-1) Buchstaben.
Aber warum es zu deiner recht Lottoscheinuntypischen Ausgabe kommt, muss ich erst mal rausfinden. Das muss auf alle Fälle mit dem fmod() zu tun haben.
Ich vermute, dass die Mathe-Lib nicht, bzw. mit Warnings, eingebunden wird. Jedenfalls funktioniert noch alles, solange fmod() nur Zahlen von 0 bis 6 durch 7 teilen muss. Erst ab 8 / 7 wird nicht mehr festgestellt, dass der Rest NICHT 0 ist.
Kannst du bitte mal das von dir benutzte Makefile posten. Da müsste die Lösung zu finden sein.
Bei weiteren Fragen: Nur zu.
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
ICh werde sehen was sich machen lässt... ist die Sperre jetzt wieder deaktiviert? =)
Hallo Sternthaler,
ich benutze das AVR-Studio und bekomme beim ersten Kompilieren immer massenhaft warnings, beim zweiten mal sind sie üblicherweise weg.
Alle lib 2.7 Dateien liegen im selben Ordner wie das Projekt, die benötigten werden in das Projekt eingebunden.
WIN AVR ist bei mir hier: C:\WinAVR-20070525
Makefile und div. Screenshots im Anhang
Gruss
M.
ja gerne - dankeZitat von Sternthaler
ich hab mal deinen code mit Kommentaren und Fragezeichen versehen, es wäre nett wenn du dir das anschauen würdest.
GrussCode:// Kuerzer Code von Sternthaler (Ressourcenfresser) char Lottozahl [49][6]; // warum 6 ? // 49 Lottozahlenspeicherplätze vorbereiten for (i = 0; i < 49; i++) sprintf (Lottozahl [i], " %2d |", i + 1); //49 plätze bestehend aus 5 zeichen: //Lottozahl=leerzeichen/bzw X - ganze 2stellige zahl - leerzeichen - strich // 6 Lottozahlen wuerfeln i = 6; while (i > 0) { zuf = zahl (); if (Lottozahl [zuf][0] == ' ') // == ? // keine lottozahl dann ein leerzeichen ? { Lottozahl [zuf][0] = 'X'; // lottozahl bekommt ein X i--; } } // Lottoschein malen for (i = 0; i < 49; i++) { if ( ! fmod (i, 7)) // wenn kein rest bei division i/7 da ist? // also ganz am anfang und nach dem ende einer zeile SerWrite ("\r\n ----------------------------------\r\n |", 52); // waagerechten strich //und ersten senkrechten inder nächsten zeile malen SerWrite (Lottozahl [i], 5); // sonst Lottozahl(leerzeichen oder X) und Zahl? malen // woher weiss er, welche zahl er schreiben muss? } SerWrite ("\r\n ----------------------------------\r\n", 45); //letzter strich
M.
Hallo damaltor,
das weiß ich noch nicht, da ich noch nichts zu posten hatte. Evl. ist jetzt ein post drann, dann geht es. Schade geht nicht.
Hallo M1.R,
erst einmal zu deinen Kommentaren und Fragen im Code.
Du hast ja das Wesentliche auf alle Fälle schon raus bekommen.
Komplett richtig so. Die 49 Strings werden mit 5 Zeichen belegt " NN |"//49 plätze bestehend aus 5 zeichen:
//Lottozahl=leerzeichen/bzw X - ganze 2stellige zahl - leerzeichen - strich
sprintf (Lottozahl [i], " %2d |", i + 1);
Dabei ist NN, ganz richtig, die 2-stellige Zahl vom Zähler i+1. Also 1 bis 49.
Na, da ist auch schon die Lösung für deine Frage:
// woher weiss er, welche zahl er schreiben muss?Hier wird aus dem 'zuf'-ten String der Variablen Lottozahl das 0-te Zeichen verglichen mit einem einzelnen char-Zeichen.if (Lottozahl [zuf][0] == ' ') // == ?
// keine lottozahl dann ein leerzeichen ?
== ist klar. Vergleiche irgendwas
"Hello world" ist auch klar. Ein String
'H' ist genau ein ASCII-Zeichen.
Der Unterschied zwischen Strings und Char-Zeichen ist der Aufbau im Speicher, (und die Behandlung dieser Speicherstruktur).
Die einzelnen Buchstaben des Strings sind jeweils in einem Byte gespeichert. Um den String aber zu beenden, so dass C weiß wann der String zu Ende ist, ist hinten dran immer ein 0x00 (kein einziges Bit im Byte ist gesetzt) angehängt.
Also:
"H" ist ein String und im Speicher werden ZWEI Byte benutzt. H und 0
'H' ist genau ein Byte lang. Nur H
Aus diesem Grund kann in einem String auch immer nur ein 'Nutz'-Zeichen weniger gespeichert werden.
char Lottozahl [49][6] -> Reserviere 49 * 6 Byte
5 Byte für die Buchstaben und Eins für Stringende 0x00
Somit ist deine "// keine lottozahl dann ein leerzeichen ?"-Frage bestimmt beantwortet.
Vergleiche das erste 'Nutz'-Zeichen [0] aus dem 'zuf'-ten String einfach mit einem Leerzeichen (' '). Oben hattest du ja schon richtig gesehen das 49 Strings beim ersten Zeichen mit Leerzeichen vorbelegt werden.
Ist also diese Stelle noch ein Leerzeichen, dann können wir diesen 'zuf'-ten Lottozahlen-Speicherplatz (den String) noch mit einem 'X' an der ersten Stelle beschreiben.
Wenn aber kein ' ' in diesem ersten 'Nutz'-Zeichen steht, dann ist da schon ein 'X' vorhanden, also nochmal würfeln.
Ja, bei 0 auf alle Fälle, denn 0 durch irgendwas ist nun mal 0.if ( ! fmod (i, 7))
// wenn kein rest bei division i/7 da ist?
// also ganz am anfang und nach dem ende einer zeile
"nach dem ende einer zeile" heißt eher: alle 7 Durchläufe mal was tun. Denn die Zeilenlänge bestimmen wir ja erst mit der 7 in fmod().
Hier sollte eigendlich auch bei dir immer 0 als Ergebnis kommen, wenn i den Wert 7, 14, 21, 28, ... annimmt.
Und genau das passiert bei deinem Hex-File ja leider nicht, sondern nur bei 0 / 7.
Deshalb schaue ich jetzt einmal in dein Makefile. Mal sehen, ob ich was finde.
Gruß Sternthaler
P.S.: Oh Gott, ist das wieder lang geworden.
Lieber Asuro programieren als arbeiten gehen.
Lesezeichen