Ralf Hüsing

April 25, 2008

Hexadezimal in Dezimal

Abgelegt unter: Programmierung — ralf @ 10:32 am

Folgendes Perl-Script konvertiert alle Hexadezimalen Zahlen (0x…) der Standardeingabe (stdin) in Dezimale Zahlen und gibt es auf der Standardausgabe (stdout) aus:

#!/usr/bin/perl -lw

use strict;

while (<>) {
        chomp;
        s/0[xX]([a-fA-F0-9]+)/sprintf('%d', hex('0x'.$1))/eg;
        print $_;
}

Benutzung in etwa wie folgt:

perl hex_2_dec.pl < hex.txt > dec.txt

“hex.txt” enthält beispielsweise folgende Zeile:

#define CSIDL_DESKTOP                   0x0000        // 

“dec.txt” enthält folgende Zeile:

#define CSIDL_DESKTOP                   0        // 

Visual Basic 6 Fehlerbehandlung

Abgelegt unter: Programmierung — ralf @ 6:54 am

Um in einer VB6-Routine (Function, Sub oder Property) mehrere Fehler ordentlich abzufangen muss eine etwas merkwürdige Kombination von “on local error” und “resume” verwendet werden.

Diese Beispiel-Sub geht von einem simplen “Form1″-Formular sowie einem “Command1″-Button aus.

Das Beispiel versucht mehrere Eigenschaften des aktuellen Objektes (”Form1″) abzufragen wobei die Sub verlassen werden soll wenn kein Fehler auftrat.
Die Eigenschaften sind “Error1″ gefolgt von “Error2″ und letztlich “Caption” was die Titel Zeile des Formulars ist.

Geht man diese Sub im Debug Modus Schritt für Schritt durch (F8 drücken) sieht man sehr schön wie “wild” hin und hergesprungen wird. Das ganze ist nicht ganz fein, funktioniert aber.

Private Sub Command1_Click()
  Debug.Assert ("F8 drücken um die Aufrufe einzeln durchzugehen" = "")

  On Local Error GoTo try_2

  Debug.Print CallByName(Me, "Error1", VbGet)
  Exit Sub

try_2_real:
  On Local Error GoTo try_3
  Debug.Print CallByName(Me, "Error2", VbGet)
  Exit Sub

try_3_real:
  On Local Error GoTo real_error
  Debug.Print CallByName(Me, "Caption", VbGet)
  Exit Sub

try_2:
  Debug.Print "try_1: " & Err.Number & " " & Err.Description
  Resume try_2_real

try_3:
  Debug.Print "try_2: " & Err.Number & " " & Err.Description
  Resume try_3_real

real_error:
  Debug.Print "real_error: " & Err.Number & " " & Err.Description
  Exit Sub
End Sub

Zum Vergleich mal ein nicht funktionierendes Beispiel:

Private Sub Command2_Click()
  Debug.Assert ("F8 drücken um die Aufrufe einzeln durchzugehen" = "")

  On Local Error GoTo try_2
  Debug.Print CallByName(Me, "Error1", VbGet)
  Exit Sub

try_2:
  On Local Error GoTo 0
  On Local Error Resume Next
  On Local Error GoTo try_3
  Debug.Print CallByName(Me, "Error2", VbGet)
  Exit Sub

try_3:
  On Local Error GoTo real_error
  Debug.Print CallByName(Me, "Caption", VbGet)
  Exit Sub

real_error:
  Debug.Print "real_error: " & Err.Number & " " & Err.Description
  Exit Sub
End Sub

Warum das zweite Beispiel nicht funktioniert bzw. nur das Erste liegt vermutlich daran das man während einer “Fehlerbehandlung” keine andere Fehlerbehandlung aktivieren oder die aktuelle deaktivieren kann. Aufgrund des “Resume try_2_real” im ersten Beispiel wird die Fehlerbehandlung zurück gesetzt um umgehend wieder gesetzt zu werden. Ein Vorteil könnte sein das man gezielt auf Spezielle Fehler reagieren kann.

Powered by WordPress ( WordPress Deutschland )