ALGORITHMEN TEIL XI: Genaue Planung ersetzt Zufall durch Irrtum

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • ALGORITHMEN TEIL XI: Genaue Planung ersetzt Zufall durch Irrtum

      Abt. Schon wieder!
      ============
      Ein weiteres mal herzlich Willkommen auf unserer Software-Müllkippe! Abteilung XI wird sich diesmal mit echtem "Sondermüll" befassen und dokumentieren, was alles schiefgehn kann - Die reinsten Murphy-Festspiele sozusagen! :P Hier ist das geeignete Endlager für Eure Fehlversuche, der Platz für Hundlinge die nicht wollen und Software-Kälber mit zwei bis acht Köpfen :-D . Also immer hereinspaziert und frisch ans Werk mit neuem Irrsinn!

      Gespannt, wie wir diesmal beweisen werden, daß wir alle nur Menschen sind (Errare humanum Estland),
      verbleibe ich einstweilen mit Gruss
      Euer P.Specht
      Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,xpse,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB3
    • Hier habe ich ein Programm, das leider bei einigen wenigen .jpg-Dateien aussteigt. Mit FastStone sind sie aber lesbar:


      Quellcode: Bilddialog.xprf

      1. 'Bildauswahl mit Vorschau
      2. ' Durch Anklicken der Dateinamen in der Liste werden die Bilder
      3. ' im Dialog verkleinert dargestellt. Wird mit "OK" bestätigt, kann
      4. ' der Dateiname aus der Zwischenablage gelesen werden.
      5. proc BildDialog
      6. Declare Dlg%, Liste%, Ordner%, Ok%, Abbruch%, Ordner$, Vorschau$, hVorschau%
      7. Dlg%=create("dialog",%Hwnd,"Bild-Dialog",100,100,450,278)
      8. Liste%=Create("listbox", dlg%,"",10,10,150,150)
      9. Ordner%=Create("button", dlg%,"Or&dner wählen",16,208,192,32)
      10. Ok%=Create("button", dlg%,"&OK",224,208,96,32)
      11. Abbruch%=Create("button", dlg%,"A&bbruch",336,208,96,32)
      12. Ordner$ = GetDir$("@") ' Startverzeichnis
      13. ClearList
      14. AddFiles "*.bmp"
      15. AddFiles "*.rle"
      16. AddFiles "*.dib"
      17. AddFiles "*.jpg" ' geht nicht richtig
      18. AddFiles "*.jpeg"
      19. AddFiles "*.gif"
      20. AddFiles "*.emf"
      21. AddFiles "*.wmf"
      22. AddFiles "*.ico"
      23. AddFiles "*.cur"
      24. MoveListToHandle(liste%)
      25. StartPaint dlg%
      26. MClS 260, 150, @RGB(240,240,240) 'Blank
      27. ClearClip
      28. While 1
      29. WaitInput
      30. If %Key = 2
      31. Break
      32. ElseIf GetFocus(liste%)
      33. Vorschau$ = GetString$(Liste%,GetCurSel(Liste%))
      34. hVorschau% = Create("hSizedPic", -1, Vorschau$, 260, 150, 1)
      35. MCopyBmp 0,0 - 260,150 > 170,10; 0 ' Vorschau leeren
      36. DrawPic hVorschau%, 170,10; 0
      37. elseif GetFocus(Ordner%)
      38. Ordner$ = ChooseDir$("Ordner wählen")
      39. if Ordner$ <> ""
      40. SendMessage(Liste%,$0184,0,0) 'Listbox leeren
      41. ClearList
      42. SendMessage(Liste%,$405,0,0)
      43. ChDir Ordner$
      44. AddFiles "*.bmp"
      45. AddFiles "*.rle"
      46. AddFiles "*.dib"
      47. AddFiles "*.jpg"
      48. AddFiles "*.jpeg"
      49. AddFiles "*.gif"
      50. AddFiles "*.emf"
      51. AddFiles "*.wmf"
      52. AddFiles "*.ico"
      53. AddFiles "*.cur"
      54. MoveListToHandle(liste%)
      55. SetFocus(Liste%)
      56. EndIf
      57. ElseIf GetFocus(Ok%)
      58. PutClip Vorschau$
      59. Break
      60. ElseIf GetFocus(Abbruch%)
      61. Break
      62. EndIf
      63. EndWhile
      64. EndPaint
      65. DestroyWindow(Dlg%)
      66. EndProc
      67. WindowTitle "Bild-Dialog"
      68. Cls
      69. BildDialog
      70. if GetClip$() <> ""
      71. loadbmp GetClip$(),0,0;0
      72. EndIf
      73. WaitInput
      74. End
      Alles anzeigen
      Quizfrage: Wer ist in der Lage das Programm so zu ändern, dass es mit allen Bilddateien geht?
    • Marc, wer auch immer sich mit Deiner obigen Frage beschäftigen will, wird Beispiele von funktionierenden und von nicht funktionierenden Jpg-Dateien brauchen. Kannst Du da vielleicht was bei einem Fileserver hochladen und die Addy hier posten? (Die Frage selbst kann vermutlich nur der Schöpfer von XProfan, RGH, beantworten - aber auch er benötigt wahrscheinlich solche jpg-Beispiele zur Fehlerortung...)
      Gruss
    • Nach langem Suchen habe ich auch ein paar JPGs gefunden, bei denen es nicht klappt. Ein Bild habe ich mit Irfan geöffnet und dann wieder gespeichert, dann klappt es. Im Hex-Editor zeigen sich Unterschiede im EXIF

      Quellcode

      1. FF D8 FF E1 1F 51 45 78 69 66 00 00 49 49 2A 00
      2. 08 00 00 00 11 00 00 01 03 00 01 00 00 00 C0 10
      3. 00 00 01 01 03 00 01 00 00 00 C9 09 00 00 02 01
      4. 03 00 03 00 00 00 DA 00 00 00 06 01 03 00 01 00...
      von Irfan geschrieben funktioniert

      Und das war im Original drin und crasht


      Quellcode

      1. FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2C
      2. 01 2C 00 00 FF E1 1F 51 45 78 69 66 00 00 49 49
      3. 2A 00 08 00 00 00 11 00 00 01 03 00 01 00 00 00
      4. C0 10 00 00 01 01 03 00 01 00 00 00 C9 09 00 00...
      Aber jetzt frage mich keiner, warum und wie weiter :0ahnung: Irgendwie hat die von Profan verwendete Funktion möglicherweise irgend ein Problem.



      Gruß Volkmar
    • Hätte ich gleich richtig hingesehen, wäre das möglicherweise schon ein Hinweis (Dateigröße?):

      Aber es gibt weitere Unterschiede:
      Das Original:

      File — basic information derived from the file.
      File Type JPEG
      MIME Type image/jpeg
      Exif Byte Order Little-endian (Intel, II)
      Bits Per Sample 8
      Current IPTC Digest fd7aeb398dd0933aa6d19784b986ab8f
      Encoding Process Baseline DCT, Huffman coding
      Color Components 4
      File Size 23 MB
      File Type Extension jpg
      Image Size 4,288 × 2,505

      Irfan-Kopie:
      File — basic information derived from the file.
      File Type JPEG
      File Type Extension jpg
      MIME Type image/jpeg
      Exif Byte Order Little-endian (Intel, II)
      Bits Per Sample 8
      Current IPTC Digest fd7aeb398dd0933aa
      Color Components 3
      File Size 4.5 MB
      Image Size 4,288 × 2,505

      Ansonsten ordnet Irfan die Daten gern anders an, wie man sieht. Und noch einen Unterschied:

      Das Original:
      Color Encoding:
      WARNING: Embedded color profile: “(unrecognized embedded color profile '3DAPv3_PAPERTYPE-3_280_F45.icc')”
      Some popular web browsers ignore embedded color profiles, meaning users of those browsers see the wrong colors for this image.
      Images for the web are most widely viewable when in the sRGB color space and with an embedded color profile. See my Introduction to Digital-Image Color Spaces for more information.


      Irfan-Kopie:
      Color Encoding:
      WARNING: No color-space metadata and no embedded color profile: Windows and Mac browsers and apps treat colors randomly.
      Images for the web are most widely viewable when in the sRGB color space and with an embedded color profile. See my Introduction to Digital-Image Color Spaces for more information.


      Ist jetzt die Frage, ist allein die Dateigröße das Problem oder auch die Änderungen in den Bilddaten.

      Gruß Volkmar
    • Dann hat sich das wohl erledigt. Ich wollte dir schon eine Datei per E-Mail schicken, P. Specht, wo der Effekt definitv drin ist. Ich lade nur nicht gerne Dateien öffentlich hoch von denen ich nicht weiß wer das Urheberrecht hat. Ihr müsst mir nur eine PN mit eurer E-Mail-Adresse schicken, dann bekommt ihr bei Bedarf die Datei per Anhang.
    • Hier habe ich einen hübschen kleinen Rechner:


      Quellcode: Rechner.xprf

      1. ' Rechner.xprf
      2. Proc Rechner
      3. Declare Null%, Eins%, Zwei%, Drei%, Vier%, Fuenf%, Sechs%, Sieben%, Acht%, Neun%
      4. Declare NullString$, Resultat$, Resultat%, Loeschen%, Addition%, Subtraktion%, Temp$
      5. Declare Null$, Rechner&, Multiplikation%, Division%, Anzeige$, AnzeigeString$
      6. Declare Anzeige%, Komma%, OperationsMerker$, ZahlSpeicher!
      7. Set("Decimals",2)
      8. Null$ = "a"
      9. NullString$ = "0"
      10. Anzeige$ = NullString$
      11. Proc AnzeigeSetzen
      12. Parameters Zahl$
      13. If Zahl$ = Null$
      14. Anzeige$ = NullString$
      15. ElseIf Anzeige$ = NullString$
      16. Anzeige$ = Zahl$
      17. Else
      18. Anzeige$ = Anzeige$ + Zahl$
      19. EndIf
      20. Temp$ = " " + Anzeige$
      21. AnzeigeString$ = Right$(Temp$, 28 - Len(Anzeige$))
      22. SetText Anzeige%, AnzeigeString$
      23. EndProc
      24. Rechner& = Create("Dialog",%hWnd,"Rechner",100,100,140,235)
      25. Null% = Create("Button", Rechner&, "0", 10, 130, 55, 25) '0
      26. Eins% = Create("Button", Rechner&, "1", 10, 100, 25, 25) '1
      27. Zwei% = Create("Button", Rechner&, "2", 40, 100, 25, 25) '2
      28. Drei% = Create("Button", Rechner&, "3", 70, 100, 25, 25) '3
      29. Vier% = Create("Button", Rechner&, "4", 10, 70, 25, 25) '4
      30. Fuenf% = Create("Button", Rechner&, "5", 40, 70, 25, 25) '5
      31. Sechs% = Create("Button", Rechner&, "6", 70, 70, 25, 25) '6
      32. Sieben% = Create("Button", Rechner&, "7", 10, 40, 25, 25) '7
      33. Acht% = Create("Button", Rechner&, "8", 40, 40, 25, 25) '8
      34. Neun% = Create("Button", Rechner&, "9", 70, 40, 25, 25) '9
      35. Addition% = Create("Button", Rechner&, "+", 100, 130, 25, 25) '+
      36. Subtraktion% = Create("Button", Rechner&, "-", 100, 100, 25, 25) '-
      37. Multiplikation% = Create("Button", Rechner&, "*", 100, 70, 25, 25) '*
      38. Division% = Create("Button", Rechner&, "/", 100, 40, 25, 25) '/
      39. Loeschen% = Create("Button", Rechner&, "C", 10, 160, 55, 25) 'C
      40. Resultat% = Create("Button", Rechner&, "=", 70, 160, 55, 25) '=
      41. Komma% = Create("Button", Rechner&, ",", 70, 130, 25, 25) ',
      42. Anzeige% = Create("Text", Rechner&, " " + \
      43. "0", 10, 10, 115, 24)
      44. While 1
      45. WaitInput
      46. If %Key = 2 'Alt-F4 oder Schliessen
      47. Break
      48. ElseIf Clicked(Null%) '0 Taste gedrueckt
      49. AnzeigeSetzen "0"
      50. ElseIf Clicked(Eins%) '1 Taste gedrueckt
      51. AnzeigeSetzen "1"
      52. ElseIf Clicked(Zwei%) '2 Taste gedrueckt
      53. AnzeigeSetzen "2"
      54. ElseIf Clicked(Drei%) '3 Taste gedrueckt
      55. AnzeigeSetzen "3"
      56. ElseIf Clicked(Vier%) '4 Taste gedrueckt
      57. AnzeigeSetzen "4"
      58. ElseIf Clicked(Fuenf%) '5 Taste gedrueckt
      59. AnzeigeSetzen "5"
      60. ElseIf @Clicked(Sechs%) '6 Taste gedrueckt
      61. AnzeigeSetzen "6"
      62. ElseIf Clicked(Sieben%) '7 Taste gedrueckt
      63. AnzeigeSetzen "7"
      64. ElseIf Clicked(Acht%) '8 Taste gedrueckt
      65. AnzeigeSetzen "8"
      66. ElseIf Clicked(Neun%) '9 Taste gedrueckt
      67. AnzeigeSetzen "9"
      68. ElseIf Clicked(Komma%) ', Taste gedrueckt
      69. AnzeigeSetzen "."
      70. ElseIf Clicked(Addition%) '+ Taste gedrueckt
      71. OperationsMerker$ = "+"
      72. ZahlSpeicher! = Val(Anzeige$)
      73. AnzeigeSetzen Null$
      74. ElseIf Clicked(Subtraktion%) '- Taste gedrueckt
      75. OperationsMerker$ = "-"
      76. ZahlSpeicher! = Val(Anzeige$)
      77. AnzeigeSetzen Null$
      78. ElseIf Clicked(Multiplikation%) '* Taste gedrueckt
      79. OperationsMerker$ = "*"
      80. ZahlSpeicher! = Val(Anzeige$)
      81. AnzeigeSetzen Null$
      82. ElseIf Clicked(Division%) '/ Taste gedrueckt
      83. OperationsMerker$ = "/"
      84. ZahlSpeicher! = Val(Anzeige$)
      85. AnzeigeSetzen Null$
      86. ElseIf Clicked(Resultat%) '= Taste gedrueckt
      87. If OperationsMerker$ = "+" 'Addition
      88. Resultat$ = Str$(ZahlSpeicher! + Val(Anzeige$))
      89. ElseIf OperationsMerker$ = "-" 'Subtraktion
      90. Resultat$ = Str$(ZahlSpeicher! - Val(Anzeige$))
      91. ElseIf OperationsMerker$ = "*" 'Multiplikation
      92. Resultat$ = Str$(ZahlSpeicher! * Val(Anzeige$))
      93. ElseIf OperationsMerker$ = "/" 'Division
      94. Resultat$ = Str$(ZahlSpeicher! / Val(Anzeige$))
      95. EndIf
      96. OperationsMerker$ = ""
      97. Anzeige$ = NullString$
      98. AnzeigeSetzen Resultat$
      99. ElseIf Clicked(Loeschen%) 'C Taste gedrueckt
      100. OperationsMerker$ = ""
      101. ZahlSpeicher! = 0
      102. AnzeigeSetzen Null$
      103. EndIf
      104. EndWhile
      105. EndProc
      106. Windowstyle 31
      107. Windowtitle "Rechner"
      108. Cls
      109. Rechner
      110. End
      Alles anzeigen
      Schätze, P. Specht ist exakt der Richtige dafür, daraus im Handumdrehen ein original K.u.K Offizierstaschenmesser zu machen.
    • Mich würde da noch stören, daß immer eine nutzloses leeres Fenster daneben rum liegt. Man kann alles auch auf dem Hauptfenster anlegen. Damit die Buttons wie in einem Dialog reagieren, zum Windowstyle 256 hinzufügen. Oder den Dialog ohne Hauptfenster auf %Desktop erzeugen. Dann fehlt allerdings die Möglichkeit, das Fenster zu minimieren.

      Gruß Volkmar
    • Volkmar schrieb:

      Mich würde da noch stören, daß immer eine nutzloses leeres Fenster daneben rum liegt.
      Das ist eben alles schon fertig zum Einbau in ein Hauptprogramm. Ich habe doch immer den "großen Plan" vor Augen, schon seit den Achtzigern. Meinen Truetypefont habe ich schon da angefangen. Doch bis jetzt ist es alles noch nie richtig fertig geworden...
      Bin aber inzwischen nahe dran.
    • Das finde ich so gut bei XProfan, GUI und Truetypes sind voll integriert und so leicht und einfach zu benutzen wie in keiner anderen Sprache.

      In XProfan steht dein Windowsrahmenproramm mit Menu und einigen Fenstern in weniger als einer Stunde. In der Zeit hast du in anderen Sprachen nicht mal die ersten Dateien von den 70 um ein Makefile zu erstellen...
    • Abt. Frage an Vielprogrammierer
      ====================
      Mit der Zeit bekommt man einige Routine und schreibt Anfangszeilen, die oft gleich sind. Es böte sich daher an, sich eine Profan-Headerdatei (Vorschlag: Abbrev.ph) zu schreiben, die die gängisten Startbefehle als Abkürzungen enthält, z.B. (wäre alles zu diskutieren):

      Quellcode

      1. ' abbrev.ph:
      2. T =WindowTitle;
      3. S =WindowStyle;
      4. WMAX =Window 0,0-%maxx,%maxy:showmax:cls ;"
      5. WT =WaitInput;
      6. CM =showmax:cls;
      7. P =Print;
      8. F(=format$("%g",;
      Ein Programm, daß diese Kürzel nutzt, sähe dann z.B. so aus (Bitte Include-Pfad anpassen!):

      Quellcode

      1. $H C:\Program Files (x86)\XProfan11\INCLUDE\abbrev.ph
      2. ~S 24:~T "Window1":~Wmax 0:~CM 255:~P ~F(pi()):~p "Test":~wt

      Nurmalsofrag...
      Gruss