| 
				
					|  | 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: 07.01.2014, 23:15    Titel: Kleinsten Wert ermitteln - leider kommt immer 0 aus der SUB |   |  
				| 
 |  
				| Hallo miteinander, 
 ich möchte aus einem Arrey den Kleinsten wert ermitteln.
 
 Kann mir jemand sagen warum die Übergabe meines Wertes Single nicht klappt.
 ich bekomme immer den Wert 0 zurück
  und nicht das was die SUB ermittelt hat.   
 das ist der Code:
 
  	  | Code: |  	  | Declare Sub KKleinste (KKleinste_Array() AS String, Wert As single) Dim As String XWerte(5)
 Dim As Single KKWert
 
 XWerte(1) = "Y\X"
 XWerte(2) = "-1.001"
 XWerte(3) = "-0.750"
 XWerte(4) = "1.000"
 XWerte(5) = "10.215"
 
 KKleinste XWerte(), KKWert
 Locate 2,1: Print "KKWert nicht in der Sub = ";KKWert
 Sleep
 
 Sub KKleinste (KKleinste_Array() AS String, Wert As Single)
 Dim As Single  Aktueller_Arrey_Wert
 
 For i As Integer = LBound(KKleinste_Array) To UBound(KKleinste_Array)
 Aktueller_Arrey_Wert = Val(KKleinste_Array(i))
 If  Aktueller_Arrey_Wert < Wert Then Wert = Aktueller_Arrey_Wert
 Next
 
 Locate 1,1: Print "KKWert       in der Sub = "; Wert
 End Sub
 
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 07.01.2014, 23:20    Titel: |   |  
				| 
 |  
				| Du übergibst KKWert By Value statt By Reference, d.h. auch nach dem Aufruf hat die Variable noch denselben Wert wie vorher. 
 Außerdem wird dein Programm maximal immer 0 zurückgeben, da KKWert mit 0 initialisiert wird und somit ein größeres Minimum als 0 niemals gefunden wird. Sinnvoller wäre es, das Ergebnis nicht als Sub-Parameter zu übergeben, sondern als Funktions-Rückgabewert, und es zudem mit dem ersten Wert im Array zu intialisieren statt mit 0 (alternative mit +Unendlich, aber kA wie das in FreeBASIC geht).
 _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 07.01.2014, 23:33    Titel: |   |  
				| 
 |  
				| an so was wie eine Funktion habe ich auch schon gedacht jedoch noch nie gemacht  daher erst mal der Weg mit der SUB   
 danke für das mit dem "ByRef"
 
 jetzt muss ich mich um die 0 Kümmern da habe ich nicht dran gedacht
  da meine liste für die ich das gerade mache immer mit - werten begibt  doch das muss nicht so sein   
 
 
 das ist der Code mit dem es Klappt
   
 
 
  	  | Code: |  	  | Declare Sub KKleinste (KKleinste_Array() AS String, ByRef Wert As single) Dim As String XWerte(5)
 Dim As Single KKWert
 
 XWerte(1) = "Y\X"
 XWerte(2) = "-1.001"
 XWerte(3) = "-0.750"
 XWerte(4) = "1.000"
 XWerte(5) = "10.215"
 
 KKleinste XWerte(), KKWert
 Locate 2,1: Print "KKWert nicht in der Sub = "; KKWert
 Sleep
 
 Sub KKleinste (KKleinste_Array() AS String, ByRef Wert As Single)
 Dim As Single  Aktueller_Arrey_Wert
 
 For i As Integer = LBound(KKleinste_Array) To UBound(KKleinste_Array)
 Aktueller_Arrey_Wert = Val(KKleinste_Array(i))
 If  Aktueller_Arrey_Wert < Wert Then Wert = Aktueller_Arrey_Wert
 Next
 
 Locate 1,1: Print "KKWert       in der Sub = "; Wert
 End Sub
 
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		| HorstD 
 
 
 Anmeldungsdatum: 01.11.2007
 Beiträge: 110
 
 
 | 
			
				|  Verfasst am: 08.01.2014, 00:04    Titel: |   |  
				| 
 |  
				| Wie Jojo schon schrieb: Verwende anstelle der SUB eine FUNCTION. |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 08.01.2014, 13:48    Titel: |   |  
				| 
 |  
				| was haltet Ihr denn von dem Code? habe mich in der Funktionsweise mal am Excel orientiert
   
 muss mir noch überlegen wie ich das am besten mache mit den Rang.
 Ideen immer willkommen, ich dachte an ein Weiteres Arrey das ich dann immer noch mal mit prüfe und über Switch dann gegebenenfalls Tauschen.
 was sagt Ihr dazu?
 
 
 
  	  | Code: |  	  | ' -------------------------------------------------------------------------------------- '         KKleinste
 '
 '         Gibt den k-kleinsten Wert einer Datengruppe zurück. Mit dieser
 '         Funktion können Sie Werte ermitteln, die innerhalb einer Datenmenge
 '         eine bestimmte relative Größe haben.
 '
 '         Syntax
 '
 '         KKLEINSTE(Matrix;K)
 '
 '         Matrix      ist eine Arrey numerischer Daten, deren K-kleinsten
 '                     Wert Sie bestimmen möchten.
 '
 '         K            ist der Rang des Elementes dessen Wert zurückgegeben
 '                     werden soll.
 '
 '         K !!!         ist noch nicht Programmirt worden somit ohne Fungzion
 '                     es wird immer der Kleinste wert ausgegeben
 ' --------------------------------------------------------------------------------------
 Declare FUNCTION KKleinste (Arrey() As Integer, x AS INTEGER) AS Integer
 
 ' -------------------------------------------------------------
 ' Beispiel KKleinste
 ' -------------------------------------------------------------
 Dim As Integer MeineZahlen(1 To ...) = { 13, 4, 37, 42, 5}
 Print KKleinste (MeineZahlen(), 1)
 Sleep
 
 
 FUNCTION KKleinste (KKleinste_Array() As Integer,x AS INTEGER) AS INTEGER
 Dim As Integer Aktueller_Arrey_Wert , Wert, indexMin, indexMax
 
 indexMin = LBound(KKleinste_Array)      '' Untere Array-Grenze
 indexMax = UBound(KKleinste_Array)      '' Obere Array-Grenze
 
 Wert = KKleinste_Array(indexMin)            '' Rückgabe mit dem ersten wert Arrey intialisieren
 
 
 For i As Integer = indexMin To indexMax
 Aktueller_Arrey_Wert = KKleinste_Array(i)
 If  Aktueller_Arrey_Wert < Wert Then Wert = Aktueller_Arrey_Wert
 Next
 
 RETURN Wert
 
 End Function
 
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 08.01.2014, 16:15    Titel: |   |  
				| 
 |  
				| OK, ich habe nun versucht das mit dem Rang mit einzubauen, doch irgend wie muss ich einen Denkfehler machen   
 könnt Ihr mir da einen Tipp geben in welche Richtung meine Gedanken gehen sollten.
 
 wenn ich den 5 kleinsten wert aus einen Arrey haben möchte.
 dann erstelle ich ein Arrey Rang(1 to 5)
 
 dann vergleiche ich die Werte Aktueller Wert aus dem Arrey aus dem ich herausfinden möchte was der 5 Kleinste wert ist mit dem Aktuellem Rang in einer Schleife ob er denn Kleiner ist wenn ja und der rang darüber Größer ist dann Speichere den Akkuellenwert in den Aktuellen Rang.
 
 doch das klappt nicht
  warum denn? was mache ich Falsch? 
 
 
  	  | Code: |  	  | ' -------------------------------------------------------------------------------------- '   KKleinste
 '
 '         Gibt den k-kleinsten Wert einer Datengruppe zurück. Mit dieser
 '         Funktion können Sie Werte ermitteln, die innerhalb einer Datenmenge
 '         eine bestimmte relative Größe haben.
 '
 '   Syntax
 '
 '         KKLEINSTE(Matrix;K)
 '
 '         Matrix      ist eine Arrey numerischer Daten, deren K-kleinsten
 '                     Wert Sie bestimmen möchten.
 '
 '         K            ist der Rang des Elementes dessen Wert zurückgegeben
 '                     werden soll.
 ' --------------------------------------------------------------------------------------
 Declare FUNCTION KKleinste (Arrey() As Single, x AS Single) AS Single
 
 ' -------------------------------------------------------------
 ' Beispiel KKleinste
 ' -------------------------------------------------------------
 Dim As Single MeineZahlen(1 To ...) = {4.1, 13.1 ,37.1, 42.1, 5.1}
 
 Print "Alles  =  4.1, 5.1, 13.1, 37.1, 42.1"
 Print
 Print "Rang 1 = "; KKleinste (MeineZahlen(), 1)
 Print "Rang 2 = "; KKleinste (MeineZahlen(), 2)
 Print "Rang 3 = "; KKleinste (MeineZahlen(), 3)
 Print "Rang 4 = "; KKleinste (MeineZahlen(), 4)
 Print "Rang 5 = "; KKleinste (MeineZahlen(), 5)
 Sleep
 
 FUNCTION KKleinste (KKleinste_Array() As single, x AS Single) AS Single
 Dim As Single Aktueller_Arrey_Wert , Wert, indexMin, indexMax, Rang(0 To x), r, i
 
 indexMin = LBound(KKleinste_Array)      '' Untere Array-Grenze
 indexMax = UBound(KKleinste_Array)      '' Obere Array-Grenze
 
 For r  = 1 To x
 Rang(r) = KKleinste_Array(indexMin)
 For i = indexMin To indexMax
 Aktueller_Arrey_Wert = KKleinste_Array(i)
 If  Aktueller_Arrey_Wert < Rang(r) And Aktueller_Arrey_Wert > Rang(r-1) Then
 Rang(r) = Aktueller_Arrey_Wert
 EndIf
 Next
 Next
 RETURN Rang(x)
 End Function
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 08.01.2014, 16:53    Titel: |   |  
				| 
 |  
				| Du legst den Startwert immer auf den ersten Arraywert fest; wenn dieser aber schon kleiner ist als alle anderen, dann scheitert das weitere Verfahren. Du müsstest im Gegensatz dazu immer erst auf den größten Wert hin initialisieren, oder zumindest auf einen beliebigen Wert, der mindestens so groß ist wie der größte im Array auftretende Wert. 
 Allerdings würde ich eher vorschlagen gleich eine Sortierroutine zu schreiben (Bubblesort ist z. B. recht einfach, auch wenn es schnellere Verfahren gibt), weil du dann nur einmal sortieren musst anstatt für jeden Rang extra.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| dreael Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 2530
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 08.01.2014, 19:28    Titel: |   |  
				| 
 |  
				| Noch besser: Generischer Aufbau, also etwas der Art 
  	  | Code: |  	  | Function KKleinste(daten() As T, rangIndex As Integer)As T | 
 und dann in der Anwendung
 
  	  | Code: |  	  | Type T as Single #include "kkleinste.bas"
 | 
 verwenden. Da T ein Datentyp sein kann, der aufwändig zum Kopieren ist, würde ich die Sortierung nur auf einem Index-Array vornehmen. So wird ausserdem das übergebene Array nicht verändert.
 
 Unter
 
 http://beilagen.dreael.ch/QB/RangFunktionModul.bi
 
 (Modul) und
 
 http://beilagen.dreael.ch/QB/RangFunktion.bas
 
 (aufrufendes Hauptprogramm) kurz so etwas zusammengestrickt.
 _________________
 Teste die PC-Sicherheit mit www.sec-check.net
 |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 08.01.2014, 23:05    Titel: |   |  
				| 
 |  
				| DANKE DANKE 
 das ist der Hammer.
 
 ich sitze jetzt den gesamten Tag hier und habe ich weis nicht alles gelesen und probiert und nichts hat gefruchtet bei mir.
 und Ihr schreibt da kurz eine Anweisung das ist der Hammer. und zugleich echt Peinlich für mich.
 
 Bbitte last mir ein wenig zeit um den Code weiter auseinander zu nehmen, ich möchte das verstehen.
 
 also das mit dem T gibt es da noch mehr Erklärungen Beispiele ? etc. die ich mir anschauen kann?
 |  |  
		| Nach oben |  |  
		|  |  
		| dreael Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 2530
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 09.01.2014, 10:55    Titel: |   |  
				| 
 |  
				|  	  | Muecke hat Folgendes geschrieben: |  	  | also das mit dem T gibt es da noch mehr Erklärungen Beispiele ? etc. die ich mir anschauen kann? | 
 Siehe dazu
 
 http://de.wikipedia.org/wiki/Generische_Programmierung
 
 und diese Diskussion
 
 http://forum.qbasic.at/viewtopic.php?t=8322
 
 Motivation: Statt Zahlen, die Du nach Ränge aussuchen willst, sind es vielleicht das nächste Mal Strings (lexikografische Ordnung) oder gar eine eigene Klasse, z.B. Vektor, wo Du den sog. Betrag als Vergleichswert definierst. Ziel: Ein und derselbe Code mit allen Datentypen verwenden können, d.h. der Datentyp wird als T abstrahiert => Die "kKleinste"-Function (Implementierung) muss T nicht kennen, was das ist. T muss lediglich den "<"-Vergleich unterstützen.
 _________________
 Teste die PC-Sicherheit mit www.sec-check.net
 |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 10.01.2014, 14:27    Titel: |   |  
				| 
 |  
				| Wenn ich es jetzt richtig verstanden habe ist T eine Variabler Typ der sich anpassen kann. ?? habe ich das so richtig verstanden? 
 da ich ja zwei sachen miteinander vergelcieh z.B.,
 
 Birne = Auto
 oder
 1 = 1
 
 macht keinen Unterschied in der Abfrage.
 es ist nur das Problem das ich einen Alge meinen Code nicht für alle Typen Programmiren kann und will , daher gibt es den T Typ mit dem ich also jetzt Variable bin und den Typ nehme der vorher als T Typ Definiert wurde.
 
 Ich hoffe das ich das Richtig verstanden habe.
 
 
 
 Den Rest des Codes Verstehe ich auch nicht so richtig.
 ich schnalle es nicht was du da wie hin und her Tauschen tust
  und warum auch nicht. 
 denn mir ist aufgefallen wenn man das austauscht im Code:
 
  	  | Code: |  	  | Dim d(...) As Double => { 1.3, -5.2, 7.1, -5.2, -3.7, -4.2, 10.1 } | 
 
 dann bekomme ich in der Liste zwei mal -5.2 ausgegeben
   
 
 
 du Erstellt ein Neues Array "sortInd" das ist so groß wie das Arrey in dem die Daten sind.
 Das "sortInd" Array nummerist du von 1 bis ... durch.
 
 Jetzt wird Verglichen 1 Wert "Daten" mit X Daten das X Läuft von 1 bis Ende "sortInd" wenn Daten 1 kleiner ist dann Tausche Position in SortInd miteinander.
 
 somit müsste jetzt der Inhalt von "sortInd" so sortiert das die Kleinst Zahl aus dem Datenindex an Stelle Index1 vom  "sortInd" steht usw.
 
 
 jetzt stellt sich für mich nur die Frage wie bekomme ich die Doppelten Werte aus der Sortierung?
 
 
 EDIT 1:
 ich habe jetzt Außerhalb von der Funktion  versucht das mal hin zu bekommen also die Werte die Raus Müssten Rot zu markieren
   
 sieht dann so aus:
 
  	  | Code: |  	  | Type T As Double 
 
 Dim d(...) As Double => { 20, 19, 99, 100, 18, 17, 17, 16, 15, 14, 13, 13, 100 }
 
 
 For q As Integer = LBound(d)+1 To UBound(d)+1
 Color 15
 If q <> UBound(d)+1 Then
 If KKleinste(d(), q) <> KKleinste(d(), q+1) Then
 Color 15
 Else Color 4
 EndIf
 EndIf
 Print "Rang ";q;" = ";KKleinste(d(), q)
 Next q
 
 
 Sleep:End
 | 
 mal schauen wie ich das jetzt Sinnvoll in die Funktion mit hinein bekomme.
 
 EDIT 2:
 
 ich habe es jetzt in die Funktion eingebaut bekommen, so richtig verstanden habe ich das glaube ich noch immer nicht so an einem Stück das Teil im Kopf durchgehen kann ich immer noch nicht
   
 es macht jedoch das was es soll
  *man bin ich Heppy* ich glaube nur das es nicht so gut ist da noch mal ein Array zu erstellen in der Funktion kann ich das Löschen es wird ja nicht mehr Benötigt
  so würde ich den Speicherplatz wider Frei geben. 
 Jetzt Fehlt mir außerdem das Letzte Element immer
  warum denn das? 
 das ist der Code der Funktion jetzt:
 
  	  | Code: |  	  | Function KKleinste(daten()As T, rangIndex As Integer)As T 
 Dim sortInd(LBound(daten) To UBound(daten))As Integer, i As Integer, j As Integer
 Dim Ausgabe_Arrey(LBound(daten) To UBound(daten)) 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
 
 '' Doppelte Einträge Löschen
 i = 0
 For q As Integer = LBound(sortInd) To UBound(sortInd)
 If q <> UBound(daten) Then
 If daten(sortInd(q)) <> daten(sortInd(q+1)) Then
 i + = 1
 Ausgabe_Arrey(i) = daten(sortInd(q))
 EndIf
 EndIf
 Next q
 '' Doppelte Einträge Löschen
 
 KKleinste = Ausgabe_Arrey(rangIndex)
 End Function
 | 
 
 
 EDIT:
 
 so jetzt habe ich es
  man ist das ein Sch.... jetzt schreibe ich am Schluss den letzten wert wider in das Extra Array am Schluss. denn sonst ist das letzte Rang nicht vorhanden.
 
 dazu habe ich dann noch eine Abfrage gemacht ob der angeforderte Rang überhaupt noch vorhanden ist oder nicht wenn nicht wird 0 eingeschrieben.
 
 so sieht es jetzt aus:
 
  	  | Code: |  	  | Function KKleinste(daten()As T, rangIndex As Integer)As T 
 Dim sortInd(LBound(daten) To UBound(daten))As Integer, i As Integer, j As Integer, q As Integer
 Dim Ausgabe_Arrey(LBound(daten)+1 To UBound(daten)+1) 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
 
 '' Doppelte Einträge Löschen
 i = 0
 For q As Integer = LBound(sortInd) To UBound(sortInd)
 If q <> UBound(daten) Then
 If daten(sortInd(q)) <> daten(sortInd(q+1)) Then
 i + = 1
 Ausgabe_Arrey(i) = daten(sortInd(q))
 EndIf
 EndIf
 Next q
 i + = 1: q   = UBound(daten)
 Ausgabe_Arrey(i) = daten(sortInd(q))
 '' Doppelte Einträge Löschen
 
 
 If rangIndex > i Then
 KKleinste = 0
 Else KKleinste = Ausgabe_Arrey(rangIndex)
 EndIf
 
 End Function
 | 
 
 
 Ich hoffe so das ich das nicht in ein Paar tagen noch mal machen muss bzw. noch ein Fehler drin ist denn da bekomme ich das bestimmt nicht noch mal zusammen was ich da gemacht habe.
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 10.01.2014, 19:33    Titel: |   |  
				| 
 |  
				| Warum denn so kompliziert? Soweit ich die Aufgabenstellung verstanden habe, soll die Funktion doch nicht das ganze Array sortieren, sondern nur das Element mit dem kleinsten Wert heraussuchen. 
 gibt den Index des kleinsten Elements als Integer zurück (bzw. den Index des ersten Auftretens, falls mehrere Arrayelemente mit dem gleichen Inhalt existieren). 	  | Code: |  	  | Function KKleinste(daten() As T) As Integer Dim As Integer KIndex, i
 
 KIndex = LBound(daten) 'ersten index als startwert
 
 For i = LBound(daten) + 1 To UBound(daten) 'vom zweiten element an vergleichen
 If daten(i) < daten(KIndex) Then
 KIndex = i 'index merken
 EndIf
 Next
 
 Return KIndex
 End Function
 | 
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 10.01.2014, 20:44    Titel: |   |  
				| 
 |  
				| @ grindstone: nicht ganz es geht um die Funktion KKleinste - KGrösste bekannt aus dem Excel. 
 nur das ich keine Doppelten Werte in meiner Sortierung (Rängen) brauchen kann
  |  |  
		| Nach oben |  |  
		|  |  
		| dreael Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 2530
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 10.01.2014, 22:08    Titel: |   |  
				| 
 |  
				|  	  | Muecke hat Folgendes geschrieben: |  	  | Wenn ich es jetzt richtig verstanden habe ist T eine Variabler Typ der sich anpassen kann. ?? habe ich das so richtig verstanden? | 
 Ist ein Datentyp, der sich anpassen kann. Bei FreeBasic nur sehr rudimentär mit dem Type-Alias möglich. Wäre das Ganze wie bei Java oder Ada möglich, so müsste eine Formulierung wie
 
  	  | Code: |  	  | ' Rein illustrativer Code! ' Wäre dort ein in sich komplierbares Modul!
 Function KKleinste<T Supports Operator<>(daten() As T, rangIndex As Integer) As T
 ' Implementierung wie gehabt
 ' T ist auf dieser Ebene ein abstrakter Datentyp, den man hier
 ' nicht kennen muss!
 KKleinste = ...
 End Function
 | 
 möglich sein (vielleicht nehmen die FB-Compilerentwickler dies eines Tages sogar einmal offiziell in die Sprache hinein!)
 
 Im Hauptprogram ein
 
  	  | Code: |  	  | ' Rein illustrativer Code! Declare Function KKleinste<T Supports "<">(daten() As T, rangIndex As Integer) As T
 
 Type Vektor
 x As Single
 y As Single
 z As Single
 End Type
 
 Constructor Vektor(x As Single, y As Single, z As Single)
 This.x = x
 This.y = y
 This.z = z
 End Constructor
 
 Operator<(a As Vektor, b As Vektor)
 ' Wie zuvor erwähnt Beträge bzw. dessen Quadrate vergleichen
 Return a.x * a.x + a.y * a.y + a.z * a.z < b.x * b.x + b.y * b.y + b.z * b.z
 End Operator
 
 Dim d(...) As Double => { 6.5, 1.7, -2.2, 5.4 }
 Dim q(...) As String => { "Andy", "Beat", "Yolanda", "Xaver", "Emil" }
 Dim v(...) As Vektor => { Vektor(5.0, 2.0, 7.0), Vektor(1.0, 1.0, 1.0), Vektor(-1.3, -2.3, 4.1), _
 Vektor(5.2, -1.3, 1.4), Vektor(5.2, 1.3, 1.8) }
 
 Print KKleinste<Double>(d(), 3)
 Print KKleinste<String>(q(), 2)
 Print KKleinste<Vektor>(v(), 3)
 | 
 In dieser Form lässt sich in Java eine generische Klasse verwenden, bei FB ist dies aktuell noch nicht möglich, aber in etwa so würde eine perfekte generische Programmierung in FB aussehen, d.h. ich könnte von meiner FUNCTION beliebige Versionen zur Anwendungszeit ableiten.
 
 
  	  | Muecke hat Folgendes geschrieben: |  	  | '' Doppelte Einträge Löschen i = 0
 For q As Integer = LBound(sortInd) To UBound(sortInd)
 If q <> UBound(daten) Then
 If daten(sortInd(q)) <> daten(sortInd(q+1)) Then
 i + = 1
 Ausgabe_Arrey(i) = daten(sortInd(q))
 EndIf
 EndIf
 Next q
 | 
 Nur zur Information: Das Original in Excel verhält sich wie der von mir zuvor publizierte Code, wie dieses Beispiel zeigt:
 
 http://beilagen.dreael.ch/QB/KKleinste_Test.xls
 
 Zum Thema Handhabung mehrfacher Werte solltest Du vielleicht ein Beispiel der Art
 
  	  | Beispiel hat Folgendes geschrieben: |  	  | Gegeben:
 
 Dim foo(...) As Double => { 5.2, 1.7, 1.6, 5.2, 1.7, 5.2, 4.8 }
 
 KKleinste(foo(), 3) sollte 1.7 zurückliefern
 KKleinste(foo(), 5) sollte 5.2 zurückliefern
 | 
 In der professionellen Software-Entwicklerwelt nennt sich so etwas übrigens Test Driven Development, d.h. Du definierst zuerst, was Du als Ergebnis erwartest und machst daraus bereits einen Testfall (entsteht üblicherweise bereits bevor die Function selber implementiert ist), z.B. bei Java ein JUnit-Testprogramm daraus. Siehe auch
 
 http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung
 _________________
 Teste die PC-Sicherheit mit www.sec-check.net
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 11.01.2014, 00:54    Titel: |   |  
				| 
 |  
				|  	  | Muecke hat Folgendes geschrieben: |  	  | es geht um die Funktion KKleinste - KGrösste bekannt aus dem Excel. | 
 Dann macht das Sortieren natürlich Sinn. Hier ein (mangles Datenmaterial ungetesteter) Alternativvorschlag:
 Damit sparst du dir das Anlegen des Ausgabearrays und das Löschen der doppelten Werte. Und durch das Anlegen der Variable "ret" bekommst du bei einem nicht vorhandenen Rang immer einen "leeren" Wert vom passenden Datentyp zurückgemeldet. 	  | Code: |  	  | 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 = 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
 | 
 Da ich die Function wie gesagt nicht testen konnte, würde ich mich über eine Rückmeldung freuen, ob sie funktioniert.
   
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 11.01.2014, 14:17    Titel: |   |  
				| 
 |  
				| OK, also der Datentyp T passt sich dem an was drin steht, wenn Zahlen drin stehen ist es ein "Integer / Single ... "
 und wenn Text Drin steht dann ist es ein "String ..."
 
 hmm Ok soweit klar
 
 nur wie mache ich das wenn ich jetzt z.B. das hier habe.
 
 
  	  | Code: |  	  | ReDim As String X_Achse(1) Dim As Integer Kleinster_X
 
 ''  Datei Öffnen
 ''  Zeile Lesen
 ''  Zeile zerlegen und in Array "X_Achse" Packen
 
 Kleinster_X = KKleinste(X_Achse(), 1)
 Print Kleinster_X
 Sleep: End
 
 Function KKleinste(daten()As T, rangIndex As Integer)As T
 ...
 End Function
 | 
 
 ich habe jetzt die Daten die übergeben werden aus einer Datei daher liegen diese in einem String Variablen,
 wie kann ich die Variable denn in eine T Variable umwandeln? denn ich bekomme immer den Fehler
 
 
  	  | Zitat: |  	  | error 57: Type mismatch, at parameter 1 (daten) of KKLEINSTE() in 'Kleinster_X = KKleinste(X_Achse(), 1)' | 
 
 
 
 
 
 Du hast recht das habe ich gestern auch noch im Excel probiert
  und da passiert genau das was du in deinem Code hast  , leider wies ich noch nicht so genau was ich alles benötige und wie, ich wies nur was ich am Schluss haben möchte
   da das mit dem Programmiren bei mir wirklich schon lange her ist, und ich da irgend wie ganz andere Erinnerungen dran habe Tue ich mich erschwer das richtig auszudenken, ...
  und ich merke erst wenn ich dann einen Schritt weiter bin das das was ich gemacht habe zwar schon schön war doch das noch was Fehlt   
 
 @grindstone: ich werde das Später noch Testen versprochen. und ein Feedback geben.
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 11.01.2014, 22:20    Titel: |   |  
				| 
 |  
				| Du mußt dem Compiler mitteilen, was er unter "T" verstehen soll. 
  	  | Code: |  	  | ... Type T As Integer
 Dim As T Kleinster_X
 ...
 | 
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 11.01.2014, 22:38    Titel: |   |  
				| 
 |  
				| Das bedeutet im Übrigen, dass T nicht jederzeit jeden beliebigen Datentyp annehmen kann, sondern nur einen einzigen, der zu Beginn festgelegt werden muss (wenn man mal von mehrmaligem #UNDEF und #DEFINE absieht ...) _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 
 Zuletzt bearbeitet von nemored am 11.01.2014, 22:42, insgesamt einmal bearbeitet
 |  |  
		| Nach oben |  |  
		|  |  
		| Muecke Gast
 
 
 
 
 
 
 | 
			
				|  Verfasst am: 11.01.2014, 22:41    Titel: |   |  
				| 
 |  
				| das bedeutet das ich den jedes mal für einen Neuen Aufruf der Funktion neu definieren kann? also bevor ich die Funktion Aufruf festlege was für einer es sein soll.
 
 hier mit:
  	  | Code: |  	  | ... Type T As Integer
 Dim As T Kleinster_X
 ...
 | 
 
 habe ich das so richtig verstanden?
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 11.01.2014, 22:45    Titel: |   |  
				| 
 |  
				| Eben genau das nicht - wenn du mit "TYPE T AS INTEGER" T festgelegt hast, ist und bleibt T ein INTEGER. Ein folgender Aufruf "TYPE T AS DOUBLE" o. ä. würde dir den Fehler "duplicated definition" ausgeben. 
 Du kannst T für dein Programm einmalig wählen.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| 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.
 
 |  |