Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Array in einem Sub als Parameter
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 00:52    Titel: Array in einem Sub als Parameter Antworten mit Zitat

Ö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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.06.2008, 01:00    Titel: Antworten mit Zitat

Code:
Sub bla(parameter() As Integer)
   Print parameter(1)
End Sub

Dim arr(1 To 10) As Integer

bla arr()

zwinkern
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 27.06.2008, 07:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 12:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.06.2008, 12:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 14:10    Titel: Antworten mit Zitat

Wieder ein Problem! mit den Augen rollen
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 Zunge rausstrecken
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! happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 14:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 14:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 15:00    Titel: Antworten mit Zitat

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.

Code:
Swap (X0(1), X(2)


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. happy
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 15:27    Titel: Antworten mit Zitat

Mhm!
Hm... ich zeig euch am besten mal den Originalcode.

http://www.dgp.toronto.edu/people/stam/reality/Research/pdf/GDC03.pdf
Hier ist auf Seite 8 der Code, den ich umwandeln will.
Ich weiß nur nicth, wie ich das am besten mache verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 15:39    Titel: Antworten mit Zitat

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 grinsen )
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 15:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 15:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 16:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 16:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 16:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 16:46    Titel: Antworten mit Zitat

Naja, Du mußt im Funktionskopf natürlich die Parameter auch als Pointer deklarieren! Zunge rausstrecken
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 16:52    Titel: Antworten mit Zitat

Meh, sorry, dass ich nerve! missbilligen
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
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.06.2008, 16:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 27.06.2008, 17:01    Titel: Antworten mit Zitat

Code:
error 56: Illegal specification, at parameter 2 (@)


=/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz