|
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 |
Muecke Gast
|
Verfasst am: 11.01.2014, 23:53 Titel: |
|
|
hmm, schade.
dann muss ich mir da was anderes einfallen lassen. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 12.01.2014, 18:31 Titel: |
|
|
Das kommt daher, dass FreeBasic generische Programmierung derzeit noch nicht unterstützt. Die von dreael vorgestellte Methode dies in mit Hilfe von Präprozessor-Direktiven nachzubauen bringt einige Einschränkungen mit sich. u.a. funktioniert seine Methode i.A. nur mit einem einzigen Typ, wodurch ich dessen Verwendung auch nicht als besonders sinnvoll erachte.
Wikipedia hat weitere Infos zu generischer Programmierung, die aber wie gesagt mit FB derzeit (von irgendwelchen unschönen "Hacks"/Tricks einmal abgesehen) nicht wirklich möglich ist:
http://de.wikipedia.org/wiki/Generische_Programmierung
http://de.wikipedia.org/wiki/Generischer_Typ _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 12.01.2014, 19:43 Titel: |
|
|
@dreael: Ich fürchte, in die programmiererischen Sphären, in denen du schwebst, kann Muecke dir nicht wirklich folgen. Ich sehe ihn förmlich, wie er vor seinem Rechner sitzt und kleine Rauchwölkchen aus seinen Ohren steigen.
Generische Programmierung mag ja für professionelle Programmentwickler eine feine Sache sein, aber als (Wieder-)Einsteiger sollte man vielleicht doch mit etwas einfacherem anfangen, besonders, wenn die verwendete Programmiersprache dafür eigentlich gar nicht geeignet ist.
@Muecke: Wenn du die gleiche Function für verschiedene Datentypen benutzen möchtest, kannst du sie überladen. Um dir Tipparbeit zu sparen, kannst du die "generische" Version der Function in ein Macro packen und "T" jeweils als den gewünschten Datentyp definieren. Code: | #Macro KK()
Function KKleinste(daten() As T, rangIndex As Integer) As T
Dim As Integer sortInd(LBound(daten) To UBound(daten)), i, j, q
Dim ret As T
For i = LBound(daten) To UBound(daten)
sortInd(i) = i
Next i
' Sortierung, aber nur Indexe, nicht Daten selber
For i = LBound(daten) To UBound(daten)-1
For j = i + 1 To UBound(daten)
If daten(sortInd(j)) < daten(sortInd(i)) Then
' Nicht Daten selber, sondern nur Indexe tauschen
Swap sortInd(i), sortInd(j)
EndIf
Next j
Next i
If rangIndex = 1 Then
Return daten(sortInd(LBound(daten))) 'kleinsten wert zurückgeben
EndIf
j = 1 'anfangsindex für vergleichswert
q = 1 'anfangswert für aktuellen rang
For i = LBound(sortInd) To UBound(sortInd) 'ganzes array durchgehen
If daten(sortInd(i)) > daten(sortInd(j)) Then 'größerer wert gefunden
q += 1 'aktuellen rang erhöhen
If q = rangIndex Then 'prüfen, ob der gewünschte rang erreicht ist
Return daten(sortInd(i)) 'entsprechenden wert zurückgeben
Else
j = i 'aktuellen wert als nächsten vergleichswert setzen
EndIf
EndIf
Next
Return ret 'kein passender rang gefunden
End Function
#EndMacro
#Define T Integer 'function für integer deklarieren
Declare Function KKleinste OverLoad (daten() As T, rangIndex As Integer) As T
#Undef T
#Define T String 'function für strings deklarieren
Declare Function KKleinste (daten() As T, rangIndex As Integer) As T
#Undef T
Dim datenarray(1 To 10) As Integer = {1,2,2,2,2,3,4,5,-1,9} 'integerarray
Print KKleinste (datenarray(),1)
Print KKleinste (datenarray(),2)
Print KKleinste (datenarray(),3)
Print
Dim datenarray2(1 To 5) As String = {"null","eins","zwei","drei","vier"} 'stringarray
Print KKleinste (datenarray2(),1)
Print KKleinste (datenarray2(),2)
Print KKleinste (datenarray2(),3)
Sleep
End
#Define T Integer
KK() 'macro als function KKleinste für integer
#Undef T
#Define T String
KK() 'macro als function KKleinste für strings
| Für jeden weiteren Datentyp mußt du dann eine weitere Version der Function anlegen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 13.01.2014, 03:56 Titel: |
|
|
Noch effektiver wäre es (ist jetzt nur so ein Gedanke), wenn man eine Art Programmgenerator hätte (Function, Sub, Macro, Modul, was auch immer) den man mit einer Liste der gewünschten Datentypen aufruft und der dann den erforderlichen Programmcode erzeugt, etwa in der Art Code: | MachMalProgrammCode(Integer, Single, Double, String, Vector, myType) |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.01.2014, 13:01 Titel: |
|
|
Ich habe mir gestern Abend auch noch kurz ein geeignetes Syntax-Konstrukt für FreeBasic überlegt, vielleicht sollten wir dies auf die Whishlist der Projektseite draufnehmen. Grundsätzliches Ziel: Die generische Klasse oder Prozedur sollte eine in sich kompilierbare Einheit geben, ganz analog dem bereits in QB 4.5 vorhandenem Modulkonzept.
Syntaktisch würde ich z.B. zwei neue Schlüsselwörter "Abstract" und "MustProvide" vorschlagen.
Beispiel:
Code: | Type T Abstract
' Lose SUBs und FUNCTIONs
MustProvide Operator<(a As T, b As T) As Integer
' Methoden
MustProvide T.Constructor T(a As Integer)
MustProvide T.Constructor T()
Function KKleinste<T>(daten() As T, rangIndex As Integer) As T
' Hier Implementierung; was T ist, muss man hier nicht kennen,
' aber T stellt lediglich die als "MustProvide" deklarierten Eigenschaften
' zur Verfügung
End Function |
Hauptprogramm:
Code: | Dim z(...) As Double => {6.5, 2.3, -1.67 }
Print KKleinste<Double>(z(), 2) |
d.h. im Modul werden zuerst die abstrakten Typen deklariert, anschliessend die Interfaces, welches die abstrakten Typen unterstützen müssen (z.B. den "<"-Vergleich), danach die Implementierung sämtlicher Klassen und auch losen SUBs/FUNCTIONs (z.B. die Sortierroutine).
Da solche Konzepte sog. Polymorphismus benötigen, denke ich, dass in FB so etwas erst spätestens in die Sprache gelangt, wenn auch die Vererbung bei Klassen möglich ist. Das bereits heute vorhandenen FB-Schlüsselwort PROTECTED zeigt auf jeden Fall bereits, dass derartige Pläne bei den FB-Entwicklern in der Schublade liegen.
Übrigens ein interessanter Trend in Java: Dort lebt mittlerweilen wieder verstärkt POJO, so dass viele moderne Frameworks stattdessen auf Annotations setzen.
So innovativ, wie die FreeBasic-Entwickler FB aus ursprünglich einem QB-Ersatz weiterentwickelt haben, würde ich letzteres auch nie ausschliessen! Vielleicht kommt dann auch für FreeBasic eine Datenbank-Persistenzschicht heraus...
@Muecke: Jetzt sind wir glaube ich ziemlich ausgeschweift von Deinem ursprünglichen Problem, dafür hast Du bereits ein gutes Beispiel kennengelernt, was Wiederverwendbarkeit von Software ausmacht. In deinem Fall eine KKleinste-FUNCTION typneutral programmieren. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 13.01.2014, 13:14 Titel: |
|
|
Hallo miteinander,
ich bin echt platt hier, was sich alles aus dem ich mache mal kurz etwas entwickelt.
Ich wollte nur eine Machbarkeitsstudie für mich selber mit 3D Daten erstellen und dann Leeren ich gleich noch neue Sachen in der Programmierung und was es da noch so alles gibt wovon ich glaube noch nie gehört habe .
Ehrlich gesagt ist das alles etwas Sehr hoch für mich ich kann dem was Ihr da schreibt und verlinkt habt ein wenig folgen doch lange nicht so wie ich das gern würde .
inzwischen habe ich einen Mix aus dem was hier an Codes hatten zu kkleinste wie auch zu kgroeste in meinen prog verbaut, wenn ich was daran ändere tut das Prog nicht mehr daher lasse ich mal die Finger davon was ich in meinem Prog drin habe und hoffe das später nicht Probleme auftauchen
Ich finde es erstaunlich wie Ihr mir hier helft und mit welcher Geduld Ihr das Schaft, ist ja nicht meine erste ""blöde"" Frage hier im Forum
Einen ganz Lieben Dank an euch alle. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 14.01.2014, 18:55 Titel: |
|
|
Klar macht sinn.
da ich die Funktion nur ein mal zu begib include also in den Speicher Lade und dort der Typ schon definiert sein muss steht der dort dann Fest drin und ich kann ihn nicht mehr ändern schade, gut ist so. muss ich mit Leben und ich glaube für mein Prog ist das auch vollkommen ausreichend .
DANKE
@grindstone: deinen Code habe ich getestet ich bin begeistert, ich habe Ihn auch gleich für KGroeste umgeschrieben.
DANKE
das Stammprogramm sieht so aus:
Code: | Type T As Single
#Include Once "Include\KKleinsteKGroeste.bi" '' Kleinter / Größter wert aus einem Array herauslesen inklusive Positionswert
Screen 19
Dim TestDaten(...) As Single => { 11, -1.2, -1.2, -1.2, -0.503, -0, 1, 11, 10, 8, -1.2, 0, 2, 8, 3}
Print "KKleinste": Print
For i As Integer = 1 To 12
Print "i = ";KKleinste(TestDaten(), i)
Next i
Print "KGroeste": Print
For q As Integer = 1 To 12
Print "q = ";KGroeste(TestDaten(), q)
Next q
Sleep: End |
was mich interessieren würde wie kann ich die Fehlermeldung abfragen wenn der Rang nicht mehr Existiert also Rückantwort = ret ist? |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 15.01.2014, 04:11 Titel: |
|
|
Muecke hat Folgendes geschrieben: | Ehrlich gesagt ist das alles etwas Sehr hoch für mich ich kann dem was Ihr da schreibt und verlinkt habt ein wenig folgen doch lange nicht so wie ich das gern würde | Keine Sorge, das kommt schon noch.
Zitat: | wenn ich was daran ändere tut das Prog nicht mehr traurig daher lasse ich mal die Finger davon | Ja, es ist immer gut, wenn man weiss, was man macht, wenn man was macht
Zitat: | Ich finde es erstaunlich wie Ihr mir hier helft und mit welcher Geduld Ihr das Schaft | Das liegt daran, daß jeder hier mal mit "null Plan" angefangen hat
Zitat: | was mich interessieren würde wie kann ich die Fehlermeldung abfragen wenn der Rang nicht mehr Existiert also Rückantwort = ret ist? | Wenn der Rang nicht existiert, wird der Initialwert der jeweiligen Variable zurückgegeben. Welcher Wert das ist, hängt vom jeweiligen Datentyp ab. Bei Integer, Single oder Double ist es 0, bei String ein Leerstring. Wenn das Probleme geben sollte, weil der Wert auch in den durchsuchten Daten vorkommt, kannst du einen entsprechenden Fehlerwert definieren, den du der Funktion bei jedem Aufruf mitgibst. Dazu müsstest du die Parameterliste der Funktion erweitern und die Zeile für den Rückgabewert entsprechend ändern Code: | Function KKleinste(daten() As T, rangIndex As Integer, fehlerWert As T) As T
...
...
Return fehlerWert 'kein passender rang gefunden | Die Zeile kann dann entfallen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 20.01.2014, 14:35 Titel: |
|
|
ich habe das Tool KKleinste erfolgreich im Einsatz
jetzt stehe ich jedoch vor dem Problem das ich einen Datensatz bekomme bei dem ich den Ersten Wert Ignorieren muss, daher dachte ich mir ich mache das so:
Code: | ReDim As Single Test_Daten(0 To 9)
Test_Daten(0) = 0
Test_Daten(1) = 10
Test_Daten(2) = 9
Test_Daten(3) = 3
Test_Daten(4) = 2
Test_Daten(5) = 6
Test_Daten(6) = 5
Test_Daten(7) = 4
Test_Daten(8) = 5
Test_Daten(9) = 8
Print KKleinste(Test_Daten(1 To 9),1)
Sleep : End |
das ist die Function: "Wie ich sie im Einsatz habe"
Code: | Function KKleinste(daten() As Single, rangIndex As Integer) As Single
Dim As Integer sortInd(LBound(daten) To UBound(daten)), i, j, q
Dim ret As Single
For i = LBound(daten) To UBound(daten)
sortInd(i) = i
Next i
'' -->> Sortierung, aber nur Indexe, nicht Daten selber <<--
For i = LBound(daten) To UBound(daten)-1
For j = i + 1 To UBound(daten)
If daten(sortInd(j)) < daten(sortInd(i)) Then
Swap sortInd(i), sortInd(j) '' Nicht Daten selber, sondern nur Indexe tauschen
EndIf
Next j
Next i
If rangIndex = 1 Then
Return daten(sortInd(LBound(daten))) '' kleinsten wert zurückgeben
EndIf
j = LBound(sortInd) '' anfangsindex für vergleichswert
q = 1 '' anfangswert für aktuellen rang
For i = LBound(sortInd) To UBound(sortInd) '' ganzes array durchgehen
If daten(sortInd(i)) > daten(sortInd(j)) Then '' größerer wert gefunden
q += 1 '' aktuellen rang erhöhen
If q = rangIndex Then '' prüfen, ob der gewünschte rang erreicht ist
Return daten(sortInd(i)) '' entsprechenden wert zurückgeben
EndIf
j = i '' aktuellen wert als nächsten vergleichswert setzen
EndIf
Next
Return ret '' kein passender rang gefunden
End Function |
Leider kann ich anscheinend das Array so nicht übergeben
ich dachte wenn ich nur von 1 to 9 und nicht () übergebe dann müsste doch der Wert aus dem Array(0) nicht vorhanden sein
habe ich einen Denkfehler? oder nur einen Falschen Syntax ?
das ist die Fehlermeldung:
Zitat: | E:\FreeBASIC\FbEdit\..\fbc -s console "Start.bas"
Start.bas(220) error 7: Expected ')', found 'To' in 'Print KKleinste(Test_Daten(1 To 9),1)'
Build error(s) |
|
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 20.01.2014, 16:15 Titel: |
|
|
So ein Syntaxkonstrukt um Teilmengen eines Arrays als neues Array herauszunehmen gibt es meines Wissens in FreeBasic einfach nicht.
Möglich wäre zusätzlich die jeweiligen Indexgrenzen zu übergeben bzw. mit einer überladenen Funktionsdeklaration zumindest die Möglichkeit dazu zu bieten. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 20.01.2014, 16:37 Titel: |
|
|
hmm ok, danke für dein Feedbeck.
Dann miss ich mir eine Kleine SUB machen mit der ich das Lösche zu begin:
irgend wie versteh ich das nicht so richtig:
wo mache ich denn den Fehler?
Code: | Declare Sub Array_Start_Kuerzen(Array_Rho As Single, Start_Zellen_Kuerzen As Integer, Arrey_Rueckantwort() As Single)
ReDim As Single Arrey_Rueckantwort(0 To 1)
ReDim As Single Array_Rho(0 To 9)
Array_Rho(0) = 1
Array_Rho(1) = 2
Array_Rho(2) = 3
Array_Rho(3) = 4
Array_Rho(4) = 5
Array_Rho(5) = 6
Array_Rho(6) = 7
Array_Rho(7) = 8
Array_Rho(8) = 9
Array_Rho(9) = 10
Array_Start_Kuerzen(Array_Rho(), 1, Arrey_Rueckantwort())
For i As Integer = LBound(Arrey_Rueckantwort) To UBound(Arrey_Rueckantwort)
Print "I (";I;") = ";Arrey_Rueckantwort(i)
Next
Sleep : End
Sub Array_Start_Kuerzen(Array_Rho() As Single, Start_Zellen_Kuerzen As Integer, Arrey_Rueckantwort() As Single)
'' -->> Das soll in die SUB <<--
' Dim As Integer Start_Zellen_Kuerzen = 2
ReDim As Single Arrey_Rueckantwort(LBound(Array_Rho) To UBound(Array_Rho)-Start_Zellen_Kuerzen)
For i As Integer = LBound(Array_Rho) To UBound(Array_Rho)-Start_Zellen_Kuerzen
Arrey_Rueckantwort(i) = Array_Rho(i+Start_Zellen_Kuerzen)
Next
'' -->> Das soll in die SUB <<--
End Sub |
Das wird als Fehler ausgegeben:
Zitat: | E:\FreeBASIC\FbEdit\..\fbc -s console "test.bas"
test.bas(18 ) error 1: Argument count mismatch, found '(' in 'Array_Start_Kuerzen(Array_Rho(), 1, Arrey_Rueckantwort())'
test.bas(28 ) error 57: Type mismatch, at parameter 1 (Array_Rho) of Array_Start_Kuerzen() in 'Sub Array_Start_Kuerzen(Array_Rho() As Single, Start_Zellen_Kuerzen As Integer, Arrey_Rueckantwort() As Single)'
Build error(s) |
wenn ich es als nicht SUB mache geht es, nur mit der SUB nicht
also mache ich was mit dem SUB Aufruf Falsch, ich versteh nur nicht was |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 20.01.2014, 17:20 Titel: |
|
|
Die Fehlermeldungen kommen daher, dass die SUB-Deklaration nicht mit der Definition uebereinstimmt, in der Deklaration ist Array_Rho
als Variable Deklariert und nicht als Array. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 20.01.2014, 17:41 Titel: |
|
|
Danke, das habe ich irgend wie die gesamte zeit übersehen
Danke. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 20.01.2014, 19:25 Titel: |
|
|
St_W hat Folgendes geschrieben: | So ein Syntaxkonstrukt um Teilmengen eines Arrays als neues Array herauszunehmen gibt es meines Wissens in FreeBasic einfach nicht. |
Bei der Programmiersprache ADA wäre dies möglich -> 'first und 'last (entsrpechen LBound() und UBound()) melden dann innerhalb der SUB nur die Grenzen des effektiv angegebenen Bereiches zurück.
Geeignete Alternative in FreeBasic: Defaultparameter verwenden in nachfolgender Art (müsste ich aber auch einmal noch testen):
Code: | FUNCTION KKleinste(daten() As T, rangIndex As Integer, dStart As Integer = LBound(daten), dEnde As Integer = UBound(Daten)) As T
..
' Hier alle LBound() und UBound()s weglassen und durch dStart und
' dEnde ersetzen, alles Übrige wie bisher.
End Function
' Hauptprogramm
' Rang auf ganzes Array
e1 = KKleinste(d(), 3)
' Rang auf Teilmenge
e2 = KKleinste(d(), 2, 1, 4) |
d.h. ich darf die FUNCTION mit unterschiedlicher Anzahl von Parametern aufrufen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 21.01.2014, 14:00 Titel: |
|
|
an so was dachte ich auch, in zwischen wies ich was ich in meinem Programm wo mache so oft wie ich es neu Geschrieben habe da ich immer wider was dazu gelernt habe, doch das mit dem KKleinste Code ist für mich noch immer ein Ministerium .
Hatte es versucht immer den Ersten wert abzuschneiden doch das irgend wie nie hin bekommen
Danke für die Code Korrektur.
habe es getestet und es Klappt
habe den vollständigen Code unten angehängt zum mit Beispielen
DANKE
P.S.: jetzt wies ich wie man Defaultparameter angibt das habe ich schon mal gesucht jedoch nichts zu gefunden. Danke.
[EDIT: 13:09] habe gerade die Neue FUNCTION 1 zu 1 in meine Module.bi gepackt und bekomme nun vollenden Fehler
Zitat: | E:\FreeBASIC\FbEdit\..\fbc -s console "Start.bas"
C:\Users\00\Desktop\3D-Analyse\FreeBasic\Version 0.1.0\Include\Module.bi( error 41: Variable not declared, daten in 'Declare Function KKleinste(daten() As Single, rangIndex As Integer, dStart As Integer = LBound(daten), dEnde As Integer = UBound(daten)) As Single'
C:\Users\00\Desktop\3D-Analyse\FreeBasic\Version 0.1.0\Include\Module.bi(133) error 62: Expected array, before ')' in 'Function KKleinste(daten() As Single, rangIndex As Integer, dStart As Integer = LBound(daten), dEnde As Integer = UBound(daten)) As Single'
C:\Users\00\Desktop\3D-Analyse\FreeBasic\Version 0.1.0\Include\Module.bi(214) warning 13(0): Function result was not explicitly set
Build error(s) |
kann mir jemand sagen warum das Daten jetzt nicht mehr geht? ging doch vorher auch.
Code: |
Dim As Single Daten(0 To 9)
Declare Function KKleinste(daten() As Single, rangIndex As Integer, dStart As Integer = LBound(daten), dEnde As Integer = UBound(Daten)) As Single
FUNCTION KKleinste(daten() As Single, rangIndex As Integer, dStart As Integer = LBound(daten), dEnde As Integer = UBound(Daten)) As Single
Dim As Integer sortInd(dStart To dEnde), i, j, q
Dim ret As Single
For i = dStart To dEnde
sortInd(i) = i
Next i
'' -->> Sortierung, aber nur Indexe, nicht Daten selber <<--
For i = dStart To dEnde-1
For j = i + 1 To dEnde
If daten(sortInd(j)) < daten(sortInd(i)) Then
Swap sortInd(i), sortInd(j) '' Nicht Daten selber, sondern nur Indexe tauschen
EndIf
Next j
Next i
If rangIndex = 1 Then
Return daten(sortInd(dStart)) '' kleinsten wert zurückgeben
EndIf
j = LBound(sortInd) '' anfangsindex für vergleichswert
q = 1 '' anfangswert für aktuellen rang
For i = LBound(sortInd) To UBound(sortInd) '' ganzes array durchgehen
If daten(sortInd(i)) > daten(sortInd(j)) Then '' größerer wert gefunden
q += 1 '' aktuellen rang erhöhen
If q = rangIndex Then '' prüfen, ob der gewünschte rang erreicht ist
Return daten(sortInd(i)) '' entsprechenden wert zurückgeben
EndIf
j = i '' aktuellen wert als nächsten vergleichswert setzen
EndIf
Next
Return ret '' kein passender rang gefunden
End Function
'' -->> Hauptprogram <<--
Daten(0) = -1.321
Daten(1) = 5
Daten(2) = 4
Daten(3) = 8
Daten(4) = 7
Daten(5) = 1
Daten(6) = 6
Daten(7) = 1
Daten(8) = 3
Daten(9) = 2
'' -->> Beispiele <<--
'' -->> Rang auf ganzes Array <<--
Print KKleinste(Daten(), 1) '' Ausgabe: -1.321
Print KKleinste(Daten(), 2) '' Ausgabe: 1
Print KKleinste(Daten(), 3) '' Ausgabe: 2
Sleep: CLS
'' -->> Rang auf Teilmenge <<--
'' aus den Daten Array wird nur der Teil genommen (5, 4, 8, 7)
Print KKleinste(Daten(), 1, 1, 4) '' Ausgabe: 4
Print KKleinste(Daten(), 2, 1, 4) '' Ausgabe: 5
Print KKleinste(Daten(), 3, 1, 4) '' Ausgabe: 7
Print KKleinste(Daten(), 4, 1, 4) '' Ausgabe: 8
Sleep: End |
|
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 21.01.2014, 15:39 Titel: |
|
|
Hallo, der Fehler tritt deshalb auf, weil das Array daten() in deiner *.bi-Datei vorher noch nicht Deklariert wurde. Das muss aber vor der Funktions-Deklaration schon
existieren weil sich deine Defaultwerte darauf bezeihen. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 21.01.2014, 17:00 Titel: |
|
|
ah Ok, ich muss vor dem Include meiner bi Datei in der sich die Funktion befindet das Array Definieren.
Perfekt geht danke. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 21.01.2014, 18:44 Titel: |
|
|
hmm, jetzt klapt das perfekt bei KKleinste
wenn ich das jedoch in KGroeste verstrich mit umgekehrten Vergleichsmuster > = < und umgekehrt
dann bekomme ich immer 0 als Ergebnis
an was könnte das liegen?
das verblüffende ist das es in meinem Test Prog das ich oben gePostethabe geht nur in meinem Eigendeichen Programm nicht. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 21.01.2014, 21:48 Titel: |
|
|
ich habe das Alte KGroeser wider eingefügt damit geht es, den Neuen Text habe ich unter TGroeser eingefügt.
jetzt versuche ich das hier ein mal:
Code: | For a As Integer = 1 To 5
Print "KGroeste(Y_Werte(),";a;") = "; KGroeste(Y_Werte(),A)
Next
Print: Print
For a As Integer = 1 To 5
Print "TGroeste(Y_Werte(),";a;") = "; TGroeste(Y_Werte(),A, LBound(Y_Werte), UBound(Y_Werte))
Next
Print: Print
For a As Integer = 1 To 5
Print "TGroeste(Y_Werte(),";a;") = "; TGroeste(Y_Werte(),A)
Next |
die erste For schleife klappt ohne Probleme
die Zweite auch (Habe auch die Dimension des Array angegeben
die Dritte lässt das Programm abstürzen
in meinem Solo Test Programm klappt alles einwandfrei nur in meinem Richtigen Programm nicht
an was könnt es denn Ligen, nach was muss ich denn schauen?
in meinem Hauptprogramm kommen zu erste die Variablen dort auch das
dim as Single Daten
dann das Include dort auch die Module.bi in der sich die Function befindet
und danach irgend wann rufe ich die Function erst auf.
Deklariert habe ich die Function in der BI Datei ganz oben.
ich habe Daten immer so gemacht am Anfang:
Code: | ReDim daten(1 To 1) As Single |
das haeb ich jetzt so
Code: | Dim daten(1 To 1) As Single |
jetzt bricht das Prog nicht mehr ab sondern gibt immer 0 als wert Ausgabe bei der Letzten schleife
[EDIT] habe versucht mir mal die Werte ausgeben zu lassen, wenn ich mir z.B.
dStart und dEnde ausgeben lasse bekomme ich immer eine 1 wenn ich es beim Functions Aufruf nicht mit angegeben habe zurück?
das Arrey Daten ist jedoch vollständig vorhanden es wird nur nicht in den Defaultparameter anscheinend Berücksichtigt ?
warum das? an was liegt das?
[EDIT] was ich auch noch verstanden habe und auch nichts zu gefunden habe bis jett ist warum muss ich das Array daten() eigendlich extra noch mal Definiren zu begin?
das wird doch in der Function Deklariert oder nicht?
ich muss ja auch beim Function Aufruf das Array das übergeben wird nicht Function nennen Sonden kann es anredest benennen somit wird das Array daten in der Function 1 Parameter erstellt in seiner vollen Größe mit dem Inhalt der beim Aufruf an Stelle Parameter 1 Steht und dann kann doch auch das Erstellte Array Daten aus dem ersten Parameter in Parameter 3 und 4 wider zugreifen, daher verstehe ich nicht warum das Array Daten vorher schon Deklariert sein muss, denn es kann ja bei jeden Function Aufruf eine andere Größe haben oder etwa nicht? dann würde das was ich zu Bein Deklariert habe in meinem Code ja nicht mehr passen
gibt es da Literatur zu? das mir jemand Posten kann (Link) ich finde nichts |
|
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.
|
|