Italia
Foro

Array und nProc

 
- Page 1 -



Andreas
Koch
Hallo zusammen,

hier hat sich bei mir ein kleines Problem bei der Übergabe eines Arrays an eine nProc ergeben.

Und zwar kommt jedes Mal die angehängte Fehlermeldung (Application Crash), nachdem das erste Ergebnis ausgedruckt wurde. Kann mir jemand erklären, was ich da falsch mache?
KompilierenMarkierenSeparieren
CLS
Declare HuckleberryFinn![], Tom!, Sawyer!
HuckleberryFinn![1]=1
HuckleberryFinn![2]=3
Tom!=1
Sawyer!=3

nproc Test1

    Parameters HuckleberryFinn![]
    Declare Ergebnis!
    Ergebnis!=HuckleberryFinn![1]+HuckleberryFinn![2]
    Return Ergebnis!

EndProc

nproc Test2

    Parameters a!,b!
    Declare Ergebnis!
    Ergebnis!=a!+b!
    Return Ergebnis!

EndProc

Print Test2(Sawyer!,Tom!)
Print Test1(HuckleberryFinn![])
Waitinput

243 kB
Hochgeladen:30.08.2012
Downloadcounter46
Download
 
30.08.2012  
 



 
- Page 1 -



Nico
Madysa
So weit ich weiß, können Arrays nicht an NProcs trasferimento werden. Nur Bereiche#, Strings$, Longs& und Floats! sind erlaubt.
 
30.08.2012  
 



Bitte siehe Datentypen: [...] 

Nativ werden (wie von Nico bereits erwähnt) Strings, Floats & Longs supportati.

Wenn Du eine Wertekette wie Arrays trasferimento möchtest dann hole Dir einfach

einen Speicher z.B. per globalAlloc:
KompilierenMarkierenSeparieren
var meinSpeicher&=globalAlloc(gPTR,20)// 20 Byte Speicher reservieren und Handle in meinSpeicher& merken
>

und lege dort hinein Deine Werte:
KompilierenMarkierenSeparieren
long meinSpeicher&,0=10,20,30,40,50
>

Ein Long necessario im Speicher 4 Byte und ein Float 8 -

5 Floats in den Speicher legen also so:
KompilierenMarkierenSeparieren
//speicher holen
var meineFloats&=globalAlloc(gPTR,5*8)
//floatwerte in den Speicher legen
float meineFloats&,0=1.1,2.2,3.3,4.4,5.5
//speicher an nProc übergeben
print myNProc(meineFloats&)
//speicher freigeben
globalFree(meineFloats&)
waitinput
end

nProc myNProc

    parameters meineFloats&
    //irgendwas mit floats machen... geben wir einfach z.B. den 4. Floatwert zurück
    return getFloat(meineFloats,8*3)

30.08.2012  
 




Andreas
Koch
Danke per die Antwort.

Dann habe ich iFs Beitrag hier wohl etwas falsch interpretiert.

[...] 
 
30.08.2012  
 



Welchen Beitrag genau?
 
30.08.2012  
 




Nico
Madysa
Vermutlich den hier: [...]  weil es darin so klingt, als müsste man nur das Schlüsselwort "proc" durch "nproc" ersetzen und alles wäre knorke.
 
30.08.2012  
 




Andreas
Koch
Offen gestanden, hattest du nur in no deiner Beiträge geschrieben, dass das mit Arrays gar nicht geht. Ich hatte das so interpretiert, dass es auch mit Arrays funktioniert (und mich schon gefreut...). Eigentlich hätte ich es aus dem letzten Beitrag entnehmen können, mir war bis dahin nur noch nie aufgefallen, dass man an APIs keine Arrays übergibt. Aber presumibilmente wolltest du mir da genau das mitteilen, was jetzt zu diesem Thema hier geführt hat.
Sorry per die Umstände. Bin manchmal bisschen schwer von Begriff.
 
30.08.2012  
 



Verstehe. Das hier einmal durchlesen: [...]  -

es ist quasi ein ganz ganz einfaches Profan aber eben als Unterstützung zu XProfan

mit allen positiven Eigenschaften eines nativen Profans.


Offen gestanden, hattest du nur in no deiner Beiträge geschrieben, dass das mit Arrays gar nicht geht.


Ja, einfach weil das "soooo" ja auch nicht ganz stimmt, denn auch wenn die Array-

Schreibweise nicht verwendet wird, so sind Arrays ja Datenketten und diese wiederum

sind leicht per Speicher anzufertigen und wiederum auch leicht mit nProcs

verwertbar. Ich hatte versucht dafür 1-2 Beispiele zu geben. Wenn Du nicht weiterkommst

dann einfach fix melden denn dann basteln wir das zusammen.
 
30.08.2012  
 




funkheld
Fehlermeldung:
meineFloats undeklariert....

Gruss
 
30.08.2012  
 



bestimmt weil ich ein Undzeichen vergessen habe:

getFloat(meineFloats&,8*3)

wie geschrieben einfach in den Editor hier getippt
 
30.08.2012  
 




Andreas
Koch
Sorry Leute, ich bin schon wieder steckengeblieben.
Jetzt habe ich die Arrays![] in Bereiche# umgewandelt und die trasferimento, so weit so gut. Er scheint auch mit Procs richtig zu rechnen.
Aber bei nProcs beschwert er sich in der Prozedur DreiecksmatrixTest erst, dass FHG% und Anzahl_Lastfaelle% nicht deklariert seien (obwohl die doch mit trasferimento werden). Wenn ich die deklariere, bekomme ich anschließend eine seltsame Fehlermeldung, siehe Anhang.
KompilierenMarkierenSeparieren
Window 800,800
var Size%=6
Declare A#, Zeile&, Spalte&, Diagonale&, Faktor!, aux!,L#,Lastfall%,V#
DIM A#,Size%*Size%*8
DIM L#,Size%*8
DIM V#,Size%*8
Lastfall%=0
'Erzeugung zweier Zufallsmatrizen

WhileLoop 0,Size%-1

    Spalte&=&loop

    WhileLoop 0,Size%-1

        Zeile&=&loop
        SMAT(A#,Size%,Spalte&,Zeile&,1+Rnd())

        If Spalte&<1

            SMAT(L#,Size%,Spalte&,Zeile&,1+Rnd())

        EndIf

    EndWhile

EndWhile

'Umformung, Erzeugung einer Dreiecksmatrix

nproc DreiecksmatrixTest

    Parameters A#, L#, FHG%, Anzahl_Lastfaelle%
    Declare Diagonale&,Zeile&,Lastfall&,Faktor!,Spalte&, aux!, FHG%, Anzahl_Lastfaelle%

    WhileLoop 0,(FHG%-1),1

        Diagonale&=&loop

        WhileLoop Diagonale&+1,FHG%-1,1

            Zeile&=&loop
            '      WaitInput
            Faktor!=LMAT(A#,FHG%,Diagonale&,Zeile&)/LMAT(A#,FHG%,Diagonale&,Diagonale&)

            if Faktor!<>0

                WhileLoop 0,Anzahl_Lastfaelle%-1

                    Lastfall&=&loop
                    aux!=LMAT(L#,FHG%,Lastfall&,Zeile&)-Faktor!*LMAT(L#,FHG%,Lastfall&,Diagonale&)
                    SMAT(L#,FHG%,Lastfall&,Zeile&,aux!)

                EndWhile

                WhileLoop 0,FHG%-1,1

                    Spalte&=&loop
                    aux!=LMAT(A#,FHG%,Spalte&,Zeile&)-Faktor!*LMAT(A#,FHG%,Spalte&,Diagonale&)
                    SMAT(A#,FHG%,Spalte&,Zeile&,aux!)

                EndWhile

            EndIf

        EndWhile

    EndWhile

EndProc

nProc LMAT

    Parameters Bereich#, Size%, Spalte& , Zeile&
    Declare Result!
    Result!=Float(Bereich#, (Spalte&*Size%+Zeile&)*8)
    '  Print "Spalte&",Spalte&,"Zeile&",Zeile&, ": ", Result!
    Return Result!

EndProc

nProc SMAT

    Parameters Bereich#, Size%, Spalte&, Zeile&,Wert!
    ' Locate 1,1
    ' Print "Spalte&",Spalte&,"Zeile&",Zeile&,": ",Wert!
    Float Bereich#,(Spalte&*Size%+Zeile&)*8=Wert!

EndProc

'Rücksubstitution

nProc SolverTest

    Parameters Lastfall&, A#,L#, V#, FHG%
    Declare aux!, Zeile&, Spalte&, Diagonale&

    WhileLoop FHG%,1,-1

        Diagonale&=&loop-1
        aux!=0

        WhileLoop Diagonale&+1,FHG%-1,1

            Spalte&=&loop
            aux!=aux!+LMAT(A#,FHG%,Spalte&,Diagonale&)*LMAT(V#,FHG%,Lastfall&,Spalte&)

        EndWhile

        aux!=(LMAT(L#,FHG%,Lastfall&,Diagonale&)-aux!)/LMAT(A#,FHG%,Diagonale&,Diagonale&)
        SMAT(V#,FHG%,Lastfall&,Diagonale&,aux!)

    EndWhile

EndProc

DreiecksmatrixTest(A#, L#, Size%, 0)
SolverTest(0,A#,L#, V#, Size%)

WhileLoop 0,Size%-1

    Print LMAT(V#, Size%,0, &loop)

EndWhile

WaitInput
Dispose L#, V#, A#

Habt ein wenig Geduld mit mir, ich arbeite noch nicht so lange mit Profan....

167 kB
Hochgeladen:31.08.2012
Downloadcounter49
Download
 
31.08.2012  
 



Keine Sorge, da ist auf jeden Fall genügend Geduld vorhanden.

Du verwendest in den nProcs Integer ( % ) -

in nProcs gibt es Longs ( & ), Floats ( ! ) und Strings ( $ ) -

nutze also statt der Integer ( % ) die Longs ( & ).

Die nProcs sind in manchen Dingen etwas pingeliger -

so müssen Float-Konstanten immer mit Dezimaltrenner/ Punkt

ausgeschrieben werden.

Z.B. 1.0 statt 1 oder 0.0 statt 0.

Du schreibst: if Faktor!<>0 statt if Faktor!<>0.0

Darum meckert XPSE das Long gegeben ist ( die 0 ) aber Float erwartet wird

in der Funktion dreiecksmatrixtest.

Du schreibst in der nProc SMAT: Parameters Bereich#, müsste aber bereich&

heissen.

Tip: Statt Float Bereich#,(Spalte&*Size%+Zeile&)*8=Wert! was aber
Float Bereich&,(Spalte&*Size%+Zeile&)*8=Wert! heissen müsste in nProcs lieber
setFloat(Bereich&,(Spalte&*Size%+Zeile&)*8,Wert!) schreiben.

Auch in den anderen Procs die Bereichsvariablen statt mit # mit & schreiben.
 
31.08.2012  
 



 
- Page 2 -



Andreas
Koch
Danke per die Aiuto und die Lehrstunde, ich glaube, da hätte ich mich dusselig gesucht. Jetzt corre es einwandfrei durch und ich habe was gelernt.
Ob es richtig rechnet, muss ich noch prüfen. An und per sich sollte das Ding aber ein lineares Gleichungssystem lösen können (sofern auf der Hauptdiagonalen keine Nullen auftauchen).
KompilierenMarkierenSeparieren
Window 800,800
var Size&=6
Declare A#, Zeile&, Spalte&, Diagonale&, Faktor!, aux!,L#,Lastfall%,V#
DIM A#,Size&*Size&*8
DIM L#,Size&*8
DIM V#,Size&*8
Lastfall%=0
'Erzeugung zweier Zufallsmatrizen

WhileLoop 0,Size&-1

    Spalte&=&loop

    WhileLoop 0,Size&-1

        Zeile&=&loop
        SMAT(A#,Size&,Spalte&,Zeile&,1+Rnd())

        If Spalte&<1

            SMAT(L#,Size&,Spalte&,Zeile&,1+Rnd())

        EndIf

    EndWhile

EndWhile

'Umformung, Erzeugung einer Dreiecksmatrix

nproc DreiecksmatrixTest

    Parameters A&, L&, FHG&, Anzahl_Lastfaelle&
    Declare Diagonale&,Zeile&,Lastfall&,Faktor!,Spalte&, aux!

    WhileLoop 0,(FHG&-1),1

        Diagonale&=&loop

        WhileLoop Diagonale&+1,FHG&-1,1

            Zeile&=&loop
            '      WaitInput
            Faktor!=LMAT(A&,FHG&,Diagonale&,Zeile&)/LMAT(A&,FHG&,Diagonale&,Diagonale&)

            if Faktor!<>0.0

                WhileLoop 0,Anzahl_Lastfaelle&-1

                    Lastfall&=&loop
                    aux!=LMAT(L&,FHG&,Lastfall&,Zeile&)-Faktor!*LMAT(L&,FHG&,Lastfall&,Diagonale&)
                    SMAT(L&,FHG&,Lastfall&,Zeile&,aux!)

                EndWhile

                WhileLoop 0,FHG&-1,1

                    Spalte&=&loop
                    aux!=LMAT(A&,FHG&,Spalte&,Zeile&)-Faktor!*LMAT(A&,FHG&,Spalte&,Diagonale&)
                    SMAT(A&,FHG&,Spalte&,Zeile&,aux!)

                EndWhile

            EndIf

        EndWhile

    EndWhile

EndProc

nProc LMAT

    Parameters Bereich&, Size&, Spalte& , Zeile&
    Declare Result!
    Result!=Float(Bereich&, (Spalte&*Size&+Zeile&)*8)
    '  Print "Spalte&",Spalte&,"Zeile&",Zeile&, ": ", Result!
    Return Result!

EndProc

nProc SMAT

    Parameters Bereich&, Size&, Spalte&, Zeile&,Wert!
    ' Locate 1,1
    ' Print "Spalte&",Spalte&,"Zeile&",Zeile&,": ",Wert!
    Setfloat(Bereich&,(Spalte&*Size&+Zeile&)*8,Wert!)

EndProc

'Rücksubstitution

nProc SolverTest

    Parameters Lastfall&, A&,L&, V&, FHG&
    Declare aux!, Zeile&, Spalte&, Diagonale&

    WhileLoop FHG&,1,-1

        Diagonale&=&loop-1
        aux!=0

        WhileLoop Diagonale&+1,FHG&-1,1

            Spalte&=&loop
            aux!=aux!+LMAT(A&,FHG&,Spalte&,Diagonale&)*LMAT(V&,FHG&,Lastfall&,Spalte&)

        EndWhile

        aux!=(LMAT(L&,FHG&,Lastfall&,Diagonale&)-aux!)/LMAT(A&,FHG&,Diagonale&,Diagonale&)
        SMAT(V&,FHG&,Lastfall&,Diagonale&,aux!)

    EndWhile

EndProc

DreiecksmatrixTest(A#, L#, Size&, 0)
SolverTest(0,A#,L#, V#, Size&)

WhileLoop 0,Size&-1

    Print LMAT(V#, Size&,0, &loop)

EndWhile

WaitInput
Dispose L#, V#, A#

Nachtrag: Der Quellcode ist inzwischen geprüft und er scheint korrekt zu rechnen. Er ist in der Tat sehr viel schneller als vorher. Ich habe keine genaue Messung gemacht, aber Faktor 2000 ist realistisch.
 
31.08.2012  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

5.328 Views

Untitledvor 0 min.
rafl26.12.2020
Georg Teles13.02.2016
Andreas Koch08.09.2015
Peter Max Müller10.10.2014
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie