Forum | | | | 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 |
| | | | |
| | Nico Madysa | So weit ich weiß, können Arrays nicht an NProcs übergeben werden. Nur Bereiche#, Strings$, Longs& und Floats! sind erlaubt. |
| | | | |
| | | Bitte siehe Datentypen: [...]
Nativ werden (wie von Nico bereits erwähnt) Strings, Floats & Longs unterstützt.
Wenn Du eine Wertekette wie Arrays übergeben möchtest dann hole Dir einfach
einen Speicher z.B. per globalAlloc: KompilierenMarkierenSeparierenvar meinSpeicher&=globalAlloc(gPTR,20)// 20 Byte Speicher reservieren und Handle in meinSpeicher& merken
und lege dort hinein Deine Werte: KompilierenMarkierenSeparierenlong meinSpeicher&,0=10,20,30,40,50
Ein Long benötigt im Speicher 4 Byte und ein Float 8 -
5 Floats in den Speicher legen also so: KompilierenMarkierenSeparieren Achtung: ungetestet nur in den Editor hier reingeschrieben da grad kein XProfan zur Hand. |
| | | | |
| | Andreas Koch | Danke für die Antwort.
Dann habe ich iFs Beitrag hier wohl etwas falsch interpretiert.
[...] |
| | | | |
| | | | | | | |
| | 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. |
| | | | |
| | Andreas Koch | Offen gestanden, hattest du nur in keinem 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 vermutlich wolltest du mir da genau das mitteilen, was jetzt zu diesem Thema hier geführt hat. Sorry für die Umstände. Bin manchmal bisschen schwer von Begriff. |
| | | | |
| | | 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 keinem 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. |
| | | | |
| | funkheld | Fehlermeldung: meineFloats undeklariert....
Gruss |
| | | | |
| | | bestimmt weil ich ein Undzeichen vergessen habe:
getFloat(meineFloats&,8*3)
wie geschrieben einfach in den Editor hier getippt |
| | | | |
| | Andreas Koch | Sorry Leute, ich bin schon wieder steckengeblieben. Jetzt habe ich die Arrays![] in Bereiche# umgewandelt und die übergeben, 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 übergeben werden). Wenn ich die deklariere, bekomme ich anschließend eine seltsame Fehlermeldung, siehe Anhang. KompilierenMarkierenSeparierenWindow 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.... |
| | | | |
| | | 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. |
| | | | |
|
AntwortenThemenoptionen | 5.382 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |