You are not logged in.

OlimilO

Unregistered

1

Sunday, January 18th 2009, 12:46pm

Dim A: A = Array("first", "second", "third")

Hallo,

Also erstmal möchte ich meinen Respekt vor JaBaCo zöllen.

es fühlt sich an wie VB

als VB6-Programmierer fühlt man sich wirklcih schnell wie zuhause

hab auch soeben mein ersten Hello-World-Programm auf Anhieb erfolgreich

gestartet

jetzt meine erste Frage:

auf welche Weise kann man ein Array füllen?

muß man es so machen?:

Source code

1
2
3
4
5
6
7
Dim n As Integer: n = 20
Dim A(n) As String
Dim i As Integer: i = 1
A(i) = "first": i = i +1
A(i) = "second": i = i +1
A(i) = "third": i = i + 1
'...


das hat folgende Syntaktische Nachteile:

* man muß die Indexvariable (hier: i) jedesmal mit angeben und auch selbst hochzählen

* man muß den Namen des Arrays jedesmal mit hinschrieben

oder gibt es auch eine schnellere Möglichekeit ?

unter VB6 gibt es ja die Array-Funktion

soll man sich eine Array-Funktion selber schreiben?

unter VB.NET hat man folgende Möglichkeit:

Source code

1
2
Dim A As String() = {"first", "second", "third"} 
MsgBox(A(0))


Grüße,

+Oliver

A1880

Intermediate

  • "A1880" is male

Posts: 500

Date of registration: Jan 1st 2009

Location: Hanover, Germany

Occupation: Software Engineer

Hobbies: Hilbert Curves

  • Send private message

2

Sunday, January 18th 2009, 4:33pm

Array initialisieren mit Split()

Hallo Oliver,
in Deinem Beispiel kann man sich behelfen:

Source code

1
Dim a() As String : a = Split("Ene,Mene,Muh", ",")


Für den allgemeinen Fall wäre eine Syntax nett, mit der man Type- und Array-Variablen initialisieren kann.
Da habe ich aber auch nichts in Jabaco gefunden.

Gruß!

A1880

Manuel

Administrator

  • "Manuel" is male

Posts: 256

Date of registration: Jul 16th 2008

Location: Erlangen, Germany

Occupation: Software Developer

Hobbies: Jabaco, game theory, text-mining

  • Send private message

3

Sunday, January 18th 2009, 4:47pm

Quoted

vom OlimilO:
Dim A As String() = {"first", "second", "third"}
guter vorschlag. wird implementiert.

Quoted

von A1880:
Für den allgemeinen Fall wäre eine Syntax nett, mit der man Type- und Array-Variablen initialisieren kann. Da habe ich aber auch nichts in Jabaco gefunden.
jabaco ist flexibel und gute ideen werden auf jeden fall implementiert. wie stellst du dir die initialisierung einer udt-variable vor?

btw. ich suche momentan nach einer guten roadmap / issue-tracking-software. bis jetzt hat mich leider noch garnichts überzeugt. auch nicht die marktführer trac / bugzilla. ideen sind willkommen :)

OlimilO

Intermediate

  • "OlimilO" is male

Posts: 277

Date of registration: Jan 18th 2009

Location: Germany

Occupation: software engineer

  • Send private message

4

Sunday, January 18th 2009, 5:02pm

thanks

Hi A1880,

vielen Dank für den Tipp klingt natürlich nicht schlecht

obwohl in Java kann man schreiben:

Source code

1
 int iarr[] = {1, 2, 3};


VB6 macht mit der Array-Funktion immer nur Variant Arrays.

Naja meistens braucht man es nur für kleine Arrays mit unter 100 Elementen, bspw um mal schnell was zu testen.

A1180:

"Für den allgemeinen Fall wäre eine Syntax nett, mit der man Type- und Array-Variablen initialisieren kann"

mit Type meinst du benutzerdefinierte Typen also ein array of structure?

hmm, in VB gibt es die Möglichkeit über einen paramarray-Parameter

aber der ist auch nicht implementiert

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 Option Explicit
Private Type MyType
    IntVal1 As Integer
    intVal2 As Integer
    StrVal  As String
End Type
Private Type ArrayOfMyType
    Arr() As MyType
End Type
Private Function New_ArrayOfMyType(ParamArray params()) As ArrayOfMyType
    Dim i As Integer, j As Integer
    Dim u As Integer: u = (UBound(params) + 1) / 3 - 1
    With New_ArrayOfMyType
        ReDim .Arr(0 To u)
        For i = 0 To u
            .Arr(i).IntVal1 = CInt(params(j)): j = j + 1
            .Arr(i).intVal2 = CInt(params(j)): j = j + 1
            .Arr(i).StrVal = CStr(params(j)): j = j + 1
        Next
    End With
End Function
Private Function MyTypeToString(this As MyType) As String
    With this
        MyTypeToString = CStr(.IntVal1) & " " & _
                         CStr(.intVal2) & " " & _
                         .StrVal
    End With
End Function
Private Sub Command1_Click()
    Dim a As ArrayOfMyType
    a = New_ArrayOfMyType(1, 2, "first", 3, 4, "second", 5, 6, "third")
    MsgBox MyTypeToString(a.Arr(0))
End Sub


hast du so gemeint?

wie kann man Manuel beim programmieren helfen? ^^

Grüße

+Oliver

OlimilO

Intermediate

  • "OlimilO" is male

Posts: 277

Date of registration: Jan 18th 2009

Location: Germany

Occupation: software engineer

  • Send private message

5

Sunday, January 18th 2009, 5:22pm

Hi Manuel

Quoted


von Manuel:

guter vorschlag. wird implementiert

Danke!

Tipp an Manuel

ich würde nicht zuviel Energie mit Handbuch schreiben aufwenden ;)

1. gibt es zu VB schon genug

2. wegen 1. wenn dann nur die Unterschiede VB <-> JaBaCo herausstellen und da sich eh noch das eine oder andere ändern kann dann nur das herausstellen was JaBaCo besser kann,

3. lieber das Forum gut bedienen, dann wird automatisch jede Frage beantwortet, und die Forumsteilnehmer lernen mit und können nebenbei irgendwann selbst den Support von JaBaCo übernehmen.

hab auf AVB die Erfahrung gemacht, daß von den Anfängerfragen fast niemand jemals ein VB-Handbuch gelesen hat *g* die meisten machen rumprobieren per "try 'n error"

ansonsten muß ich Dir nochmal sagen daß ich JaBaCo echt genial finde.

kann man beim Programmieren irgendwie behilflich sein?

wieviele programmierer seid ihr, oder hast du etwa bisher alles alleine programmiert.

Grüße

+Oliver

A1880

Intermediate

  • "A1880" is male

Posts: 500

Date of registration: Jan 1st 2009

Location: Hanover, Germany

Occupation: Software Engineer

Hobbies: Hilbert Curves

  • Send private message

6

Sunday, January 18th 2009, 7:05pm

Jabaco einfach halten!

Hallo,
in meinen Augen ist Jabaco nur und gerade deswegen attraktiv, weil es nach außen relativ einfach ist. Mit VisualStudio oder Eclipse kann man avanciertere Dinge anstellen, aber ich habe noch keine Umgebung gesehen, mit der man derart schnell eine Oberfläche zaubern kann, die sowohl als Windows-Executable als auch als Java Applet einsetzbar ist.
Wenn ich typsicher programmieren, komplexe Algorithmen mit verschachtelten Datenstrukturen in professioneller Qualität hervorbringen und pflegen will, sollte ich wohl doch eher Java, C++ oder C# nutzen. Ich sehe Jabaco als ein schnelles Tool, mit dem man "eben mal so" kleinere Tools und Anwendungen hinzaubern kann. Es ist nicht die Plattform für Hersteller von Standardsoftware.

Mein Fazit:
Bei Erweiterungen von Jabaco wäre ich eher zurückhaltend und würde Vorschläge jeweils danach beurteilen, ob der Zuwachs an Komplexität sich wirklich lohnt. Die Initialisierer-Syntax ist so ein Fall. Nett, wenn sie da ist. Man kommt aber auch gut ohne aus.

Mir haben bei meinen bisherigen Gehversuchen mit Jabaco folgende Punkte gefehlt:
- Dokumentation (muss kein Hochglanz sein, ganz ohne ist aber wirklich kein Dauerzustand)
- Debugger ist sehr eingeschränkt (z.B. keine Anzeige des Call Stacks, keine Überwachungsausdrücke)
- Erweiterte Fehlerbehandlung (entweder mit try/catch oder mit verbessertem ON ERROR)
- Object Explorer fehlt
- Ich würde gerne ActiveX Controls einbinden können
- Einstellmöglichkeiten für Stack- und Heap-Größe
- In der Klasse "Form" fehlt mir die Collection "Controls"

Kosmetische Dinge:
- "Endif" sollte automatisch zu "End if" werden
- Generell sollten eingegebene Identifier automatisch die Groß-/Kleinschreibung gemäß erstmaliger Definition annehmen
- Ich würde gerne per Kontext-Menü schnell von einem Identifier zu seiner Definition springen können
- Jabaco sollte Projektdaten und temporär übersetzte Klassen nicht im Programm- sondern im jeweiligen Projekt-Verzeichnis ablegen
(ich möchte nicht, dass jemand in meinem Programmverzeichnis "herumschreibt")
- Debug.Assert muss man bei Bedarf selber bauen
- Die Syntax Cast() finde ich unpraktisch im Vergleich zu den Casts bei Java und C++
- Die WINAPI-Syntax is OK. Besser fände ich die alte API-Syntax von VB6 (nicht zu reden vom VB6 API Assistenten)

Gruß!

A1880

Manuel

Administrator

  • "Manuel" is male

Posts: 256

Date of registration: Jul 16th 2008

Location: Erlangen, Germany

Occupation: Software Developer

Hobbies: Jabaco, game theory, text-mining

  • Send private message

7

Sunday, January 18th 2009, 7:52pm

Quoted

Wenn ich typsicher programmieren, komplexe Algorithmen mit verschachtelten Datenstrukturen in professioneller Qualität hervorbringen und pflegen will, sollte ich wohl doch eher Java, C++ oder C# nutzen.
Ich habe bereits "Option Strict" für die nächste Version implementiert. In Zukunft ist das also kein Problem. Es ist bereits jetzt möglich komplexe Aufgaben zu lösen und in Zukunft wird das alles noch einfacher werden.

Quoted

Bei Erweiterungen von Jabaco wäre ich eher zurückhaltend und würde Vorschläge jeweils danach beurteilen, ob der Zuwachs an Komplexität sich wirklich lohnt. Die Initialisierer-Syntax ist so ein Fall. Nett, wenn sie da ist. Man kommt aber auch gut ohne aus.
Solche Erweiterungen sind problemlos möglich. Es ist kaum Aufwand für mich.

Quoted

- Dokumentation (muss kein Hochglanz sein, ganz ohne ist aber wirklich kein Dauerzustand)
Wird es geben.

Quoted

Debugger ist sehr eingeschränkt (z.B. keine Anzeige des Call Stacks, keine Überwachungsausdrücke)
Den Call Stack kann ich dir problemlos anzeigen. Wann und wo würdest du den gerne sehen? Für mich war das eine unnötige Information. Überwachungsausdrücke sind auch möglich, aber sind die wirklich nötig?

Quoted

Erweiterte Fehlerbehandlung (entweder mit try/catch oder mit verbessertem ON ERROR)
Das Errorhandling ist relativ kompliziert. Was fehlt dir da genau?

Quoted

Object Explorer fehlt
Der ist bereits rudimentär implementiert (Project => References). Was fehlt dir genau? Wie würdest du den gerne verwenden?

Quoted

Ich würde gerne ActiveX Controls einbinden können
Ich auch. Das Framework ist OpenSource. Vielleicht sollten wir mal ein Preisgeld für sowas ausschreiben :)

Quoted

Einstellmöglichkeiten für Stack- und Heap-Größe
Eigentlich kein Problem, aber ist das wirklich nötig? Hast du ein Beispiel?

Quoted

In der Klasse "Form" fehlt mir die Collection "Controls"
Das Framework ist OpenSource. Du könntest es einfach implementieren. Bsp:

Jabaco Source

1
MsgBox Me.ContentFrame.Parent.getComponentCount()

Quoted

"Endif" sollte automatisch zu "End if" werden
Wie oft passiert dir das? ;)

Quoted

Generell sollten eingegebene Identifier automatisch die Groß-/Kleinschreibung gemäß erstmaliger Definition annehmen
Steht bereits auf meiner Todo-Liste.

Quoted

Ich würde gerne per Kontext-Menü schnell von einem Identifier zu seiner Definition springen können
Diese Funktion werde ich noch implementieren.

Quoted

Jabaco sollte Projektdaten und temporär übersetzte Klassen nicht im Programm- sondern im jeweiligen Projekt-Verzeichnis ablegen. (ich möchte nicht, dass jemand in meinem Programmverzeichnis "herumschreibt")
Ok - die nächste Version wird diese Dateien in "%temp%/%guid%/..." schreiben.

Quoted

Die WINAPI-Syntax is OK. Besser fände ich die alte API-Syntax von VB6 (nicht zu reden vom VB6 API Assistenten)
Das "Declare" war mir zu allgemein. Mit Jabaco kannst du platformunabhängige Software erzeugen und deshalb habe ich "Declare" durch "WinApi" ersetzt.

A1880

Intermediate

  • "A1880" is male

Posts: 500

Date of registration: Jan 1st 2009

Location: Hanover, Germany

Occupation: Software Engineer

Hobbies: Hilbert Curves

  • Send private message

8

Wednesday, January 21st 2009, 5:08pm

Wow!

Hallo Manuel,
prima! Da bin ich gespannt auf die nächste Version.

Zu Deinen Rückfragen:

Quoted

Den Call Stack kann ich dir problemlos anzeigen. Wann und wo würdest du den gerne sehen? Für mich war das eine unnötige Information. Überwachungsausdrücke sind auch möglich, aber sind die wirklich nötig?

Bei der Fehlersuche im Debugger hilft es mir, wenn ich sehe, was im Call Stack steht. Da finde ich VB6 vorbildlich. Auch die Überachungsausdrücke nutze ich oft, um beim Durchsteppen auf einen Blick diverse Variable und Ausdrücke verfolgen zu können.

Quoted

Das Errorhandling ist relativ kompliziert. Was fehlt dir da genau?

Ideal wäre es, wenn ich in einer Routine einen Fehlerausgang definieren könnte, der alle Fehler fängt, die in der aktuellen Routine und den von ihr aufgerufenen Routinen verursacht werden. Momentan erlaubt Jabaco, wenn ich das richtig sehe, nur das Fangen lokaler Fehler.
In der VB6-Dokumentation gibt es eine Liste der "trappable errors". Kannst Du sagen, welche Fehler in Jabaco "trappable" sind?

Quoted

(Object Explorer) Der ist bereits rudimentär implementiert (Project => References). Was fehlt dir genau? Wie würdest du den gerne verwenden?

Ich verwende den Object Explorer bei Microsoft als Dokumentation und sehe mir dort an, was mit einer Objekt-Klasse "geht", welche Enum-Parameter erlaubt sind, welche Methoden und Properties definiert sind.

Quoted

(Stack-/Heap-Größe einstellbar) Eigentlich kein Problem, aber ist das wirklich nötig? Hast du ein Beispiel?

Ich habe mit der Ackermannfunktion experimentiert, um die Gesamtperformance von Jabaco zu testen. Das sprengt schon bei kleineren Beispielen den Stack. Die Heap-Größe hatte ja schon ein anderer Kollege geposted.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Option Explicit

'  cf. http://de.wikipedia.org/wiki/Ackermannfunktion

Public Function Ackermann(m As Long, n As Long) As Long
   If m = 0 Then
      Ackermann = n + 1
   Else 
      If n = 0 Then
         Ackermann = Ackermann(m - 1, 1)
      Else
         Ackermann = Ackermann(m - 1, Ackermann(m, n - 1))
      End If
   End If
End Function

Public Function AckermannIterative(m As Long, n As Long) As Long
     Do While m <> 0
         If n = 0 Then
             n = 1
         Else
             n = AckermannIterative(m, n - 1)
         End If
         m = m - 1
     Loop
     
     AckermannIterative = n + 1
End Function


Quoted

"Endif" sollte automatisch zu "End if" werden . Wie oft passiert dir das?

Als altem C-Programmierer passiert mir das ständig. VB6 macht automatisch "end if" aus "endif".

Neuer Punkt:
Beim Ausführen eines Jabaco-Exe-Binaries wird im Verzeichnis %TEMP% ein "executable jar" erzeugt und mit java ausgeführt. Ich fände es praktisch, wenn ich Jabaco-Projekte in ein (dann kleineres) Jar-Archiv kompilieren und dann selber mit Jabaco.jar im classpath per Skript oder "zu Fuß" ausführen könnte.

Gruß und frohes Schaffen!

A1880

Manuel

Administrator

  • "Manuel" is male

Posts: 256

Date of registration: Jul 16th 2008

Location: Erlangen, Germany

Occupation: Software Developer

Hobbies: Jabaco, game theory, text-mining

  • Send private message

9

Wednesday, January 21st 2009, 8:31pm

Quoted

Bei der Fehlersuche im Debugger hilft es mir, wenn ich sehe, was im Call Stack steht. Da finde ich VB6 vorbildlich. Auch die Überachungsausdrücke nutze ich oft, um beim Durchsteppen auf einen Blick diverse Variable und Ausdrücke verfolgen zu könne
Sollst du kriegen. Vermutlich aber noch nicht in der nächsten Version.

Quoted

In der VB6-Dokumentation gibt es eine Liste der "trappable errors". Kannst Du sagen, welche Fehler in Jabaco "trappable" sind?
Alle Exceptions: http://java.sun.com/j2se/1.5.0/docs/api/…/Exception.html

Quoted

Ich verwende den Object Explorer bei Microsoft als Dokumentation und sehe mir dort an, was mit einer Objekt-Klasse "geht", welche Enum-Parameter erlaubt sind, welche Methoden und Properties definiert sind.
Ok. So ähnlich stelle ich mir das auch vor und ich habe auch schon überlegt wie wir das realisieren können. Mehr dazu werde ich demnächst posten.

Quoted

Ich habe mit der Ackermannfunktion experimentiert, um die Gesamtperformance von Jabaco zu testen. Das sprengt schon bei kleineren Beispielen den Stack. Die Heap-Größe hatte ja schon ein anderer Kollege geposted
Das selbe Problem hast du aber auch mit VB6 und Java ;) Die JavaVM reagiert nicht auf Änderungen der Stack-Größe. Ich muss noch mal schauen wie das genau geplant ist.

Quoted

Beim Ausführen eines Jabaco-Exe-Binaries wird im Verzeichnis %TEMP% ein "executable jar" erzeugt und mit java ausgeführt. Ich fände es praktisch, wenn ich Jabaco-Projekte in ein (dann kleineres) Jar-Archiv kompilieren und dann selber mit Jabaco.jar im classpath per Skript oder "zu Fuß" ausführen könnte.
Das kannst du beim Kompilieren doch per Dateityp angeben, oder verstehe ich dich falsch? Wenn du kein embedded Framework willst, dann solltest du "Project" auswählen und dort in Properties => Package die Einstellung auf "Nothing" ändern.

A1880

Intermediate

  • "A1880" is male

Posts: 500

Date of registration: Jan 1st 2009

Location: Hanover, Germany

Occupation: Software Engineer

Hobbies: Hilbert Curves

  • Send private message

10

Wednesday, January 21st 2009, 10:58pm

Ackermannfunktion

Hallo Manuel,
der Java-Schalter "-Xss" wirkt bei der Windows-SUN-JVM offenbar nicht auf den Standardstack sondern auf die Stackgröße für Threads.

Ich habe das Jabaco-Compilat der Ackermannfunktion rückübersetzt und in Java ausprobiert:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
public class jAckermann 
{ 
    public static long nesting; 
    public static long nestingMax; 

    // start with 
    // 
    // java -Xss4M -Xms32M -Xmx128M jAckermann 
    
    public static void main(String args[]) 
    { 
        Exception Err = null; 
        Exception h3 = null; 
        MyThread t; 

        t = new MyThread(); 

        t.start(); 
     } 

public static void runTest() 
    { 
        long res; 

        nesting = 0; 
        System.out.println("Ackermann test started ..."); 
        try { 
                res = AckermannIterative(4, 1); 
                // res = Ackermann(4, 0); 
                System.out.println("OK! res = " + res + " max. nesting = " + nestingMax); 
        } 
        catch (StackOverflowError e) { 
                System.out.println("Stack overflow! nesting = " + nesting); 
        } 
    }   

//                                 nesting 
// A(3, 6) = 509                 508 
// A(3, 7) = 1021         1021 - 1023 
// A(4, 0) = 13                 12 - 16 
// A(4, 1) = 65533            65532 

public static long Ackermann(long m, long n) throws StackOverflowError 
    { 
        long Ackermann = 0L; 
        Exception Err = null; 
        Exception h8 = null; 

        nesting++; 

        if (nesting > nestingMax) { 
                nestingMax = nesting; 
        } 
        
        if(m == (long)0) 
        { 
                Ackermann = n + (long)1; 
        } else 
        { 
                if(n == (long)0) 
                { 
                        Ackermann = Ackermann(m - (long)1, 1); 
                } else 
                { 
                        Ackermann = Ackermann(m - (long)1, Ackermann(m, n - (long)1)); 
                } 
        } 

        nesting--; 

        return Ackermann; 
    }  

public static long AckermannIterative(long m, long n) throws StackOverflowError 
    { 
        long AckermannIterative = 0L; 
        Exception Err = null; 
        Exception h8 = null; 

        nesting++; 

        if (nesting > nestingMax) { 
                nestingMax = nesting; 
        } 

        do 
        { 
                if(m != (long)0) 
                { 
                        if(n == (long)0) 
                        { 
                                n = 1; 
                        } else 
                        { 
                                n = AckermannIterative(m, n - (long)1); 
                        } 
                        m -= 1; 
                } else 
                { 
                        AckermannIterative = n + (long)1; 

                        nesting--; 

                        return AckermannIterative; 
                } 
        } while(true); 
    } 

} 

class MyThread extends Thread 
{ 
    public void run() 
    { 
        jAckermann.runTest(); 
    } 
}


Mit folgendem Java-Aufruf habe ich die Ackermannfunktion A(4,1) berechnen können:

Source code

1
java -Xss4M -Xms32M -Xmx128M jAckermann


Auf Jabaco übertragen kann man also einen großen Stack nutzen, wenn man die kritischen Funktionen in Threads aufruft und die JVM mit dem Schalter "-Xss" aufruft.

Gruß!

A1880

Rate this thread
WoltLab Burning Board