 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 00:52 Titel: Array in einem Sub als Parameter |
|
|
Öhm, hallo erstmal! \o/
Ich wollte mal fragen, ob das geht. Genauer gesagt das hier:
Code: |
Sub add_source (N As Integer, x As Single, s As Single, dt As Single)
size=(N+2)*(N+2)
For i = 0 to size-1
x(i)+=dt*s(i)
Next
End Sub
|
Es kommt dann die Fehlermeldung x(i) Array not Dimensioned.
Tja, ich hab keine Ahnung, wie ich das machen muss, weil ich mich sowieso nicht mit Subs etc. auskenne. Kam vorher auch ohne klar! xD |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.06.2008, 01:00 Titel: |
|
|
Code: | Sub bla(parameter() As Integer)
Print parameter(1)
End Sub
Dim arr(1 To 10) As Integer
bla arr() |
 _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 27.06.2008, 07:56 Titel: |
|
|
An dieser Stelle ebenfalls wichtig: LBOUND() und UBOUND(), womit irgendwelche size-Parameter in vielen Fällen entfallen.
Sonst grundsätzlich ist
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html
auch für FreeBasic gültig, ausser dass FreeBasic inzwischen etliche der "Möglichkeitsgrenzen im Unterprogrammkonzept von QuickBASIC"-Sprachkonstrukte besitzt, welche es in QB noch nicht gibt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 12:17 Titel: |
|
|
Merkwürdig.
Code: | Declare Sub add_source(ByRef N As Integer,ByRef x() As Single,ByRef s() As Single,ByRef dt As Single) |
Da kommt nun folgende Fehlermeldug:
Code: | Pfad/FBIDETEMP.bas(8) error 56: Illegal specification, at parameter 2 (x) of add_source()
Declare Sub add_source(ByRef N As Integer,ByRef x() As Single,ByRef s() As Single,ByRef dt As Single) |
Der Pfeil zeigt auf das "As" nach x().
Das selbe nochmal mit s().
Jetzt bin ich verwirrt! =/ |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.06.2008, 12:32 Titel: |
|
|
wenn man BYREF entfernt, geht's... frag mich aber nicht warum, ich bin grad zu faul zum denken xD _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 14:10 Titel: |
|
|
Wieder ein Problem!
Code: |
Declare Sub dens_step ( N As Integer, x() As Single, x0() As Single,_
u() As Single, v() As Single, diff As Single,_
dt As Single )
Sub dens_step ( N As Integer, x() As Single, x0() As Single,_
u() As Single, v() As Single, diff As Single,_
dt As Single )
add_source ( N, x(), x0(), dt )
SWAP ( x0(), x() )
diffuse ( N, 0, x(), x0(), diff, dt )
Swap ( x0(), x() )
advect ( N, 0, x(), x0(), u(), v(), dt )
End Sub
|
Das Problem ist, dass x0() bei SWAP einen Wert in der Klammer braucht, ich aber keinen hab
Ich denke, dass man das mit einem Pointer lösen könnte, nur wie weiß ich nicht...
Danke für die Geduldigen, die meinen Fragen antworten!  |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 14:48 Titel: |
|
|
Wie denn das? Du willst zwei Werte tauschen, hast aber nur einen? Warum willst Du dann überhaupt tauschen?
Oder ist das ein leerer Wert? Du kannst ihn doch mit 0 initialisieren. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 14:55 Titel: |
|
|
Nein, ich meinte natürlich x0() und x().
Schau, wenn ich die Sub add_source aufrufen würde, brauch ich in den Klammern keinen Wer angeben. Da SWAP aber keine Sub ist, und ich auch keinen Wert für die Klammern hab, kommt ein Fehler.
Btw, warum ich das überhaupt mache, obwohl ich keine Ahnung davon hab: Ich versuche einen (recht einfachen) Code von C++ in FB umzuwandeln...
Bzw. ich hab den Code auch nochmal in PB, aber davon versteh ich genaso wenig =/ |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 15:00 Titel: |
|
|
Wenn ich es richtig verstehe, sind x0() und x() Arrays.
Du übergibst also an Swap zwei Arrays, nicht Werte. Soweit ich weiß, ist das gar nicht zulässig. Wenn Du Werte aus den Arrays übergeben willst, mußt Du die Indizes innerhalb des jeweiligen Arrays angeben, also z. B.
An die Sub add_Source kannst Du die Arrays als solche übergeben, weil sie im Funktionsheader als Arrays eingetragen sind.
Übrigens werden Arrays in FB immer ByRef übergeben. Wenn Du dann ByRef im Funktionskopf noch davor schreibst, ist das doppelt gemoppelt. Das mag FreeBasic nicht. Daher kam der Fehler, den Jojo Dir nicht verraten wollte.  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 15:39 Titel: |
|
|
Da steht ja auch des Rätsels Lösung:
Zitat: | where SWAP is a macro that swaps the two array pointers:
#define SWAP(x0,x) {float *tmp=x0;x0=x;x=tmp;}
|
Swap ist eine selbstdefinierte Funktion, die bei Übergabe der Arrays die entsprechenden Pointer vertauscht (wenn ich das richtig verstanden habe, mein C++ ist schon etwas älter ) _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 15:45 Titel: |
|
|
Ja, nur da hab ich das gleiche Problem. x0 und x sollen Arrays sein, bzw. kommt die Fehlermeldung sie seien nicht dimensioniert. Ich weiß leider auch nicht, wie das mit den Pointern so funktioniert, dachte, das ginge auch so...
Könntest du mir die Pointer etwas erklären, bzw. was ich ändern muss, damit das geht? :A |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 15:53 Titel: |
|
|
Dazu gibt es gute Artikel in der Befehlsreferenz. Nur kurz soviel:
Pointer sind eigentlich Integer-Variablen, die die Adresse einer beliebigen Variablen auf nehmen. Bei Arrays oder UDTs sind es jeweils die Anfangs-Adressen. Über den Pointer kannst Du also direkt auf die Variablen zugreifen.
Diesen Link bitte gründlich druchlesen:
http://www.freebasic-portal.de/index.php?s=reftopic&id=386 _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 16:04 Titel: |
|
|
Mhm. Muss ich dann die Pointer immer erst deklarieren, oder geht das auch wie in der PDF beim deklarieren der SUB?
Also ginge es so:
Code: |
Declare Sub dens_step ( N As Integer, x As Byte PTR, x0 As Byte Ptr,_
u As Byte Ptr, v() As Byte Ptr, diff As Single,_
dt As Single )
Sub dens_step ( N As Integer, x As Byte Ptr, x0 As Byte Ptr,_
u As Byte Ptr, v As Byte Ptr, diff As Single,_
dt As Single )
add_source ( N, x, x0, dt )
SWAP ( x0, x )
diffuse ( N, 0, x, x0, diff, dt )
Swap ( x0, x )
advect ( N, 0, x, x0, u, v, dt )
End Sub |
Wollt erst fragen, weil ich recht viel umändern müsste, und wenn es dann falsch ist, wäre das sehr blöd... |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 16:15 Titel: |
|
|
Prinzipiell kannst Du die Pointer direkt an die Sub übergeben, ohne vorher Pointer zu deklarieren. Das sieht dann so aus:
Code: |
add_source(a, @x0(), @x(), b) 'Durch die Voranstellung des @ werden für x0 und x die Startadressen extrahiert.
|
Ich weiß aber nicht, ob FreeBasic das Vertauschen von Pointern auf Arrays unterschiedlicher Größe zuläßt. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 16:43 Titel: |
|
|
Hm, da kommen ständig nur Fehlermeldungen bezogen auf das "@". Ich denke auch, ich muss das beim Deklarieren der Sub und auch beim aufrufen dieser machen, oder? Is mir nicht 100%ig klar @_@ |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 16:46 Titel: |
|
|
Naja, Du mußt im Funktionskopf natürlich die Parameter auch als Pointer deklarieren!  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 16:52 Titel: |
|
|
Meh, sorry, dass ich nerve!
Aber ich kriegs nich hin oO
Code: | Declare Sub add_source([...], @x() As Byte Ptr, [...] ) |
Hab's jetzt so stehen. Alle möglichen Variationen funktionieren auch nicht. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.06.2008, 16:53 Titel: |
|
|
Welche Fehlermeldungen?
Um die Übergabekonventionen herauszufinden, schreib doch mal eine einfache Funktion, der Du nur einen Array-Pointer übergibst. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 27.06.2008, 17:01 Titel: |
|
|
Code: | error 56: Illegal specification, at parameter 2 (@) |
=/ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|