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:

Kleinsten Wert ermitteln - leider kommt immer 0 aus der SUB
Gehe zu Seite Zurück  1, 2, 3  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
Muecke
Gast





BeitragVerfasst am: 11.01.2014, 23:53    Titel: Antworten mit Zitat

hmm, schade.

dann muss ich mir da was anderes einfallen lassen.
Nach oben
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 12.01.2014, 18:31    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 12.01.2014, 19:43    Titel: Antworten mit Zitat

@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. zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


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

BeitragVerfasst am: 13.01.2014, 00:17    Titel: Antworten mit Zitat

@grindstone: Danke für Deine Kommentare.
Inzwischen noch das Beispiel von mir lauffähig erweitert:

http://beilagen.dreael.ch/QB/RangFunktionModul.bi
http://beilagen.dreael.ch/QB/RangFunktion.bas

Mit Hilfe des Präprozessors lässt sich also bereits immerhin pseudomässig generisch programmieren, in dem der Compiler in meinem Fall einfach drei Varianten der FUNCTION mit Hilfe von Überladung erzeugt.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 13.01.2014, 03:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


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

BeitragVerfasst am: 13.01.2014, 13:01    Titel: Antworten mit Zitat

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





BeitragVerfasst am: 13.01.2014, 13:14    Titel: Antworten mit Zitat

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 traurig.

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 traurig.

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 traurig daher lasse ich mal die Finger davon was ich in meinem Prog drin habe und hoffe das später nicht Probleme auftauchen lächeln

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 zwinkern

Einen ganz Lieben Dank an euch alle.
Nach oben
Muecke
Gast





BeitragVerfasst am: 14.01.2014, 18:55    Titel: Antworten mit Zitat

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 traurig schade, gut ist so. muss ich mit Leben und ich glaube für mein Prog ist das auch vollkommen ausreichend lächeln.
DANKE


@grindstone: deinen Code habe ich getestet lächeln 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

BeitragVerfasst am: 15.01.2014, 04:11    Titel: Antworten mit Zitat

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 zwinkern

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 lächeln

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
Code:
Dim ret As T
kann dann entfallen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 20.01.2014, 14:35    Titel: Antworten mit Zitat

ich habe das Tool KKleinste erfolgreich im Einsatz lächeln
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 traurig
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 lächeln
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

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

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





BeitragVerfasst am: 20.01.2014, 16:37    Titel: Antworten mit Zitat

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 traurig
also mache ich was mit dem SUB Aufruf Falsch, ich versteh nur nicht was traurig
Nach oben
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 20.01.2014, 17:20    Titel: Antworten mit Zitat

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





BeitragVerfasst am: 20.01.2014, 17:41    Titel: Antworten mit Zitat

Danke, das habe ich irgend wie die gesamte zeit übersehen traurig
Danke.
Nach oben
dreael
Administrator


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

BeitragVerfasst am: 20.01.2014, 19:25    Titel: Antworten mit Zitat

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





BeitragVerfasst am: 21.01.2014, 14:00    Titel: Antworten mit Zitat

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 lächeln da ich immer wider was dazu gelernt habe, doch das mit dem KKleinste Code ist für mich noch immer ein Ministerium traurig.
Hatte es versucht immer den Ersten wert abzuschneiden doch das irgend wie nie hin bekommen traurig
Danke für die Code Korrektur.
habe es getestet und es Klappt lächeln
habe den vollständigen Code unten angehängt zum mit Beispielen lächeln

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 traurig
Zitat:
E:\FreeBASIC\FbEdit\..\fbc -s console "Start.bas"
C:\Users\00\Desktop\3D-Analyse\FreeBasic\Version 0.1.0\Include\Module.bi(cool 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

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

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





BeitragVerfasst am: 21.01.2014, 17:00    Titel: Antworten mit Zitat

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





BeitragVerfasst am: 21.01.2014, 18:44    Titel: Antworten mit Zitat

hmm, jetzt klapt das perfekt lächeln bei KKleinste
wenn ich das jedoch in KGroeste verstrich mit umgekehrten Vergleichsmuster > = < und umgekehrt lächeln

dann bekomme ich immer 0 als Ergebnis traurig
an was könnte das liegen?


das verblüffende ist das es in meinem Test Prog das ich oben gePostethabe geht traurig nur in meinem Eigendeichen Programm nicht.
Nach oben
Muecke
Gast





BeitragVerfasst am: 21.01.2014, 21:48    Titel: Antworten mit Zitat

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 traurig

in meinem Solo Test Programm klappt alles einwandfrei nur in meinem Richtigen Programm nicht traurig
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 traurig

[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 traurig 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 traurig
Nach oben
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 Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
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