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
 
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 22.01.2014, 09:36    Titel: Antworten mit Zitat

Zitat:
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?
Wenn du das Array mit
Code:
Dim   daten(1 To 1)    As Single   
dimensionierst, bekommst du natürlich (und korrekterweise) zwei Einsen zurückgemeldet.

Zitat:
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?
Du mußt der Function mitteilen, welche Art von Daten du ihr übergibst und unter welchem Namen sie diese innerhalb der Function ansprechen muß. Ich weiß nicht, ob ich dich richtig verstanden habe, aber ich nehme an daß du Verständnisschwierigkeiten bezüglich der Parameterübergabe hast.
Ein Array in der Parameterliste einer Function wird immer ByRef übergeben, d.h., die Function bekommt nicht die Werte selbst übergeben, sondern nur deren Speicheradresse und greift daher immer auf das echte Array außerhalb der Function zu, so, als ob du es global (also Shared) dimensioniert hättest. Wenn das Array global dimensioniert wäre, bräuchtest du es nicht in der Parameterliste angeben, müsstest es dann aber innerhalb der Function mit seinem unter Dim festgelegten Namen ansprechen und könntest somit kein beliebiges anderes Array an die Function übergeben.

Zitat:
die Dritte lässt das Programm abstürzen
Ein Programmabsturz beim Zugriff auf ein Array deutet darauf hin, daß du einen Index außerhalb des definierten Bereichs aufgerufen hast.

Ansonsten kann ich deine Schwierigkeiten hier nicht nachvollziehen, ich habe alle deine geposteten Codes ausprobiert, bei mir läuft alles korrekt.

Hast du bei "KGroeste" wirklich beide Vergleichsoperatoren umgedreht?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 23.01.2014, 07:58, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 22.01.2014, 11:37    Titel: Antworten mit Zitat

eigentlich dachte ich das ich das mit dem DIM und den Übergabe von Parametern verstanden habe, doch ich wurde eines Besseren belehrt, sonst hätte ich nun nicht die Probleme. Kann es sein das QBasic da früher unter DOS nicht so Streng gewesen ist? was die Deklaration von Variablen etc. anbelangt?


Mit Dim Deklariere ich und weise den Variablen Array`s etc. Speicher zu!
ReDim besagt das es ein Variabler Speicher ist und Später vergrößert werden kann mit, mit Neuer Deklaration (ReDim).
Das Shared sollte man so wenig wie möglich benutzen sagte man mir, ich versuche Ohne aus zukommen)

Wenn ich eine Variable in einer SUB / Function benutze nur innerhalb der SUB / Function dann muss ich sie dort auch Deklarieren (DIM).
Wenn ich den Inhalt einer Variable in einer SUB / Function benötige muss ich es als Parameter übergeben, Variablen werden immer als BYREF übergeben (Werte kommen nicht aus der SUB / Function Array`s hingegen als ByVal wenn der Wert eines Array`s geändert wird ändert er sich auch außerhalb der SUB / Function. Soweit Klar.
Wenn man was anderes Möchte muss man das bei den Parametern Definieren also ByVal / BYREF vor das Parameter Schreiben.

Wenn ich eine Variable aus den Parametern erstelle wird sie dort auch Deklariert und muss nicht noch ein mal in der SUB / Function extra Deklariert werden.

Ich hoffe das ich das so richtig verstanden habe.



so jetzt zu meinem Problem, nachdem ich die Probleme mit dem KGroeser hatte ist mir auch aufgefallen das KKleiner nicht richtig arbeitet. kam nur nicht zum Tragen da ich immer nur den Kleinsten wert und nicht den zweit Kleinsten wert ausgelesen habe bis jetzt.

Mir ist klar das es extrem ungünstig ist das ich den Fehler nicht reproduzierbar darstellen kann, wobei da fehlt mir gerade ein: ich probiere mal was: JA ich kann den Fehler Reproduzieren lächeln
den Datensatz bei X_Werte habe ich gekürzt sind über 2.000 Werte

Hier kommt der Fehler:

Code:
Dim As Single Daten ()                                                     '' Da ich keinen Plan habe was für eien Größe ich benötige mal nur das mindeste.

'' ######################   Module.bi ####################################
Declare FUNCTION KGroeste(daten()   As Single,_
                          rangIndex As Integer,_
                          dStart    As Integer = LBound(daten),_
                          dEnde     As Integer = UBound(Daten))_
                 As Single

FUNCTION KGroeste(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
'' ######################   Module.bi ####################################


   '' Daten aus Datei Lesen verarbeiten Zerteilen etc.
   '' Ergebnis X_Werte()

   Dim AS Single X_Werte(1 TO ...) = {0,-97.155,94.815,94.905,94.995,95.085,95.175,95.265,95.355,95.445,95.535}
   
Print "KGroeste(X_Werte(), 1) = "; KGroeste(X_Werte(), 1)
Sleep : End


wenn ich nun hin gehe und das Array Daten größer mache als das was bei X_Werte ist dann klappt es ohne Fehlermeldung.

ich verstehe nur nicht warum ich das Array Daten überhaupt in meinem Hauptprogramm mit einer DIM Deklarieren muss, ich dachte das mache ich schon in der Function bei der Parameter Auflistung.
den Fehler kann ich auch umgehen in dem ich die Zeile:
Code:
Print "KGroeste(X_Werte(), 1) = "; KGroeste(X_Werte(), 1)

mit dieser hier austausche
Code:
Print "KGroeste(X_Werte(), 1) = "; KGroeste(X_Werte(), 1, 1, 11)

antat 1 und 11 habe ich bei mir das LBound und UBound genommen lächeln
Nach oben
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 22.01.2014, 14:14    Titel: Antworten mit Zitat

Hallo,
also im grunde kann man sich das doch ganz einfach merken, ob Datenobjekte Ausserhalb einer Methode Deklariert werden muessen oder nicht. Als Beispiel beziehe ich mich jetzt mal auf dein Array daten().
Wenn du die Werte, die du in daten() Speicherst, nur in der Methode KGroeste(...) verwendest, dann braucht es nicht Ausserhalb Deklariert werden sondern nur innerhalb
der Methode selbst. Wenn du aber die Werte aus daten() noch in anderen Methoden brauchst und/oder auch im Hauptprogramm verwendest, dann muss es ausserhalb von den Methoden Deklariert werden und als Parameter uebergeben werden(falls es nicht SHARED Deklariert wurde).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 22.01.2014, 14:58    Titel: Antworten mit Zitat

Inzwischen noch die Sache mit dem Default-Parameter getestet und auf eine wichtige Einschränkung gestossen: Während der Kompilierzeit der Parameter-Variablen einer Sub/Function kennt FreeBasic diese für Ausdrücke im Default-Ausdruck noch nicht, d.h. bei
Code:
Function KKleinste OverLoad(daten()As T, rangIndex As Integer, dStart As Integer = _
LBound(daten), dEnde As Integer = UBound(daten)) As T

weiss der Compiler also noch nicht, dass das "daten" in der LBound()-Funktion sich direkt aufs erste "daten()As T" beziehen solll.

Sinnvolle Beispiele gibt es dafür genügend als nur wie hier, z.B. an einen Kreiszeichenbefehl der Art
Code:
Sub ZeichneKreis(x As Integer, y As Integer, rx As Integer, ry As Integer=rx)

denken, d.h. wenn man dem Programmierer eine Aufruf-Variante mit nur 3 Parameter für Kreis anstelle Ellipse bereitstellen möchte.

=> Müsste ich vermutlich auf dem Entwicklerportal als Feature-Request (Parametervariablen einer Sub und Function für Defaultwert-Ausdrücke bekanntmachen) stellen. Natürlich wäre für diesen speziellen Fall der sinnvollere Feature-Request die direkte Unterstützung von Unterbereichen, d.h. dass ich halt ein
Code:
element1 = KKleinste(q(), 2) ' Ganzes Array
element1 = KKleinste(q(1 To 3), 2)  ' Unterbereich

übergeben dürfte -> LBound() und UBound() innerhalb der Sub/Function dürfen nur diesen Unterbereich zurückliefern, wie dies bei Ada der Fall ist.

@Profis: Kennt jemand den genauen Link/Unterforum für die Entwickler-Diskussionen, also gewissermassen das Bugtraq für den FB-Compiler?

@Muecke: In diesem Sinn ist also mein Vorschlag aktuell noch nicht möglich, stattdessen empfehle ich Dir besser folgendes zu verwenden:

Code:
Function KKleinste (daten()As T, rangIndex As Integer, dStart As Integer, dEnde As Integer) As T
   ' Implementierung wie diskutiert
End Function

Function KKleinste OverLoad(daten()As T, rangeIndex As Integer) As T
   Return KKleinste(daten(), rangeIndex, LBound(daten), UBound(daten))
End Function

d.h. statt Defaultparameter verwende ich einfach eine weitere Überladung der Funktion, innerhalb welcher der Compiler die Variable daten() natürlich kennt.

Unter

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

daher mein berühmtes Beispiel entsprechend ergänzt.

Das Kreiszeichenbeispiel lässt sich mit
Code:
Sub ZeichneKreis(x As Integer, y As Integer, rx As Integer, ry As Integer)
  ' Implementierung
End Sub

Sub ZeichneKreis Overload(x As Integer, y As Integer, r As Integer)
   ZeichneKreis x, y, r, r
End Sub

genau gleich lösen.

Dagegen die "Lösung"
Code:
Dim daten(...) As T

Function KKleinste (daten()As T, rangIndex As Integer, dStart As Integer =LBound(daten), dEnde As Integer = UBound(daten)) As T

macht dagegen keinen Sinn, weil das Prinzip der Software-Wiederverwendbarkeit verletzt wird, da globale Variablen in einem Default-Ausdruck nichts zu suchen haben. => Compiler müsste daher in Defaultausdrücke sogar nur parametereigene Variablen akzeptieren.
_________________
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: 22.01.2014, 19:00    Titel: Antworten mit Zitat

@dreael: OK dann las mich das mal zusammen fassen ich habe das Richtig verstanden, jedoch kann FreeBasic das nicht "Default-Parameter" daher auch der Fehler.
OK dann liegt es nicht an mir das ich dazu nichts gefunden habe. ist jetzt nicht Böse gemeinte doch das Bezeugt mich ein wenig.

Ich gebe einfach immer eine Gänze an. dann passt es auch wider lächeln

DANKE
Nach oben
dreael
Administrator


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

BeitragVerfasst am: 22.01.2014, 20:25    Titel: Antworten mit Zitat

Muecke hat Folgendes geschrieben:
OK dann las mich das mal zusammen fassen ich habe das Richtig verstanden, jedoch kann FreeBasic das nicht "Default-Parameter" daher auch der Fehler.

Default-Parameterwerte gibt es natürlich schon, allerdings mit Einschränkungen, wenn diese aus Variablen berechnet werden sollen, deshalb auch meine Bemerkung schon zu Beginn, dass ein Test nötig ist. Und dieser ist heute nun erfolgt, wo ich nun auf die genannte Einschränkung gestossen bin, dass Variablen in Defaultparametern vom aktuellen FB-Compiler nur aus dem globalen Namensraum entnommen ist, wie Du dies mit einem
Code:
Dim daten(...) As T

vor der Function-Implementierung selber gemerkt hast, damit Dein Programm wieder übersetzbar wird.

Denke jedoch einfach an den Fall KKleinste() und KGroesste() als separat übersetzbare Einheit zwecks Wiederverwendung (=ein sehr wichtiges Ziel in der Software-Entwicklung; auf diesem Weg entstehen Bibliotheken, wie sie hier auch immer wieder genannt!) in beliebig vielen Projekten, we ich es in meinem Beispiel anhand der komplett verschiedenen Datentypen auch demonstriere.

Dieser Fall zeigt sogar, dass das jetzige Verhalten im Prinzip sogar ein offener Bug im FB-Compiler darstellt: Wenn Du nun Deine separat übersetzbare KKleinste()-Funktion mit diesem globalen DIM ergänzt, so würde der Compiler die Indexgrenzen dieses Dummy-Arrays statt dem übergebenen Array verwenden:

Modul.fbp / Modul.bas:
Code:
' Dies soll wiederverwendbar sein! => Übersetzung nur als Modul.o!
Type T As Single
Dim daten(1 To 10) As T

Function KKleinste(daten() As T, rangIndex As Integer, dStart As Integer = LBound(daten), dEnde As Integer = UBound(daten)) As T
  ' Implementierung
End Function


Anwendung1.fbp / Anwendung1.bas:
Code:
#include "KKleinste.bi"
Dim temperatur(1 To 31) As Single, x As Single
' Code, z.B. Datenlogger auslesen
x = KKleinste(temperatur(), 17)


Anwendung2.fbp / Anwendung2.bas:
Code:
#include "KKleinste.bi"
Dim reifendruck(50 To 500) As Single, p As Single
' ...
p = KKleinste(reifendruck(), 25)

Wenn aktuell mit LBound() so wie hier im Defaultausdruck gearbeitet wird, arbeitet KKleinste() mit vollkommen falschem dStart und dEnde, d.h. nimmt in beiden Fällen dasjenige der globalen Modulvariable, also 1 bzw. 10 in diesem Fall.

Letzter Post von mir vor diesem: Mit Überladung statt Defaultparametern lässt sich dieser FB-Compilerbug umgehen, denn in dieser Form arbeitet KKleinste() so, wie Du es als Programmierer beabsichtigt hast.

@Profils: Müsste man also im Bugtraq melden.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 22.01.2014, 21:20    Titel: Antworten mit Zitat

Zitat:
@Profils: Müsste man also im Bugtraq melden.

Was genau erwartest du, soll hier passieren?

Was du hier machst, ist überhaupt erst seit fbc 0.90 möglich und hat vorher einen Fehler geworfen. Der Ausdruck wird nun zur Compile-Zeit ausgewertet, vorher konnte er nichts damit anfangen.

Wenn du die Defaultwerte mit einem bestimmten Array mit statischer Größe belegst, wie soll sich der Defaultwert dann ändern? Nur weil der erste Parameter den gleichen Namen trägt, wie das auszuwertende Array weiter hinten, setzt er diese nicht gleich.

Der Compiler macht es sowieso besser, als ich es erwartet hätte. Das ist zusehen, sobald das Array dynamisch ist:
Code:

Dim As Single array() 'uninitialisiert -> LBOUND = 0, UBOUND = -1 !

Sub test(andererName() As Single, dStart As Integer = LBound(array), dEnde As Integer = UBound(array))
   Print "Defaultwerte:   ", dStart, dEnde
   Print "Aktuelle Werte: ", LBound(andererName), UBound(andererName)
End Sub

Print "---------------------"
Print "Vor REDIM"
Print "----------"
test(array())
Print "---------------------"

ReDim array(5 To 15)

Print "---------------------"
Print "Nach REDIM"
Print "----------"
test(array())
Print "---------------------"

Sleep

Er passt die Defaults an die geänderte Größe des Arrays an. Dieses Verhalten lässt mich nahelegen, dass das Konstrukt einen Pointer auf die Grenzwerte des Arrays hält und beim Aufruf der Methode den Wert aus dem Speicher zieht, was auch immer es gerade ist.

Die Defaults können aber auch wie erwartet überschrieben werden, indem man Werte beim Aufruf angibt. Das lässt sich testen, wenn man im oberen Code das hier macht:
Code:
test(array(), -5, -5)


Wenn du ihm also ein Array als Parameter übergibst, ist der Defaultwert der Methode weiterhin auf das namentlich definierte Array bezogen.

Man könnte es als Feature-Request ausgeben, aber ein Bug ist das nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 22.01.2014, 23:02    Titel: Antworten mit Zitat

MOD hat Folgendes geschrieben:
Code:

Dim As Single array() 'uninitialisiert -> LBOUND = 0, UBOUND = -1 !

Sub test(andererName() As Single, dStart As Integer = LBound(array), dEnde As Integer = UBound(array))
   Print "Defaultwerte:   ", dStart, dEnde
   Print "Aktuelle Werte: ", LBound(andererName), UBound(andererName)
End Sub

Du hast das Problem noch nicht ganz verstanden: Gehe vom Fall aus, dass Sub test() ein wiederverwendbares separates Modul geben soll -> dieses darf nichts von array() wissen, sondern darf nur andererName() kennen! Bug/Feuture-Request: Dein "Dim array()" soll also nicht mehr nötig sein, sondern Variablen müssten bereits während der Parametersignatur-Auswertung bekannt sein, also als
Code:
Sub test(andererName() As Single, dStart As Integer = LBound(andererName), dEnde As Integer = UBound(andererName())

formulierbar.

Dein eigenes Beispiel vorher passend erweitert:
Code:
Dim As Single array() 'uninitialisiert -> LBOUND = 0, UBOUND = -1 !
Dim As Single array2()
Dim As Single array3()

Sub test(andererName() As Single, dStart As Integer = LBound(array), dEnde As Integer = UBound(array))
   If dStart <> LBound(andererName) Or dEnde <> UBound(andererName) Then
       Color 12
   EndIf
   Print "Defaultwerte:   ", dStart, dEnde
   Color 15
   Print "Aktuelle Werte: ", LBound(andererName), UBound(andererName)
End Sub

ScreenRes 640, 480
Width 80, 30

Print "---------------------"
Print "Vor REDIM"
Print "----------"
test(array())
test(array2())
test(array3())
Print "---------------------"

ReDim array(5 To 15)
ReDim array2(7 To 27)
ReDim array3(19 To 38)

Print "---------------------"
Print "Nach REDIM"
Print "----------"
test(array())
test(array2())
test(array3())
Print "---------------------"

Sleep

Beachte also die rot angezeigten Fälle!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 22.01.2014, 23:26    Titel: Antworten mit Zitat

Genau so habe ich es verstanden, aber es passiert halt das, was ich bei dem Code erwarten würde, nicht das, was du gerne hättest. Stell es doch als Feature Request auf sf.net.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 22.01.2014, 23:29    Titel: Antworten mit Zitat

Ich würde ja so oder so als Standardwerte (z. B.) 0 und -1 übergeben (statt der Grenzen irgend eines Arrays) und in diesem Fall innerhalb der SUB die Werte der aktuellen Arraygrenzen verwenden. Dass der Benutzer absichtlich den Bereich von 0 bis -1 ausgeben will, ist sowieso nicht sinnvoll einsetzbar und sollte daher in allen "normalen" Fällen keine Konflikte hervorrufen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 23.01.2014, 00:38    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
...Ein Array in der Parameterliste einer Function wird immer ByVal übergeben, d.h., die Function bekommt nicht die Werte selbst übergeben, sondern nur deren Speicheradresse und greift daher immer auf das echte Array außerhalb der Function zu, so, als ob du es global (also Shared) dimensioniert hättest. ...


Bin gerade hierüber gestolpert...
Entweder ich hab's falsch verstanden, oder du hast es gerade genau verkehrt herum erläutert zwinkern
Mit BYVAL wird m.W. eine Kopie des ursprünglichen Wertes übergeben; Änderungen des übergebenen Parameters in der Subroutine ändern NICHT den ursprünglichen Wert. Mit BYREF wird ein Zeiger übergeben, Änderungen in der Subroutine ändern daher auch den ursprünglichen Wert.
Und Array werden (wie UDTs und Strings) werden immer per BYREF übergeben.

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 23.01.2014, 08:22    Titel: Antworten mit Zitat

@TimesChange:
Au ha! - Du hast natürlich Recht. peinlich Dabei habe ich den Text dreimal korrekturgelesen! verlegen Natürlich muß es ByRef heissen. Ich habe es auch schon verbessert (falls sich jemand wundert, worüber du dich hier beschwerst). Danke für den Hinweis, ich hoffe, mir ist jetzt niemand böse.

@Mücke:
Zitat:
Variablen werden immer als BYREF übergeben
Das stimmt so nicht. Variablen in der Parameterliste werden standardmäßig ByVal übergeben. Du kannst das dazuschreiben oder auch nicht. Wenn du eine Variable ByRef übergeben willst, mußt du das angeben. Eine Ausnahme sind Arrays, die immer und nur ByRef übergeben werden. Und weil ByVal hier gar nicht möglich ist, darf hier weder das eine noch das andere angegeben werden. Ansonsten hast du alles richtig verstanden.

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: 23.01.2014, 12:01    Titel: Antworten mit Zitat

ups das meinte ich eigentlich.

OK, ich dachte jedoch auch das ich bei einem Array das Überschreiben mit einem ByVal verhindern kann, Ok was dazu gelernt.
Danke.
Nach oben
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 23.01.2014, 15:12    Titel: Antworten mit Zitat

Muecke hat Folgendes geschrieben:
ich dachte jedoch auch das ich bei einem Array das Überschreiben mit einem ByVal verhindern kann

Geht nicht auf diese Weise - aber siehe dazu http://www.freebasic-portal.de/befehlsreferenz/const-klausel-636.html (Syntax A)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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
Seite 3 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