PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO-Lottozahlen



M1.R
22.10.2007, 17:26
Hallo,

mit dem Programm im Anhang könnt ihr euer Glück beim Lottospielen mit ASURO-Lottozahlen versuchen!

Kann mir vielleicht jemand einen Tipp geben, wie man die Zahlen aufsteigend sortieren könnte?

Gruss
M.

CsT
22.10.2007, 18:50
Hi, die Zahlen kannst du z.B. mit Bubblesort und co. sortieren lassen. Bei google dürften sich genug fertige Quelltexte finden lassen, die du dann nur noch geringfügig anpassen musst.

Tschau CsT

Sternthaler
22.10.2007, 21:56
Hallo M1.R,
wie groß ist denn die Wahrscheinlichkeit für einen 6-er mit Zusatzahl?
Ich finde es Klasse, wie der Asuro im Internet nach den Lotto-Statistikdaten sucht, um eine gute Voraussage zu machen.

Das mit dem Sortieren der 6 Zahlen geht auch ohne Bubble, aber nur 'brutal' ungefähr so: (Du verlierst dabei die Lottozahlen im Speicher.)

// Es muessen 6 Zahlen ausgegeben werden.
for (i = 0; i < 6; i++)
{
// 100 kann keine Lotto-Zahl sein, also muss eine Kleinere da sein.
min_wert = 100;

// Alle 6 Lottozahlen pruefen
for (j = 0; j < 6; j++)
{
// 0 ist keine Lottozahl. Diese Speicherstelle wurde schon uebertragen.
if (Lottozahl [j] != 0)
{
// Keine 0, es muss also noch eine Lottozahl sein, nun pruefen,
// ob sie kleiner als die bisher in min_zahl stehende ist.
if (Lottozahl [j] < min_wert)
{
// JA, die ist bis jetzt am kleinsten
min_wert = Lottozahl [j];

// Merker, an welcher Position das ist
min_merker = j;
}
}
}
// Alle 6 Speicherplaetze fuer die Lottozahlen geprueft.
// Die minimale Zahl ist gefunden, und wird nun mit 0
// ueberschrieben, damit sie in der Schleife oben nicht mehr
// bei den zu durchsuchenden Zahlen beruecksichtigt wird.
Lottozahl [min_merker] = 0;

// Und natuerlich noch ausgeben.
PrintInt (min_wert);
if (i < 5)
SerWrite(" | ",3);
}


Endlich mal eine wirklich sinnvolle Aufgabe für den Asuro.
Danke für das Programm.

Gruß Sternthaler

damaltor
23.10.2007, 03:01
das ist wirklich ein brutaler sortieralgorithmus =) aber für solche aufgaben ideal. evtl wäre es einfacher, von 0 an hochzuzählen, und wenn eine zahl in der liste ist, diese zu senden. wenn 6 zahlen gesendet wurden, reichts dann..

M1.R
23.10.2007, 17:30
Hallo,

danke für die Tipps!

@Sternthaler
leider bewegt sich die Wahrscheinlichkeit für 6 Richtige + Zusatzzahl so um die 0 % rum. :(
Dafür beträgt aber die Wahrscheinlichkeit für 5 Richtige + Zusatzzahl 100 % :)
und für 6 Richtige auch 100 % ! :)

Nach maximal unendlich vielen Versuchen hat der ASURO mindestens einmal 5 Richtige + Zusatzzahl und mindestens einmal 6 Richtige gefunden. Da er ja aber, wie du richtig bemerkt hast, auch noch im Internet recherchiert, brauchst du ihn nur ungefähr unendlich/2 mal suchen zu lassen!
Anschliessend musst du nur noch die richtige Kombination auf deinen Lottoschein übertragen...

Gruss
M.

Sternthaler
23.10.2007, 23:21
Hallo M1.R,
dank dir für die wahrscheinlich beste Wahrscheinlichkeitsrechnung bei der halben Wahrheitsfindung. Was eigendlich ist ein Lottoschein? ;-)

von Sternthaler viele Grüße

damaltor
23.10.2007, 23:29
hrhr... wahrscheinlichkeits >>rechnung<<... lol =) naja aber ich denke wir wissen alle was gemeint ist XD

M1.R
24.10.2007, 12:28
Hallo Sternthaler,

deine "Brutalsort" funktioniert wunderbar!
Dank deiner ausführlichen Kommentare habe ich es sogar kapiert. :)


Was eigendlich ist ein Lottoschein?
Um dir das zu demonstrieren, bin ich dabei eine grafische Ausgabe zu programmieren.
Kann aber noch ein paar Tage dauern, da mein ASURO zur Zeit leider krank ist.
(Er ist nur noch sporadisch zum Senden zu überreden - Wackelkontakt?)

Gruss
M.

damaltor
24.10.2007, 16:22
(Er ist nur noch sporadisch zum Senden zu überreden - Wackelkontakt?)

Nutzt du den RS232-Transceiver? dann könnten es auch einfache temperaturschwankungen sein. der ne555 ist da etwas empfindlich...

M1.R
24.10.2007, 18:03
Nutzt du den RS232-Transceiver?
Leider scheint die Ursache am ASURO zu liegen: wenn ich ihn "durchknete" fängt er irgendwann an zu senden.
Ich komme allerdings erst am Wochenende dazu , mich eingehender damit zu beschäftigen.
Wenn ich dann den Fehler nicht finde, würde ich gerne hier um Hilfe rufen.
Aber vielleicht erholt sich der ASURO ja auch von alleine, wenn ich ihm ein paar Tage Ruhe gönne.

Gruss
M.

uwegw
24.10.2007, 18:31
Dürfte ne kalte Lötstelle sein.
Machst du die grafische Ausgabe, indem du nen Stift dranschnallst und einmal über den Lottoschein fährst?

Sternthaler
24.10.2007, 23:49
Hallo zusammen


... deine "Brutalsort" funktioniert wunderbar!
Dank deiner ausführlichen Kommentare habe ich es sogar kapiert. :)
Freut mich, gern geschehen.


... da mein ASURO zur Zeit leider krank ist.
Gute Besserung. Ein paar Heilmittel wurden ja schon angeboten.

Hai, damaltor. Natürlich weiss jeder was gemeint ist. Oder habe ich wieder einen sehr wahrscheinlichen Schreibfehler, dass die Wahrscheinlichkeit zum verstehen nur noch klein ist? ;-)

Schöne Idee von dir uwegw, die Grafikausgabe, auf für jederman erschwingliche Hardware, zu reduzieren.
Nikolaus (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10291) mit Glückspiel (https://www.roboternetz.de/phpBB2/viewtopic.php?p=323044) (ich habe nach Lottoschein mal gegooglet) ist natürlich nicht mehr jugendfrei. ;-)

Gruß Sternthaler

damaltor
25.10.2007, 18:01
hrhr... ich habe mich nur über das wort "rechnung" gefreut.. ;)

Sternthaler
25.10.2007, 18:52
Prust, kicher.

Gruß Sternthaler

M1.R
25.10.2007, 20:29
Machst du die grafische Ausgabe, indem du nen Stift dranschnallst und einmal über den Lottoschein fährst?
gute Idee!

So ungefähr könnte das aussehen:


http://www.swoenke.de/asuro/asuro_lottoschein.jpg

Gruss
M.

damaltor
25.10.2007, 21:11
Prust, kicher.

Gruß Sternthaler
schön, dass du dich mit freust =)



So ungefähr könnte das aussehen:

Wer das so hinbekommt hat sich auf jeden fall einen preis verdient... allerdings sollten wie mit einem Lottoschein beginnen, dessen zahlenfelder mindestens 10 cm lang/breit sind, also ausgedruckt auf ca 70*70 cm.... ;)

M1.R
25.10.2007, 21:35
allerdings sollten wie mit einem Lottoschein beginnen, dessen zahlenfelder mindestens 10 cm lang/breit sind, also ausgedruckt auf ca 70*70 cm.... ;)man könnte ja ein paar DIN A4 Blätter aneinander kleben.

Erstmal muss der ASURO die Lottozahlen ermitteln und sortieren.
Dann könnte er auf der Linie entlangfahren und bei jeder Kreuzung prüfen, ob die Zahl vorkommt, wenn ja malt er das Kreuz und fährt zurück auf die Line, wenn nein fährt er geradeaus weiter.
Nach 7 zahlen biegt er ab - fährt runter bis zur nächsten Kreuzung, biegt ab ...


Wer das so hinbekommt hat sich auf jeden fall einen preis verdient... Wer das schafft, bekommt von mir einen ASURO-Lotto-Orden.

Gruss
M.

Sternthaler
28.10.2007, 15:15
Na, den Orden muss sich jetzt aber ein anderer verdienen.

Gruß Sternthaler

M1.R
06.11.2007, 21:36
Hallo,

hier eine neue Version mit "grafischer Ausgabe"

ich glaube, mein Code ist sehr umständlich...
über Verbesserungsvorschläge wäre ich dankbar!

Gruss
M.

Sternthaler
06.11.2007, 21:54
Super,
tolles Zeichenprogramm. !!!!

Mal sehen, ob man da noch was verbessern sollte. Lohnt sich aber keinesfalls, da der Output perfekt ist.

Bravo, gruß Sternthaler

M1.R
06.11.2007, 22:36
Super,
tolles Zeichenprogramm. !!!!
danke!!!! :)

Mal sehen, ob man da noch was verbessern sollte. Lohnt sich aber keinesfallsdoch! 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.
Gruss
M.

Sternthaler
06.11.2007, 22:43
Na, na, aufgeben is nich'.

Und siehe da, der Erfolg (ver)spricht Lottogewinn.

Gruß Sternthaler

Sternthaler
07.11.2007, 00:50
OK, dann hier eine 'geschrumpfte' Version.
Komplett anderer Ansatz die Zeichenfläche zu füllen.

Und noch ein Gruß von Sternthaler

damaltor
07.11.2007, 12:38
Du Ressourcenfresser! ;)

M1.R
07.11.2007, 13:31
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.

Sternthaler
07.11.2007, 21:47
@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 (http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/fprintf.html). Du solltest dir die da angegebene 'Formatierung' auf alle Fälle ansehen.
fmod-Beschreibung (http://www.phpcenter.de/de-html-manual/function.fmod.html)
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

damaltor
08.11.2007, 12:47
ICh werde sehen was sich machen lässt... ist die Sperre jetzt wieder deaktiviert? =)

M1.R
08.11.2007, 13:46
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.

M1.R
08.11.2007, 18:06
Bei weiteren Fragen: Nur zu.

ja gerne - danke

ich hab mal deinen code mit Kommentaren und Fragezeichen versehen, es wäre nett wenn du dir das anschauen würdest.


// 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

Gruss
M.

Sternthaler
09.11.2007, 00:13
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.

//49 plätze bestehend aus 5 zeichen:
//Lottozahl=leerzeichen/bzw X - ganze 2stellige zahl - leerzeichen - strich
sprintf (Lottozahl [i], " %2d |", i + 1);
Komplett richtig so. Die 49 Strings werden mit 5 Zeichen belegt " NN |"
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?


if (Lottozahl [zuf][0] == ' ') // == ?
// keine lottozahl dann ein leerzeichen ?
Hier wird aus dem 'zuf'-ten String der Variablen Lottozahl das 0-te Zeichen verglichen mit einem einzelnen char-Zeichen.
== 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.


if ( ! fmod (i, 7))
// wenn kein rest bei division i/7 da ist?
// also ganz am anfang und nach dem ende einer zeile
Ja, bei 0 auf alle Fälle, denn 0 durch irgendwas ist nun mal 0.
"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.

Sternthaler
09.11.2007, 01:38
So M1.R, nun habe ich den Fehler nachstellen können.

Es fehlt tatsächlich die Mathe-Funktion fmod().

Obwohl wir ja schon den Hinweis mit #include <math.h> gegeben hatten, reicht es aber noch nicht aus.
Der Compiler mag das #include.
Der Linker mag ein -lm und -L.... <--- Das fehlt in deinem Makefile

So kannst du das im AVR-Studio einstellen:
- Menü 'Project', Punkt 'Configuration Options'
- Im folgenden Fenster links das Bildchen 'Libraries' anklicken
- Oben rechts im Kasten 'Library Search Path' den Pfad zu deiner Win-AVR-Installation und weiter zu den Lib's einstellen.
-- Bei dir ist das "C:\winavr-20070525\avr\lib"
- Unten links im Kasten 'Available Link Objects' die Datei libm.a markieren
- Und zum Schluß den Button 'Add Library-->' drücken.

Das Fenster mit OK schließen.
Aus dem Menü 'Build' den Punkt 'Rebuild All' aufrufen. Es kommen wieder deine Warnings, die du im 2.ten compile-Lauf ja vermisst hattest. (Die kommen immer, wenn du die Datei lottozahlen_v051.c speicherst. Die Taste F7 (Build|Build) übersetzt nur die Dateien, die neuer sind als im Verzeichnis default liegenden *.o-Dateien. Deshalb keine Warnings im 2.ten Lauf.)

So funktioniert nun das erzeugte HEX-File auch bei mir. Und bestimmt auch bei dir und überhaupt bei allen weltweit verstreuten Asurianern.
Und wenn nicht, dann nochmal fragen. ;-)

Gruß Sternthaler

Schon wieder ein P.S.: Die Warnings kannst du in diesem Fall vergessen.
Liegt an deiner AVR-Compilerversion 4.1.2.
Ich habe noch die 3.8.1-Version. Da scheint die Unterscheidung zwischen 'unsigned char' und 'signed char' noch kein Warning zu sein.

Gute Nacht

M1.R
09.11.2007, 17:01
Hallo Sternthaler,
Vielen Dank für deine ausführlichen Erklärungen.:)
Eigentlich dachte ich, ich hätte jetzt alles kapiert, nur hier verwirrst du mich:

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.
if ( ! fmod (i, 7)) bedeutet doch: wenn i/7 = 0
dann mach return und waagrechten strich

bei der fehlerhaften Ausgabe scheint doch ab 8 bei jeder Zahl 0 rauszukommen, da jedesmal eine neue Zeile anfängt?


So kannst du das im AVR-Studio einstellen:
- Menü 'Project', Punkt 'Configuration Options'
- Im folgenden Fenster links das Bildchen 'Libraries' anklicken
- Oben rechts im Kasten 'Library Search Path' den Pfad zu deiner Win-AVR-Installation und weiter zu den Lib's einstellen.
-- Bei dir ist das "C:\winavr-20070525\avr\lib"
- Unten links im Kasten 'Available Link Objects' die Datei libm.a markieren
- Und zum Schluß den Button 'Add Library-->' drücken.

Das habe ich gemacht mit folgendem Ergebnis:

C:\WinAVR-20070525\avr\lib\libc.a(vfprintf_std.o): In function `vfprintf':
(.text+0x68): undefined reference to `__mulhi3'
make: *** [lottozahlen.elf] Error 1
Build failed with 1 errors and 11 warnings...

Daraufhin habe ich den Pfad wieder entfernt, und die schon vorhandene libm.a nach rechts geschickt.
(Screenshot im Anhang)
Jetzt gehts! :)

Wo kommen denn die Available Link Objects her, wenn kein Pfad angegeben ist?
Sollten die anderen Available Link Objects auch hinzugefügt werden?

Gruss
M.

Sternthaler
10.11.2007, 01:58
Vielen Dank für deine ausführlichen Erklärungen.:)
Gern geschehen.

Da habe ich mich wohl schlecht ausgedrückt. Ich hätte besser schreiben sollen:
"Hier sollte eigendlich auch bei dir immer nur dann eine 0 als Ergebnis kommen, wenn i ohne Rest durch 7 teilbar ist."

Du hast es richtig gesehen, dass erst dann eine neue Zeile mit Trennlinie zu zeichnen ist.
Also ist deine Frage: "bei der fehlerhaften Ausgabe scheint doch ab 8 bei jeder Zahl 0 rauszukommen, da jedesmal eine neue Zeile anfängt?" auf alle Fälle mit JA zu beantworten.

Genau dies hat mich auf die Fährte der fehlenden Mathe-Lib gebracht, da die fmod()-Funktion ja scheinbar durch irgendetwas anderes beim compilieren ersetzt wurde. Die 'Ersatzfunktion' hat da aber diesen Blödsinn gemacht. (Bitte zu einer 'Ersatzfunktion' keine Frage. So einen Schwachsinn habe ich bis jetzt noch nie in meiner C-Laufbahn gesehen.)


Schön, dass du es mit geänderten AVR-Studio-Einstellungen auch hinbekommen hast.
Aber auch hier habe ich keine Ahnung, warum du die Pfadangabe weglassen musst. Und vor allem weiß ich auch nicht warum die verfügbaren Lib's bei dir ohne Pfadangabe überhaupt angezeigt werden. (Ich muss aber gestehen, dass ich das Studio zum rausfummeln dieses Problem's, erst zum ersten mal benutzt habe.)
Ich habe die AVR-Version 4.13 Buld 557
Du müsstest eine andere Version haben, da in deinem geposteten Bild noch ein Pfeil-Runter-Kästchen unten rechts von 'Custom Options' ist. Den habe ich nicht. Liegt bestimmt daran.


Sollten die anderen Available Link Objects auch hinzugefügt werden?
Es ist keinesfalls falsch. Werden keine Funktionen aus den Lib's benötigt, wird dein HEX-Programm auch nicht größer dadurch.

Gruß Sternthaler

@damaltor
Bald kann ich wieder ein Bild posten. Dann kann ich auch ohne Wortmonster eine Lib-Einstellungs-Anweisung posten. ;-)

M1.R
10.11.2007, 14:17
Hallo Sternthaler,

(Bitte zu einer 'Ersatzfunktion' keine Frage. So einen Schwachsinn habe ich bis jetzt noch nie in meiner C-Laufbahn gesehen.)
ich frag nicht...
aber interessiert hat mich die "Ersatzfunktion" schon.
Daher habe ich dieses Programm ausprobiert:

for (i = 0; i <= 49; i++)
{
k = i/7;
l = fmod (i, 7);
rest = (i - (k*7)); // restberechnung
PrintInt (i);
SerWrite ("/7=", 3);
PrintInt (k);
SerWrite (" rest: ", 9);
PrintInt (rest);
SerWrite (" fmod: ", 9);
PrintInt (l);
SerWrite ("\r\n", 2);
}
wie erwartet kommt das raus:

0/7=0 rest: 0 fmod: 0
1/7=0 rest: 1 fmod: 1
2/7=0 rest: 2 fmod: 2
3/7=0 rest: 3 fmod: 3
4/7=0 rest: 4 fmod: 4
5/7=0 rest: 5 fmod: 5
6/7=0 rest: 6 fmod: 6
7/7=1 rest: 0 fmod: 0
8/7=1 rest: 1 fmod: 0
9/7=1 rest: 2 fmod: 0
10/7=1 rest: 3 fmod: 0
11/7=1 rest: 4 fmod: 0
12/7=1 rest: 5 fmod: 0
13/7=1 rest: 6 fmod: 0
14/7=2 rest: 0 fmod: 0
15/7=2 rest: 1 fmod: 0
16/7=2 rest: 2 fmod: 0
17/7=2 rest: 3 fmod: 0
18/7=2 rest: 4 fmod: 0
19/7=2 rest: 5 fmod: 0
20/7=2 rest: 6 fmod: 0
21/7=3 rest: 0 fmod: 0
22/7=3 rest: 1 fmod: 0
23/7=3 rest: 2 fmod: 0
24/7=3 rest: 3 fmod: 0
25/7=3 rest: 4 fmod: 0
26/7=3 rest: 5 fmod: 0
27/7=3 rest: 6 fmod: 0
28/7=4 rest: 0 fmod: 0
29/7=4 rest: 1 fmod: 0
30/7=4 rest: 2 fmod: 0
31/7=4 rest: 3 fmod: 0
32/7=4 rest: 4 fmod: 0
33/7=4 rest: 5 fmod: 0
34/7=4 rest: 6 fmod: 0
35/7=5 rest: 0 fmod: 0
36/7=5 rest: 1 fmod: 0
37/7=5 rest: 2 fmod: 0
38/7=5 rest: 3 fmod: 0
39/7=5 rest: 4 fmod: 0
40/7=5 rest: 5 fmod: 0
41/7=5 rest: 6 fmod: 0
42/7=6 rest: 0 fmod: 0
43/7=6 rest: 1 fmod: 0
44/7=6 rest: 2 fmod: 0
45/7=6 rest: 3 fmod: 0
46/7=6 rest: 4 fmod: 0
47/7=6 rest: 5 fmod: 0
48/7=6 rest: 6 fmod: 0
49/7=7 rest: 0 fmod: 0
aber jetzt wirds witzig:
dann habe ich die lbm.a wieder hinzugefügt mit diesem Ergebnis:

0/7=0 rest: 0 fmod: 0
1/7=0 rest: 1 fmod: 1
2/7=0 rest: 2 fmod: 2
3/7=0 rest: 3 fmod: 3
4/7=0 rest: 4 fmod: 4
5/7=0 rest: 5 fmod: 5
6/7=0 rest: 6 fmod: 6
7/7=1 rest: 0 fmod: 0
8/7=1 rest: 1 fmod: 1
9/7=1 rest: 2 fmod: 1
10/7=1 rest: 3 fmod: 3
11/7=1 rest: 4 fmod: 3
12/7=1 rest: 5 fmod: 5
13/7=1 rest: 6 fmod: 5
14/7=2 rest: 0 fmod: 0
15/7=2 rest: 1 fmod: 0
16/7=2 rest: 2 fmod: 2
17/7=2 rest: 3 fmod: 3
18/7=2 rest: 4 fmod: 3
19/7=2 rest: 5 fmod: 4
20/7=2 rest: 6 fmod: 6
21/7=3 rest: 0 fmod: 0
22/7=3 rest: 1 fmod: 0
23/7=3 rest: 2 fmod: 2
24/7=3 rest: 3 fmod: 3
25/7=3 rest: 4 fmod: 3
26/7=3 rest: 5 fmod: 4
27/7=3 rest: 6 fmod: 6
28/7=4 rest: 0 fmod: 0
29/7=4 rest: 1 fmod: 0
30/7=4 rest: 2 fmod: 1
31/7=4 rest: 3 fmod: 2
32/7=4 rest: 4 fmod: 4
33/7=4 rest: 5 fmod: 5
34/7=4 rest: 6 fmod: 6
35/7=5 rest: 0 fmod: 0
36/7=5 rest: 1 fmod: 0
37/7=5 rest: 2 fmod: 1
38/7=5 rest: 3 fmod: 2
39/7=5 rest: 4 fmod: 4
40/7=5 rest: 5 fmod: 5
41/7=5 rest: 6 fmod: 6
42/7=6 rest: 0 fmod: 0
43/7=6 rest: 1 fmod: 0
44/7=6 rest: 2 fmod: 1
45/7=6 rest: 3 fmod: 2
46/7=6 rest: 4 fmod: 4
47/7=6 rest: 5 fmod: 5
48/7=6 rest: 6 fmod: 6
49/7=7 rest: 0 fmod: 0
es ist mir absolut schleierhaft, warum der Lottoschein trotzdem richtig gemalt wird.
Aber egal - Hauptsache es funktioniert


Ich habe die AVR-Version 4.13 Buld 557habe ich auch!

Gruss
M.

Sternthaler
10.11.2007, 19:11
Hallo M1.R,
so ganz unverständlich ist das Ergebnis nicht.
Du hast folgenden Code angegeben:

l = fmod (i, 7);
..
SerWrite (" fmod: ", 9);
PrintInt (l);
Folgendes steht zur Auswahl:
- l ist eine Integer-Variable
--- Das Ergebnis von fmod() muss nach Int gewandelt werden
--- PrintInt kann sauber arbeiten

- l ist eine float-Variable
--- Das Ergebnis von fmod() kann ohne Wandlung gespeichert werden
--- PrintInt muss eine Typ-Umwandlung machen.

Du hast so immer eine Wandlung einer Float-Zahl zurück in eine Int-Zahl. Da sind eigendlich immer Verluste einzurechnen.

Gruß Sternthaler

M1.R
10.11.2007, 20:45
- l ist eine float-Variable
--- Das Ergebnis von fmod() kann ohne Wandlung gespeichert werden
--- PrintInt muss eine Typ-Umwandlung machen.

jetzt habe ich l als float definiert.
Wie kann ich das jetzt ausgeben?
PrintFloat gibts ja nicht.
Habe alle möglichen Varianten mit printf und mit sprintf und SerWrite erfolglos probiert.
Gruss
M.

damaltor
10.11.2007, 22:38
such mal nach der funktion "ftoa" oder so ähnlich im netz, damit kann man das umwandeln denk ich

Sternthaler
11.11.2007, 12:30
Hallo damaltor und M1.R

Klar kann man ftoa() benutzten.
Aber wäre es nicht für dich M1.R interessant, dass du dir nochmal die fprintf()-Funktion mit den 'Formatierung'-en ansiehst.
Kleiner Tip: Ich habe 2 Stellen einer Int-Variablen mit %2d formatiert.
Wir müssen hier eine unbekannte/uninteressante Anzahl Stellen einer double-Zahl formatieren.
(Man kann auch eine float/double-Zahl mit %n.m? auf eine feste Länge formatieren. Das Fragezeichen must du selber rausbekommen. n und m sind Zahlen. Der . ist ein Punkt)

Warum ftoa() meiden?
Schon wieder eine neue Funktion, die dann auch wieder in die HEX-Datei will. fprintf() haben wir schon, dann würde ich sie auch nochmal benutzt.
That's all
Im übrigen ist deine Lösung M1.R, die Berechnung des Nachkommaanteil's selber zu machen, aus dem gleichen Grund besser, als die fmod()-Funktion zu nutzen.

Gruß Sternthaler

Sternthaler
11.11.2007, 15:49
Hallo zusammen,
nur eine Info zum Unterschied bei der AVR-Studio-Einstellung bei M1.R und mir.
Unter Asuro und eeprom (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=327035#327035) war ich 'gezwungen' eine neue Version vom avr-gcc zu installieren.
Da habe ich gleich mal ein paar Test's zum Zusammenspiel zwischen avr-gcc- und AVR-Studio-Installation gemacht.
Erst avr-gcc und dann AVR-Studio liefert im Studio die Info, wo die Lib's zu finden sind. Es ist nicht gut, eine neue avr-gcc-Version in ein neues Unterverzeichniss zu installieren. Besser ist es die alte Version zu deinstallieren, und die neue Version in das alte Verzeichnis zu schreiben.

Gruß Sternthaler

M1.R
11.11.2007, 17:13
Danke für eure Tipps!

habe es mittlerweile zumindest mal geschafft eine ganze Zahl (string1) auszugeben und dabei festgestellt, dass das auch ohne Angabe der Stellenzahl geht. Die gleiche Methode mit float geht aber nicht (string2).
Ich bitte mal wieder um Hilfe!
Was ist falsch?

int test1;
test1 = 11;
char string1 [20];
sprintf (string1, "%d", test1);
SerWrite (string1, 2);

SerWrite ("\r\n", 2);

float test2;
test2 = 22.33;
char string2 [20];
sprintf (string2, "%f", test2);
SerWrite (string2, 5);

SerWrite ("\r\n", 2);
Gruss
M.

damaltor
11.11.2007, 18:29
was wird denn ausgegeben?

M1.R
11.11.2007, 19:04
was wird denn ausgegeben?
das da:

damaltor
11.11.2007, 19:33
das ist jetz aber eher schlecht... ;)

aber probier mal %e, %E oder %g und %G

quelle: http://www.cppreference.com/stdio/printf.html

M1.R
14.11.2007, 19:57
aber probier mal %e, %E oder %g und %G

Hallo,

dieses Programm:


//test kommazahlen

#include <stdio.h>
#include <math.h>
#include "asuro.h"

int main(void)
{
Init ();

SerWrite ("\r\n", 2);

int test1;
test1 = 11;
char string1 [3];

SerWrite ("int:\r\n",6);

sprintf (string1, "%d", test1);
SerWrite (string1, 2);


float test2;
test2 = 22.33;
char string2 [10];

SerWrite ("\r\n\r\n", 4);

SerWrite ("float \%f:\r\n",11);

sprintf (string2, "%f", test2);
SerWrite (string2, 5);
SerWrite ("\r\n\r\n", 4);


SerWrite ("float \%.2f:\r\n",13);

sprintf (string2, "%.2f", test2);
SerWrite (string2, 5);
SerWrite ("\r\n\r\n", 4);


SerWrite ("float \%2.2f:\r\n",14);

sprintf (string2, "%2.2f", test2);
SerWrite (string2, 5);
SerWrite ("\r\n\r\n", 4);


SerWrite ("float \%g:\r\n",11);

sprintf (string2, "%g", test2);
SerWrite (string2, 5);
SerWrite ("\r\n\r\n", 4);


SerWrite ("float \%G:\r\n",11);

sprintf (string2, "%G", test2);
SerWrite (string2, 5);
SerWrite ("\r\n\r\n", 4);


SerWrite ("float \%e:\r\n",11);

sprintf (string2, "%e", test2);
SerWrite (string2, 5);
SerWrite ("\r\n\r\n", 4);


SerWrite ("float \%E:\r\n",11);

sprintf (string2, "%E", test2);
SerWrite (string2, 5);

// fertig!
StatusLED (RED);
BackLED (ON, ON);
while (1);
return 0;
}


macht so eine Ausgabe (Anhang)

nach jeder klitzekleinen Änderung am Programm (z.B. Leerzeilen oder Kommentare einfügen) erscheinen andere Hieroglyphen.

Gruss
M.

damaltor
15.11.2007, 01:14
das ist ja völlige grütze. =)

evtl probierst du mal ftoa (ähnlich wie itoa) und machst das ganze in 2 schritten...

scheint aber nur in einigen versionen der avr-gcc library verfügbar zu sein:
http://www.mikrocontroller.net/topic/1146

M1.R
15.11.2007, 15:39
mit dtostrf (stdlib.h) gehts! :)

Gruss
M.

Sternthaler
15.11.2007, 20:22
Hallo zusammen,
ein bisschen spät, aber besser als nie.

Ich konnte das Problem mit dem %f auch nachvollziehen. Auch bei mir ist keine vernünftige Ausgabe entstanden.

Aber wie ich sehe hast du eine andere Funktion gefunden, die ja geht.
Da kann ich jetzt nur staunen, denn dieses Ding kenn ich noch nichmal nach zig Jahren C-Hackerei.

Gruß Sternthaler

damaltor
15.11.2007, 20:40
google hilft =) ich habs vorher auch noch nie gesehen.

Sternthaler
16.11.2007, 03:07
Da sieht man mal, was uns die 'Neulinge' so alles noch beibringen können ;-) (T'schuldigung M1.R)

Gruß Sternthaler

M1.R
17.11.2007, 01:48
Hallo Sternthaler,

Da sieht man mal, was uns die 'Neulinge' so alles noch beibringen könnenfreut mich, wenn ich auch mal was für euch Profis tun kann.

Nun möchte ich aber doch gerne wissen, wie ich vom Status "Neuling" aufsteigen kann?
Wie heißt denn überhaupt die nächste Stufe?
Ist es notwendig eine Prüfung abzulegen?
Oder wird man/frau automatisch nach 10 Jahren Forumszugehörigkeit befördert? ;-)

Gruss
M.

damaltor
17.11.2007, 06:33
Hrhr...

ich befördere dich hiermit zum Fortgeschrittenen User ;)

nein, such dir deinen status aus, ich denke wir haben hier im forum alles von profi-C-hackern bis hin zu power-googlern... :D

izaseba
17.11.2007, 14:48
Hallo,
Ich weiß nicht, ob es noch von Bedeutung ist, es gibt aber verschiedene printf Bibliotheken und wenn man sprintf mit float nutzen will muß man auch die floatbibliothek einbinden.

Mit -lprintf_flt hinter LIBS in Makefile sollte sprintf mit float funktionieren :-k

Hab selber noch nicht getestet, aber mal irgendwo von gelesen.

Gruß Sebastian

M1.R
17.11.2007, 17:10
nein, such dir deinen status ausna ja, wenn ich es mir aussuchen darf, bevorzuge ich ein "statusloses" Forumsdasein.

@Sternthaler,
wie ist es dir gelungen, die automatische Beitrags-Quantitäts-Einstufung auszublenden?

Gruss
M.

damaltor
17.11.2007, 18:28
ha.. das hab ich mich auch schon gefragt... =)

muss irgendwas wie "rang verstecken" sein oder so.. die anderen "offiziellen" einstufungen kannst du dir mit einem klick auf "Ränge" in der menüleiste ganz oben ansehen.

Sternthaler
18.11.2007, 01:52
Hallo izaseba,
oh man, ist das einfach. Das ganze steht ja schon in dem, auf der CD mitgelieferten, Makefile. Da leider auskommentiert:


# Additional libraries
#
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
#
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt

Also flux den # löschen, und schon kommt das aus dem Asuro raus:

11
22.3300(Minitestprogramm von dir M1.R)

Das nun die 'Kleinigkeit' von 83 Pages zum Asuro müssen ist dabei ja 'Nebensächlich' :(


@M1.R @damaltor
Aber was meint ihr eigendlich, dass ich irgendetwas ausgeblendet hätte?

@Sternthaler,
wie ist es dir gelungen, die automatische Beitrags-Quantitäts-Einstufung auszublenden?Woher soll ich das denn wissen? Jetzt scheinst du M1.R das aber zu wissen, denn nun ist deine Beitrags-Quantitäts-Einstufung plötzlich weg.
Teils du uns nun mit wie das geht?

Gruß Sternthaler, der Statuslose

damaltor
18.11.2007, 04:21
tja sternthaler... so wie du M1.R siehst, sehen wir dich... statuslos :)

scheint wohl ein kleiner bug zu sein...

Sternthaler
18.11.2007, 05:25
Hallo damaltor,
bist du noch, oder schon auf? (bei mir ist es noch)

Gruß der Statuslose (huch jetzt auch Namenslos)

M1.R
18.11.2007, 11:57
Teils du uns nun mit wie das geht?
ich hab ziemlich wahllos rumprobiert - kann sein, das es so geht - Anhang.
(selber sieht man sich aber nur in ausgelogtem Zustand statuslos)

Gruss
M.

damaltor
18.11.2007, 14:55
interessantes spielzeug... ich war übrigens noch auf... ;)