Hallo Besucher, der Thread wurde 2,8k mal aufgerufen und enthält 16 Antworten

letzter Beitrag von Endurion am

C++: Und gleich das nächste Problem...

  • Hi(gh)!


    Im Moment klappt mit Programmieren wirklich rein gar nichts... werde ich dement? Oder liegt es an der ausgesucht scheißigen Umgebung (lärmiges Unterschicht-Wohnklo ohne Klimaanlage in lärmigem Unterschicht-Viertel, fast ununterbrochenes Kindergeschrei, Bassgewummer, Auspuffgebrüll und ständiger Martinshorn-Terror)?


    Konkret:


    Die Funktion c64fill():



    soll sowohl im "blocks"-Modus (40 x 25 Pixel) als auch im Multicolor-Modus (160 x 200 Pixel) bei im Original nicht bildschirmfüllenden Bildern fehlende Zeilen oder Spalten mit einer frei aus der C 64-Palette wählbaren Füllfarbe auffüllen. palette ist ein globaler Vektor aus rgb-Strukturen (struct rgb ist in meiner Klassendatei definiert) und wurde schon beim vorangegangenen Aufruf der Funktion c64() mit den entsprechenden Farbwerten belegt.


    Bis gestern funktionierte diese Funktion noch - mittlerweile lässt sie die Bilder unverändert, d. h. es werden keine Spalten oder Zeilen aufgefüllt. Ich bin drauf und dran, die Programmiererei mit C++ endgültig dranzugeben, ich kann es ja anscheinend schlichtweg nicht! Schon gar nicht, wenn ich dauernd durch irgendwelchen Alltagsschlamassel (wie das halt eben normal ist in der Unterschicht) abgelenkt werde... Alltag und Programmieren, das beißt sich!


    Bis bald im Khyberspace!


    Yadgar



    <MOD EDIT> Code umformatiert zur besseren Lesbarkeit

  • Bis gestern funktionierte diese Funktion noch - mittlerweile lässt sie die Bilder unverändert, d. h. es werden keine Spalten oder Zeilen aufgefüllt. Ich bin drauf und dran, die Programmiererei mit C++ endgültig dranzugeben, ich kann es ja anscheinend schlichtweg nicht! Schon gar nicht, wenn ich dauernd durch irgendwelchen Alltagsschlamassel (wie das halt eben normal ist in der Unterschicht) abgelenkt werde... Alltag und Programmieren, das beißt sich!

    Sprache wechseln? Kann helfen. :bgdev
    Aufgeben? Nein! :prof:


    Ich kann kein C++ und kann daher Deinen Code nicht lesen. Aber wenn gestern etwas funktioniert hat und heute scheinbar nicht mehr, dann ist das ein Seiteneffekt, d.h. das Problem liegt möglicherweise nicht in dem Code den Du gerade veröffentlicht hast sondern ganz woanders.


    Beispiel:
    Vor kurzem hatte ich ein Problem in VB.net. Heute funktionierte es, am nächsten Tag nicht mehr. Ursache war das ich bei der GUI einen Event mit falschen Parametern verwendet und zusätzlich falsch angesprochen hatte. Das machte lustige Effekte welche im Debugger so nicht zu finden waren. :honk:


    Da hilft manchmal ne Nacht drüber zu schlafen oder das Programmieren in die Nacht zu verlegen wenn alles ruhig ist. Oder für solche Momente index.jpg verwenden. Die können nicht nur beim :sleeping: Wunder wirken.

  • Ich bin drauf und dran, die Programmiererei mit C++ endgültig dranzugeben, ich kann es ja anscheinend schlichtweg nicht!

    Nicht aufgeben! Jeder Fehler den Du jetzt am Anfang findest führt zu einem Aha-Erlebnis und einen Sprung nach vorne. Ja, als Neuling in einer Sprache ist man seeehr ineffizient, das ist normal. Durch Üben kommt die Routine und dann geht alles schneller. C++ und Templates haben leider eine recht steile Lernkurve am Anfang.


    Im anderen Thread hatte Endurion glaube ich gefragt, ob Du mit dem Debugger umgehen kannst. Der ist bei so einer Fehlersuche natürlich extrem hilfreich.

  • Es klappt und klappt und klappt und klappt und klappt nicht... jeder Versuch, Fehler zu korrigieren, produziert nur neue Fehler. Ich will nicht mehr, ich bin kurz davor, alles zu vernichten, was mit yip zu tun hat... dann gibt es eben keine Retro-Videos im C64-Look!


    ICH KANN KEIN C++! ICH BIN ZU DUMM DAZU!!!

  • Dann schlaf doch mal ne nacht drüber, ohne entspannung geht beim programmieren halt nichts :)


    Dinge die mir auffallen:


    - du überprüfst dein String-argument `md` mit zwei separaten if-statements, statt if + else-if + else-mit-fehler
    - du solltest wirklich deine vektor zugriffe mit .at() statt [] machen (und vor allem einheitlich, nicht beides mischen!), exceptions zur programmierzeit tun nicht weh :)
    - mach deine Pixel-klasse von rgb zuweisbar (oder anderweitig kompatible, siehe erster thread) und spar dir da Zeilen


    und dann zu guter Letzt:
    was ist das erwartete verhalten für alle möglichen h/w kombinationen?
    Im Moment gibst du false nur zurück wenn das Bild exakt so groß ist wie gewünscht, ich nehme an um zu signalisieren dass das bild direkt verwendet werden kann.
    Ist aber mindestens eine der dimensionen größer als deine Zielgröße, dann wird zwar c64img nicht gefüllt, aber true zurückgegeben.
    Willst du das so? (Bitte wertungsfrei lesen, kenn ja den Rest nicht :) )


    Aaaaaber ich würde da deine ganzen ifs trotzdem ein bisschen umschachteln:
    - Abbruchkriterium nach oben ziehen, bevor du irgendwelche Variablen verwurstelst, einfach um den Code seinen Zweck besser erzählen zu lassen
    - Damit kannste deinen verarbeitungscode direkt mit deinem leftcols = x; rightcols = y;-Teil zusammenlegen
    - und daaaann nochmal überlegen was passieren soll wenn h>fullh bzw. w>fullw

  • Ich habe mal den Code visuell formatiert, weil das schlecht lesbar war und viele Smilies reinintepretiert waren.
    @Yadgar : Wenn das Dein Editor nicht selbst kann, es gibt Formatierungs-Webseiten wie https://codebeautify.org/cpp-formatter-beautifier
    Ausserdem solltest Du das Code-Highlighting verwenden, damit Smilies etc. nicht intepretiert werden und auch der Code farblich etwas besser lesbar ist.



    BTT: Wenn ich Methodenheader wie
    bool c64fill(vector < vector < pixel > > & img, vector < vector < pixel > > & c64img, string md, int fcolor) {
    lese, bin ich froh, dass ich von C++ weg bin :D


    Was ich an Deiner Stelle machen wuerde, um den Fehler einzukreisen: Brich das Ganze in kleinere Haeppchen auf und teste diese einzeln und nimm sie auch einzeln ab.
    Als erstes die Methode allein ohne funktionellen Inhalt definieren (ausser Debug-Code und Exception Handling) und einfach mal diese mit Parameter fuettern und schauen, ob die wirklich in Deinen Szenarios richtig (=wie erwartet) in die Methode reinkommen und rausgehen.
    Dann mal die Grenzfaelle reinfuettern und schauen ob das Ganze sich so verhealt wie Du denkst es sollte sich verhalten.

  • BTT: Wenn ich Methodenheader wie
    bool c64fill(vector < vector < pixel > > & img, vector < vector < pixel > > & c64img, string md, int fcolor) {
    lese, bin ich froh, dass ich von C++ weg bin

    Das ist kein C++, das ist Brainfuck. Brainfuck ist das, was Yadgar in der Signatur hat.
    Keiner (weder Anfänger noch Profis) programmieren so. Höchstens irgendwelche Cracks, die ihren Code zu verschleiern wollen.


    Wenn ich so einen Code sehe, würde ich mal nachfragen, was eigentlich abgeht. :D

  • 1.) Wie syshack schrieb: Wenn Du hier Code postet, bitte als Code einbinden (den Menüpunkt </> hierfür auswählen), damit die Formatierung erhalten bleibt und man den Quelltext besser lesen kann.
    2.) Hab Geduld! Es ist noch kein Meister vom Himmel gefallen. Zur Programmierung gehört Geduld und Ausdauer. Auf keinen Fall gleich zu Beginn die Flinte ins Korn schmeißen. Selbst erfahrene Programmierer brauchen oft mehrere Anläufe, damit ein Programm funktioniert. Bugs sind in der Entwicklung normal. Ich kenne keinen Programmierer, der in der Lage wäre, auf Anhieb umfangreiche Programme ohne jegliche Fehler zu schreiben. Gewöhn Dich einfach dran, daß Du wie jeder andere auch Fehler machst, und setz Dich selbst nicht unter Druck. Für die Programmierung braucht man einen kühlen Kopf.
    3.) Wenn es mal total nicht läuft, befolge oobdoos Rat: Mach Pause!!! Ehrlich. Es bringt nichts, auf den Bildschirm zu starren und dabei wahnsinnig zu werden. Manchmal muß man ein Problem erst sacken lassen bzw. auf Distanz dazu gehen, um eine bessere Vorgehensweise zu erkennen. Mach lieber einen Spaziergang oder fahr eine Runde mit dem Fahrrad. Damit erreichst Du mehr.
    4.) Falls Du mit dem Debugger nicht gut umgehen kannst, würde ich Dir folgende Vorgehensweise empfehlen: Schreib Dir ein paar kleine Routinen, mit deren Hilfe Du Werte und andere Angaben in eine Logdatei schreiben kannst. Füge z. B. zu Beginn einer Subroutine/Funktion/Methode eine Ausgabe in die Logdatei ein mit genauer Angabe der übergebenen Werte. Laß Dir außerdem Zwischenwerte von Berechnungen in die Textdatei ausgeben. Später kannst Du dann diese Logdatei in Ruhe durchgehen und schauen, wie sich die Werte entwickeln und ab welcher Stelle was schief gelaufen ist. Damit lassen sich Fehler recht gut einkreisen.
    5.) Verwende zu Beginn möglichst einfache Datenstrukturen. In dieser Hinsicht war Enthusis Nachfrage nicht schlecht: Warum gleich mit C++ arbeiten, wenn Du das Problem zunächst mal einfacher und übersichtlicher in C formulieren kannst? C++ ist ja ganz nett, aber man muß nicht mit Kanonen auf Spatzen schießen. Wichtig in Deinem Fall ist, daß Du den Algorithmus an sich entwickelst und zum Laufen kriegst. Die sprachliche Umsetzung ist dabei zweitrangig.
    6.) Sichere Dein Programm ab auf Fehler. Wenn Du C++ verwendest, solltest Du - wie hein09 schrieb - .at() gebrauchen an allen Stellen. So erfährst Du garantiert, wenn was bei der Indizierung schief läuft. Teste außerdem zu Beginn einer Methode, ob die Parameter korrekt sind. Wenn nicht, schreib einen Eintrag in die Logdatei und schmeiß eine Exception bzw. kehre zum Aufrufer zurück.