Drücke „Enter”, um zum Inhalt zu springen.

Veröffentliche Beiträge in “Digitales”

Datenverarbeitung, Geschichte, Computer, Internet

Des Rätsels Lösung

Jan 0

Letztens hatte ich ja einen Beitrag mit einem kleinen Programmierrätsel geschrieben. Hier nochmal kurz die Problembeschreibung: Die Routine schneidet bei double-Werte zwischen 0 und -1 das Vorzeichen weg. Nachdem ich die Routine debuggt habe, konnte ich den Fehler auf genau eine Zeile festnageln.

int gruppe = ((long)value)%1000;

Spielen wir das doch mal für folgende Werte durch:

value (double) gruppe (int)
50.0 50
5.0 5
0.5 0
0 0
-0.5 0
-5.0 -5
-50.0 -50

Das Problem ist: Wenn man einen double-Wert auf long castet, geht der Nachkommabereich verloren. Wenn der aber entscheidend für das Vorzeichen ist, wie z.B. bei -0.5, dann geht auch das Vorzeichen verloren, denn -0 gibt es nicht!

Also blieb mir nichts weiter übrig, als den Wertebereich abzufragen und ein Flag zu setzen, dass ich nach der Konvertierung abfrage und dann manuell ein negatives Vorzeichen in den String einbaue.

Weiter geht’s

Jan 0

Heute habe ich mir ein paar Controls vorgenommen und in die Oberfläche eingefügt. Klingt erstmal nicht aufregend, wurde aber spannend, als ich mich mit dem Visual Editor herumschlug und feststellte, dass die Konfiguration des Layouts nicht so funktionierte, wie ich mir das dachte.

Also schnappte ich mir ein paar Tutorials, bis ich gefunden hatte, was ich suchte. Händisch programmierte ich dann das Layout, sowie die Ausdehnungen für die Controls rein und plötzlich konnte der Visual Editor mit Layouts umgehen und schlug mir vor, wohin ich welche Objekte verschieben kann. Der Code, der dabei herauskommt, ist dabei noch jenseits von dem, was ich mir unter ordentlicher Programmierung vorstelle. Also werde ich noch etwas weiter den Prototypen vorantreiben und dann noch mal eine händische, aber ordentliche Programmierung vornehmen.

Jedenfalls sah das Ergebnis heute so aus:

programm_3

Nächstes Mal werde ich mit Scrollbars experimentieren und versuchen Fraktale zu erzeugen, die größer als das dargestellte Fenster sind. Ach so... die Buttons sind noch ohne Funktion - den Listener muss ich auch noch schreiben. Ich wollte nur mal sehen, wie sich Buttons in die Toolbar einbauen lassen, interessant wäre dann noch das Einbinden von Grafiken auf die Buttons. Das "Fertig..." ist auch nur ein Fake, einzig die Funktion Programm->Ende wird schon erfolgreich ausgeführt.

Erste Äpfel…

Jan 0

Ich habe heute abend wieder begonnen, mein Fraktalprogramm zu schreiben. Wieder weil ja mein Rechner komplett zusammengebrochen ist und eine Neuinstallation von Nöten war. Natürlich hab ich die Quellen nicht gesichert. Also hieß es heute komplett von vorn zu beginnen. Zumindest habe ich jetzt den Stand vom ersten Abend nachbauen können und diesmal gleich die Quellen auf eine andere Platte gesichert.

fp_01

Naja, ich hoffe, dass ich bald den Stand wie er auf dem Fraktalblog steht, wieder erreicht habe!

4 c0d3rz 0n7y!

Jan 0

Ich bin immer wieder begeistert, wie buggy eine Routine sein kann. Bei der Umwandlung von double-Werten in einen formatierten String, trat folgendes Problem auf: Die Funktion arbeitet korrekt, es sei denn, man gibt einen Wert zwischen 0 und -1 Euro an, dann geht das Vorzeichen verloren. Alles weitere funktioniert korrekt!

do {   // Rest bilden   int gruppe = ((long)value)%1000;   // nächste Gruppe ermitteln   value /= 1000.0;   // noch mehr da?   if (1.0 < value || -1.0 > value)   {     // mit Nullen auffüllen     // und Punkt setzen     result = "." + String(abs(gruppe),true,3) + result;   }   else   {     // keine Nullen     // Kein Punkt     result = String(gruppe,false,3) + result;   } } while (1.0 < value || -1.0 > value);

Na... wer findet den Bug?

Schöne neue (digitale) Welt

Jan 0

Nach meinem Beitrag über meinen dahin scheidenden Rechner, gab mir ein Kollege ein Messgerät mit. Es kann ja nicht schaden, mal die Spannung der Batterie zu prüfen. Also zerlegte ich meinen Rechner, baute noch mein ZIP-Laufwerk ein, verlegte die Hosenträger so, dass CD und ZIP an einem Strang hingen und die IDE-Platte an einem anderen. Eventuelle Master - Slave-Jumpereien inklusive!

Angeschaltet. Wie immer - nur das Linux war bereit, seinen Dienst zu verrichten. Also nahm ich den Rechner wieder auseinander, knipperte die CMOS-Batterie raus. Die Prüfung der Batterie ergab: 3.05 Volt. Super! Also noch ein kleiner Selbstversuch: Beide Kontakte des Messgeräts angefasst: 0.17 Volt!? Ein weiterer Selbstversuch am Kopf ergab: 0.50 Volt! Ich glaub, ich steh' unter Strom.

Was aber das Entscheidende war: Ich baute die Batterie wieder ein und was tat sich? Nichts! Garnichts! Die erste Idee: Spannungsspitze und damit irgendwas zerlegt. Also Grafikkarte gewechselt: Immer noch alles schwarz. In meiner Verzweiflung rief ich den "Hardware-,Handy- und sonstigen elektronischen Krimskrams"-Spezialisten Basti an. Seine Theorie stimmte erstmal mit meiner überein: da hat es wohl was zerlegt. Vermutlich das Board.

Also bin ich den nächsten Tag zum eigentlich Plätzchen-Backen mit meinem Rechner angetanzt und Basti wechselte eine Komponente nach der anderen, bis er sich sicher war: Das Board ist hinüber. Also hieß es schnell im Internet nachsehen, was man sich als Alternative holen kann. Die Antwort war schnell gefunden: Zu einem 939-Prozessor passt ein Asus A8V Deluxe! Also flitzte ich los und holte das Board... Als ich wieder ankam merkten wir: Irgendwie passt der Prozessor nicht. Ein Blick auf das alte Board verriet uns: ein 754er Sockel wäre angebrachter gewesen. Also bin ich nochmal los: Das Board wurde problemlos zurückgenommen und ich fuhr zu einem anderen Anbieter um ein neues zu holen: Diesmal der Favourit: Asus K8V-X SE. Prozessor eingebaut - passt und mein altes XP fuhr dank identischem Chipsatz sogar fast anstandlos wieder hoch.

Also machte ich mich heute vormittag an die Neukonfiguration. IDE-Platte und SATA-Platte dösten beide träge in dem Rechner vor sich hin. Das XP bootete von der SATA-Platte problemlos. Also startete ich die Installation - und *schwups* verschwand die SATA-Platte aus dem Menü der zur Verfügung stehenden Platten. Also schnell die IDE-Platte ausgebaut. Plötzlich ging das XP garnicht mehr zu booten und die Installation fand garkeine Festplatte mehr. Schweren Herzens entschloss ich mich auf die IDE-Platte zu installieren. Nachdem er fertig war, rief ich wieder bei Basti an. Der erklärte mir, was fehlte: ein Treiber bei der XP-Installation. Also hab ich mit Hilfe meiner alten XP-Version eine Treiber-Diskette von der Mainboard-Treiber-CD erstellt. Auf einmal: Bluescreen, Absturz. Die Diagnose war klar - das alte XP war noch auf das alte Board ausgelegt und die Diskette konnte ich so wegwerfen, wie sie war. Also mit der Installation von der IDE-Platte eine neue Diskette erstellt und siehe da - es ging. Soweit so gut hab ich also meinen Rechner wieder komplett installiert und mußte feststellen, dass sich mein Gesetz bestätigt hat:

Speedys Law:

Wenn du Sicherungskopien deiner Daten wegen einer Neuinstallation anlegst, wirst du garantiert einen Teil vergessen. Das wird dir natürlich erst auffallen, nachdem das Betriebssystem komplett neu installiert ist und sämtliche zu sichernden Daten verloren sind.

So auch diesmal. Die ICQ-History war gesichert, Mails waren gesichert. Nur eins nicht: die Quellcodes meines Fraktalprogramms. Die sind jetzt hinüber und ich darf von vorn anfangen.

Verzweifelt

Jan 0

Nachdem mein Windows XP garnicht mehr startete, griff ich auf meine Linux-Partition zurück. Schließlich hatte ich noch einen Eintrag bei blog.de zu ändern. Nur stellte sich der Konquerer quer, Buttons verschwanden, wenn man drauf klicken wollte. Es dauerte eine Stunde, bis ich den Beitrag fertig hatte.

Danach war ich so frustriert, dass ich meine Daten von der Windows-Partition sicherte, selbige Partition platt machte und dann mein Windows neu installierte. Während dessen ging ich Squash spielen. Installieren kann der auch ganz gut ohne mich... Als ich wieder heimkam, war die Installation so gut wie fertig und ich fing an Treiber und ähnliche Sachen zu installieren. Dabei habe ich es schon öfters erlebt, dass wenn man ca. 10 Programme installiert hat, dass es beim runterfahren Probleme gibt. Also hab ich mir keine Gedanken gemacht, als er hängen blieb. Hochfahrem ging ja wieder problemlos.

Heute morgen versuchte ich ihn dann wieder zum Leben zu erwecken... Nichts - genau das gleiche Spiel wie gestern. Ich habe festgestellt, dass er an 3 fest definierbaren Stellen hängen bleibt:

  • noch bevor der Start von XP beginnt, also das Logo mit dem blauen wandernden Balken erscheint
  • kurz nachdem der Anmeldebildschirm angezeigt wird
  • kurz nach der Anmeldung

Weitere Symptome und Nebeneffekte:

  • Meldungen, dass die Registry defekt wäre
  • ein Checksum-Error vom BIOS
  • natürlich auch Bluescreens
  • wenn der Rechner einmal läuft, bleibt er stabil

Mir machen ehrlich gesagt die BIOS-Meldungen Sorgen. Mein Kollege meinte schon, die Batterie könnte leer sein. Nun die Frage: Kann sich das so verheerend auswirken? Gibt es noch andere Tipps?

Ich weiß es…

Jan 0

Wer immer dachte, die Jahreszeiten hätten etwas mit dem Lauf der Erde um die Sonne bzw. der Neigung der Erdachse zu tun, der irrt. Eigentlich ist immer Sommer! Die Ursache für die plötzliche Kälte sind Registry-Schäden oder Dateifehler im Computer. Hier der Beweis...

frost

Kein Wunder, dass es zur Zeit so kalt ist, irgendwie hat mein Rechner ja gerade Probleme!

PS: Wozu einen Übersetzer fragen, wenn es Programme dafür gibt.

Kleine Schritte

Jan 0

Heute hatte ich mir vorgenommen, die Berechnung und die Anzeige von einander zu trennen. Dazu habe ich in meiner Fraktalklasse aus einer Methode zwei gemacht. Eine zum Berechnen und eine zum Ausgeben. Die Oberfläche wurde davon kaum tangiert. Beim Ausgeben wird nur die Fraktalklasse nach dem Bild abgefragt. Dass das schon berechnet ist, interessiert dabei ja nicht. Ergebnis: Das Scrollen in der Grafik geht schön flüssig und ohne Ruckeln.

programm_5

Dem Berechnen-Button wurde endlich ein Icon verpasst und Funktionalität hinterlegt. Wenn der Button gedrückt wird, wird das Fraktal neu berechnet. Und schon stehe ich wieder vor einem neuen Problem, dass kein Neues ist: Wenn ich auf den Button berechnen drücke, soll der Text der Statuszeile auf "Rechne..." gesetzt werden und sobald er fertig ist, wieder auf "Fertig...". Das Problem äußert sich dann wie folgt: Es bleibt "Gestartet..." stehen, er rechnet und wenn er fertig ist, blitzt kurz was auf und dann steht "Fertig..." da. Woran liegt das? Stichwort: Eventqueue. Wenn der Button gedrückt wird, geht das Programm in den dafür vorgesehenen Zweig der Eventbearbeitung. Solange der Event abgearbeitet wird, müssen andere Events warten. So auch die Events, die das Neuzeichnen der Statuszeile veranlassen.

Demzufolge ist die nächste Aufgabe: Der Buttonevent muss schnell verlassen werden und den Weg frei geben für die Ausgabe der Statusnachrichten. Realisierung: Mit Betreten des Eventhandler wird ein Thread gestartet, der Setzen des Textes, Berechnen und wiederum Setzen des Textes veranlasst.

Was zu einem wirklichen Problem werden kann, ist das Setzen einer benutzerdefinierten Palette. Momentan adressiere ich die Werte für die Pixel direkt, d.h. ich benutze jeweils einen Wert für jeden der RGB-Kanäle. Realisierungsmöglichkeiten:

  1. Eine Übersetzungstabelle zwischenschalten, die mir die RGB-Werte für einen bestimmten Abbruchwert liefert. Nachteil dabei ist, dass diese Tabelle 16,7 Millionen Einträge hat.
  2. Abbildung über eine Formel: Anhand der Formel kann ich aus dem Abbruchwert den RGB-Wert berechnen. Diese Methode ist allgemein bei Fraktalgeneratoren üblich.

Und gegen abend – Regen

Jan 0

Nachdem ich heute morgen schon mal aufgezählt habe, was den vorteilhaft gegenüber einer Fahrt mit dem ÖPNV ist, fiel mir heute nachmittag noch etwas ein....

Begonnen hat das Ganze mit einer ewig langen Suche nach Bugs im meinem Programm. Und wer schon mal ein Programm zerlegen und wieder zusammensetzen mußte, weiß wovon ich rede. So stolperte ich von einem Bug zum anderen. Das erstaunliche daran war, dass ich viele gefunden hab, die sonst niemand entdeckt hätte. Gegen 16:30 Uhr glaubte ich meinem Ziel unglaublich nahe und packte schon mal alles zusammen. Doch mein Test ergab, das Ergebnis stimmte, aber die Teilsummen nicht. Also ging die Suche weiter. Ungefähr 2 Bugfixes und keine Änderung später sah ich mich schon morgen wieder auf Arbeit kommen, da der Fehler bis Donnerstag gefixt sein mußte und wir Sachsen morgen unseren teuer bezahlten Buß- und Bettag haben.

Um es mal mit Alanis Morissettes Worten zu sagen:

And life has funny way of helping you out when You think everything's gone wrong und everything blows up In your face

Denn 17:45 Uhr ging auf einmal alles auf. Die Gesamtsumme stimmte, die Teilsummen stimmten, es gab keine Rundungsfehler. Unter anderem machte sich folgender Bug breit... Es darf wieder mal geraten werden.

unsigned long Toolbox::RundeToCent(double value) {   // Rückgabewert   unsigned long rc = 0;   // einige Konvertierungen   [...]   // Rundung ab 0.5 auf nächsten vollen Wert   // sog. buchhalterisches Runden   rc = (unsigned long)value;   if (0.0 < value)   {     if (value - rc >= 0.5)       ++rc;   }   else   {     if (value - rc <= -0.5)       --rc;   }   // Rückgabe   return rc; }

Und dabei ist es doch so offensichtlich. Auf jeden Fall ging ich noch schnell in die Kaffeeküche und schaffte meine Tassen weg. Ich sah schon die nasse Scheibe und als ich ging, rannte ich schnell bei strömenden Regen zum Auto. Ich dem Moment war ich wieder froh, mit dem Auto auf Arbeit gefahren zu sein. Außentemperatur 3-4°C und dann Regen ist einfach hässlich. Auf dem Heimweg hatte es an etlichen Stellen Unfälle gegeben unter anderem mitten auf einer Elbbrücke, was für mich bedeutete, dass ich gut eine halbe Stunde für 300-400 Meter brauchte, aber es war warm. Aber die Straßenbahn stand auch - ein weiteres Pro für das Team Rüedi + Speedy.

Zur Compilezeit

Jan 0

Während nebenbei der Compiler sich mal wieder über meinen Quelltext hermacht ( 1,7 MB ), schau ich mich nebenbei noch ein bißchen bei deviantART um, füge ein paar Favouriten hinzu ...

storm_thumb

und erfreue mich an den Statistiken, die deviantART für meinen Account generiert:

electro-space has 76 pageviews total and his 50 deviations were viewed 317 times. He watches 4 people, while 0 people watch him. Overall, his deviations received 43 comments and were added to deviants' favourites 9 times, while he commented 29 times, making about 1.66 comments per day since he joined DA. This means that he received 15 comments for every 10 that he gave. His deviation with the most comments is Fractal art No. 74 with 7 comments, receiving an average of 0.5 per day in the first 2 weeks, and it is also his most favourited, with 2 favourites, averaging 0.14 per day in the first 2 weeks. His most viewed deviation is Fractal art No. 87 with 32 views. 2 favourites were given for every 10 comments. Every 0.3 days he uploads a new deviation, and it's usually on a Monday, with 11 (22%) of his deviations. His busiest month was November 2005 with 47 (94%) of his deviations. The majority of his deviations are uploaded to the Digital Art gallery (50), while his favourite category was Digital Art > Fractal Art with 50 deviations. Comments per deviation: 0.86 Favourites per deviation: 0.18 Views per deviation: 6.34 Comments per day: 2.46 Favourites per day: 0.51 Views per day: 18.17 Pageviews per day: 4.35
WordPress Cookie Hinweis von Real Cookie Banner