|
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 |
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 22.09.2014, 20:05 Titel: Programmveränderungen ohne Zutun |
|
|
Moin Gemeinde!
Hab' mir heute ein kleines Progrämmchen geschrieben, das auch recht fleißig arbeitete.
Ich wollte dann noch einen Zusatzfunktion einbauen. Das war nicht viel. Vom Grundsatz her war das nur eine Gosub...return Geschichte. gelang mir acuh flüssig und: Das Programm rechnete jetzt nur noch Blödsinn! Es lief zwar alles, aber die Werte waren völlig falsch! Selbst als ich die Einfügungen rauslöschte und auf Neustart ging: dasselbe Ergebniss. Kurzerhand hab' ich den Rechenkern rauskopiert und in eine neues Programm rein: Da lief es wieder wie zuvor!
Was ist da geschehen?
Sind die Programmzeilen, die ich auf dem Bildschirm sehe, gar nicht das Programm?
Manchmal verschwinden auch Zeilen bei copy und paste. Hat das damit zu tun?
grüsse Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 22.09.2014, 20:55 Titel: |
|
|
Genau sowas passiert leicht, wenn man gosub/return statt Prozeduren nutzt. (sub bzw. function). Du wirst irgendwo in deinem Programm eine Variable doppelt verwenden. Das würde nicht passieren, wenn du unserer Empfehlung folgen würdest. Dann könntest du lokale Variablen nutzen und alles was von außen kommt nicht verändert mit ByVal Parametern bzw. was geändert werden soll mit Byref übergeben.
In qbasic wird standardmäßig als byref übergeben. das Byval schlüsselwort gibt es dort nicht, das gibt es erst ab Quickbasic 4.5. Allerdings kann man beim Aufruf der Prozedur mit hilfe von klammern eine Kopie einer Variablen übergeben also indirekt Byval.
Der große Unterschied liegt darin, dass du mit den Klammern beim jedem Aufruf aufpassen musst, wie du denn die Parameter übergibst. Mit dem ByVAL und ByREF oder in FB CONST Schlüsselwörtern bzw. Konzept kannst du das bequem einmal Zentral in der Prozedur Definition erldeigen, was deutlich Fehlerunanfälliger ist.
Beispiel für den QBASIC 1.1 Interpreter:
Code: |
DECLARE SUB AddiereABCSpeichereInD (a AS INTEGER, b AS INTEGER, c AS INTEGER, d AS INTEGER)
DIM bla AS INTEGER
DIM blub AS INTEGER
DIM brrr AS INTEGER
DIM ergebnis AS INTEGER
CLS
bla = 1
blub = 2
brrr = 3
ergebnis = 4
'alles per BYREF
AddiereABCSpeichereInD bla, blub, brrr, ergebnis
PRINT bla, blub, brrr, ergebnis
bla = 1
blub = 2
brrr = 3
ergebnis = 4
'Alles in klammern BYVAL
AddiereABCSpeichereInD (bla), (blub), (brrr), ergebnis
PRINT bla, blub, brrr, ergebnis
SUB AddiereABCSpeichereInD (a AS INTEGER, b AS INTEGER, c AS INTEGER, d AS INTEGER)
d = a + b + c
a = 10
b = 20
c = 30
END SUB
|
|
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 22.09.2014, 21:06 Titel: |
|
|
Das kommt davon wenn man GOSUB anstatt SUB/FUNCTION und QBasic anstatt FreeBasic einsetzt.
Nein, im Ernst - da GOSUB keinen neuen Scope (Kontext) erzeugt kann es leicht sein dass durch das Programm drumherum die Funktion quasi "gestört" wird. Die Empfehlung SUB/FUNCTION stattdessen zu verwenden kommt ja nicht von irgendwoher.
Das Zeilen beim copy/paste verwinden ist seltsam (Bedienungsfehler?) - welche IDE verwendest du? _________________ 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: 22.09.2014, 22:41 Titel: |
|
|
Ich schließe mich der Argumentation meiner Vorgänger an.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 23.09.2014, 01:13 Titel: |
|
|
Ich hatte gerade so richtig Spaß nach über 10 Jahren wieder etwas in QBasic zu proggen und ich muss sagen ich vermisse so viele Dinge. Aber letztlich habe ich wohl ein gutes Beispiel erstellt, wie man auch in so einer alten beschränkten Umgebung wie QBasic übersichtlich, fast objectorientiert programmieren kann. Ich habe nichts kommentiert, weil der code eigentlich keinen echten Sinn hat, außer zu veranschaulichen wie man types / subs / function und "arrays mit for schleifen" nutzt.
Nils ich glaube wenn du dieses Beispiel verstanden hast, also richtig Verstanden, indem du es vielleicht sogar weiterspinnst mit weiteren Vector und Vector Array Operationen, willst du ganz von alleine zu einer Objektorientierteren Sprache wechseln. FreeBasic hat soviel zu bieten. aber selbst wenn du bei QB bleibst, nutze wenigstens die Möglichkeiten, die es zu bieten hat.
Code: | DECLARE SUB V3D.PrintArray (v() AS ANY)
DECLARE SUB V3D.ADD (v1 AS ANY, v2 AS ANY, r AS ANY)
DECLARE SUB V3D.InitArray (v() AS ANY)
DECLARE FUNCTION V3D.STR$ (v AS ANY)
TYPE Vector3D
x AS DOUBLE
y AS DOUBLE
z AS DOUBLE
END TYPE
CLS
DIM v1 AS Vector3D
DIM v2 AS Vector3D
v1.x = 10
v1.y = 20
v1.z = 3
v2 = v1
v2.z = 0
PRINT V3D.STR$(v1)
PRINT V3D.STR$(v2)
V3D.ADD v1, v2, v2
PRINT V3D.STR$(v2)
DIM v(1 TO 4) AS Vector3D
V3D.InitArray v()
V3D.PrintArray v()
DIM r AS Vector3D
FOR i% = LBOUND(v) TO UBOUND(v)
V3D.ADD r, v(i%), r
PRINT i%, V3D.STR(r)
NEXT i%
SUB V3D.ADD (v1 AS Vector3D, v2 AS Vector3D, r AS Vector3D)
r.x = v1.x + v2.x
r.y = v1.y + v2.y
r.z = v1.z + v2.z
END SUB
SUB V3D.InitArray (v() AS Vector3D)
RANDOMIZE TIMER
FOR i% = LBOUND(v) TO UBOUND(v)
v(i%).x = RND * RND * i%
v(i%).y = RND * RND * i%
v(i%).z = RND * RND * i%
NEXT i%
END SUB
SUB V3D.PrintArray (v() AS Vector3D)
FOR i% = LBOUND(v) TO UBOUND(v)
PRINT V3D.STR$(v(i%))
NEXT i%
END SUB
FUNCTION V3D.STR$ (v AS Vector3D)
V3D.STR$ = STR$(v.x) + "," + STR$(v.y) + "," + STR$(v.z)
END FUNCTION
|
|
|
Nach oben |
|
|
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 23.09.2014, 10:33 Titel: |
|
|
@ RockTheShock:
Nun, an die Doppelbelegung einer Variablen denke ich doch zu allererst. Das isses nich!
@ St_W:
Schön wenn man verstanden wird!
q-p: Nein, kein Bedienungsfehler! Die kopierte Seite verschwindet, was ja nur die ausgeschnittene dürfte. Mit der Zeit habe ich gelernt das zu ignorieren, denn später ist die wieder da. Man kann das auch erzwingen, wenn man speichert.
Nur falls gosub...return tatsächlich irgendwelchen Mist macht, sollte das doch rundherum bekannt sein.
@ RockTheShock:
Deinen Code schau ich mir an. Sobald ich mein gestohlenes Programm wieder hergestellt habe. ZZ sieht das so aus, dass ich den Algorithmus zigfach überprüft habe und keinen Fehler finde. Vllt. gibt mir das geschilderte Problem (das geschah nämlich in einem Programmteil, das ich zur Frustbekämpfung in ein eigenes Programm überführte, den Fingerwink zur Lösung.
Gib mir doch bitte mal einen genauen link auf ein Programmpaket -sozusagen ein sorglos Rundumpaket- wo ich mit einem Download alles habe, was ich zum programmieren in FB brauche! Das würde meine Entscheidung für FB sehr erleichtern. ZZ sehe ich da nämlich kein Land: Downloads über Downloads.
p.s.: Da fällt mir noch ein: Ich hatte zwei variablen dimensioniert sie hießen ll und lll. Das hat QB akzeptiert und im Programmlauf korrekt mit gearbeitet. Im Laufe der weiteren Programmierung fügte ich nur eine Leerzeile ein und QB meckerte was von Variable bereits dimensioniert. Ich bekam das nicht mehr weg. Ist das nicht merksam?
grüsse aus der besonnten Stadt am vielen Wasser
Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
|
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 23.09.2014, 20:04 Titel: |
|
|
Hi RockTheShock!
Und welche IDE? Da sind ja ein paar Schätzchen im Angebot!
grüsse
Nils, der die Qual hat weil die Wahl _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 23.09.2014, 20:26 Titel: |
|
|
Ich verwende unter Windows meist FBedit habe die anderen auch schon benutzt. wxFBE sieht aber auch sehr gut aus. Unter Linux nutze ich Geany.
Ich würde an deiner Stelle diese 3 einfach mal kurz antesten. Es ist auch geschmacksache |
|
Nach oben |
|
|
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 23.09.2014, 20:32 Titel: |
|
|
Thanks a lot!
nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
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.
|
|