|
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 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 01.08.2015, 17:54 Titel: |
|
|
ach Matze ich glaub die meisten hier schuetteln den kopp nur ueber sich
selbst, weil se hn kleinen bug nich finden oder nen tipp fehler uebersehn
ham. zumindest gehts mir oefter so.
von daher sei beruhig, hier helfen eigendlich alle gern.
wer, wie, was .... wer nich frag bleibt dumm.
salute
PS: genau so meinte ich das |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 01.08.2015, 21:42 Titel: |
|
|
Matze83 hat Folgendes geschrieben: | So wie in deinem Beispiel Case 1 werde ich mein Programmierung auch durchlaufen lassen | Ja, das scheint mir auch am sinnvollsten. Je klarer ein Programm strukturiert ist, um so übersichtlicher ist es, und um so leichter lassen sich auch Fehler finden.
Zitat: | Wahrscheinlich schüttelt ihr oft den Kopf und denkt, ....,...., .... | Nein, tun wir nicht. Es ist noch kein Meister von Himmel gefallen, auch nicht beim Programmieren.
Zitat: | Hätte halt gedacht, das die Variablen im SUb / Function die ich im Hauptprogramm nutze, genommen werden. | Dazu habe ich noch ein kleines Demo, warum es sinnvoll ist, daß jede Prozedur ihren eigenen Adressbereich (engl.: Scope) bekommt:
Stell dir vor, du arbeitest nicht alleine an einem Programm, sondern ihr bekommt die Aufgabe, mit der ganzen Klasse einen technisch-wissenschaftlichen Taschenrechner zu programmieren, wobei nur die vier Grundrechenarten verwendet werden dürfen. Dabei bekommt jeder aus der Klasse eine Rechenfunktion zugeteilt (also z.B. Sinus, Quadratwurzel, Fakultät usw.), und einer bekommt die Aufgabe, ein Hauptprogramm zu erstellen, mit dem alle diese Rechenfunktionen getestet werden können. Nehmen wir nun weiter an, der Hauptprogrammschreiber und der Autor der Quadratwurzelfunktion kommen beide auf die naheliegende Idee, eine Laufvariable mit dem Namen i% zu verwenden: Code: | ' Beispiel zur Verwendung lokaler vs. globaler Variablen in Prozeduren
Declare Function wurzel#(wert#)
Dim w# ' LOKAL
Dim i% ' LOKAL
'Dim Shared w# ' GLOBAL
'Dim Shared i% ' GLOBAL
'Dim shared ze# ' GLOBAL
For i% = 1 To 10
w# = i%
Print "Die Wurzel von ";i%;"ist ";wurzel#(w#)
Next
Sleep
Function wurzel#(wert#)
'Berechnung der Quadratwurzel nach dem Heron - Verfahren
Dim i% ' LOKAL
Dim ze# ' LOKAL
ze# = (wert# + 1) / 2 'startwert
For i% = 1 To 3
ze# = (ze# + (wert# / ze#)) / 2
Next
wurzel# = ze#
End Function
| Mit lokalen Variablen kein Problem. Und jetzt mach alle Variablen global, indem du alle mit LOKAL gekennzeichneten Zeilen auskommentierst und und die Kommentarzeichen vor allen mit GLOBAL gekennzeichneten Zeilen entfernst, und sieh dir an, was dann passiert.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 02.08.2015, 12:46 Titel: |
|
|
Also ich liege gerade am Strand und habe das Buch qbasic vor mir. Es Lässt mich keine Ruhe . Und da stand in einem Teil so ein ähnliches Beispiel wie deins oben.
Lass mich raten Shared = geteilt sprich die dim Variablen werden nicht lokal sondern zu global und wenn du eine sub / funtion hast werden die Variablen aus dim Shared genutzt ????? Wenn diese im dim Shared stehen ? Ist jetzt eine Vermutung ohne getestet zu haben |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 02.08.2015, 17:20 Titel: |
|
|
Eine mit 'Dim Shared' deklarierte Variable ist im ganzen Programm verfügbar, es sei denn, du deklarierst innerhalb einer Prozedur eine Variable gleichen Namens. Dann ist diese Variable innerhalb der Sub/Function, in der sie deklariert wurde, lokal.
'Dim Shared' innerhalb einer Prozedur ist nicht erlaubt und gibt eine Fehlermeldung.
Gruß
grindstone
(Und hol dir keinen Sonnenbrand ). _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 03.08.2015, 12:14 Titel: |
|
|
Das ja Super... Besten Dank für die Aufklärung
Dann kann ich langsam anfangen mein Programm zu vervollständigen
Danke an alle für eure Mithilfe ... Vll kommen da noch eins zwei Fragen x10 |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 12.08.2015, 17:07 Titel: |
|
|
Moin Jungs...
schnelle Frage, und vll könnt ihr mir auch schnell helfen
Ich möchte eine IF Bedingung stellen
Code: | IF b# AND d# = 0 THEN
LOCATE 14, 10
PRINT " Text1 "
ELSE
LOCATE 14, 10
PRINT " Text2 "
END IF |
Sprich wenn b# und d# gleich 0 sind soll Text1 da stehen.
Jetzt ist es aber so, wenn b und d gleich 0 sind wird mir Text 2 angezeigt. Wenn b# gleich 1 ist und d# gleich 0 ist, dann wird mir Text1 angegeben..
Korrios, wenn Ich in der IF Bedinung b# und d# vertausche also so hinschreibe
IF d# and b# = 0 then
und ich dann für b# gleich 0 und d# = 2 setze wird mir auch Text 1 angezeigt... Ich versteh nicht... Aus meiner Sicht wird nur die letzte Variable (als Bedingung ) genommen...
Besten Dank |
|
Nach oben |
|
|
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 12.08.2015, 18:00 Titel: |
|
|
moin Matze,
hier begeshst du einen groben fehler bei der if then abfrage.
if b and d=0 bedeutet soviel wie: wenn b<>0 and d = 0 dann.
ich denke du weist was zu tun ist
salute |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 12.08.2015, 21:14 Titel: |
|
|
Zitat: | ich denke du weist was zu tun ist |
So sicher bin ich da nicht.
AND startet einen bitweisen Vergleich. "b# AND d# = 0" bedeutet von der Reihenfolge "b# AND (d# = 0)". D. h., es wird geschaut, ob d# = 0 ist, und je nachdem "wahr" (-1) oder "falsch" (0) ausgewählt. Dieser Wert -1 oder 0 wird jetzt mit dem Wert b# verglichen. "irgendwas AND 0" ist immer 0, wogegen "irgendwas AND -1" nur 0 ist, wenn "irgendwas" 0 ist.
Du willst natürlich nicht mit dem Wert von b# vergleichen, sondern mit der Aussage, dass b# = 0 ist.
Zitat: | if b and d=0 bedeutet soviel wie: wenn b<>0 and d = 0 dann. |
Ist zwar richtig, aber auf der anderen Seite bedeutet "IF b AND d" nicht dasselbe wie "wenn b<>0 und d<>0". Nur noch so zur Ergänzung, um die Verwirrung etwas aufrecht zu erhalten. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 12.08.2015, 21:48 Titel: |
|
|
@Matze83:
Da bist du in eine typische Anfängerfalle getappt. Die mathematische Wirkungsweise von logischen Operatoren hat mit der Bedeutung der benutzten Begriffe im täglichen Sprachgebrauch nur sehr bedingt etwas zu tun.
In der Zeile
Code: | IF b# AND d# = 0 THEN | passiert folgendes: Zuerst wird das Ergebnis von d# = 0 gebildet (siehe dazu auch Referenz - Ausdrücke und Operatoren, --> Hierarchie der Operatoren). Das ist - da "=" hier als logischer Vergleichsoperator fungiert - 0 ("FALSE"), wenn d# <> 0 ist, und -1 ("TRUE") für d# = 0, wobei ein Wert von -1 bedeutet, daß in der Binärdarstellung alle Bits gesetzt sind, für QBasic also &B1111111111111111. Dieser Wert wird nun Bit für Bit mit dem (nach Integer geCASTeten) Inhalt von b# UND - verknüpft. Ist bei dem Ergebnis mindestens 1 Bit gesetzt (also Ergebnis <> 0), gilt die IF - Bedingung als erfüllt und Text1 wird ausgegeben.
Für das, was du möchtest, müsste die Zeile lauten: Code: | IF b# = 0 AND d# = 0 THEN | oder besser: Code: | IF (b# = 0) AND (d# = 0) THEN | Dann gibt es keine Zweifel, was gemeint ist.
Gruß
grindstone
EDIT: Ich sehe gerade, daß nemored schneller war. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 13.08.2015, 08:21 Titel: |
|
|
Hey ihr drei Profis
Danke euch.. Ja jetzt habe ich das Thema auch im Buch unter logische Verknüpfungen gefunden.. Problem nur, mein Lehrer hat diese Verbindung so aufgeschrieben und gestern habe ich das mit einem Beispiel einer Funktion überprüft und das klappte gar nicht...
Aber habe es jetzt grob verstanden. bzw wie ich es richtig anwenden muss Es steht auch so im Buche drinne @grindstone
aber konnte mich zu diesem Zeitpunkt nicht dran erinnern das es im Buch stand
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 13.08.2015, 08:39 Titel: |
|
|
Übrigens: Code: | IF (b# OR d#) = 0 THEN | würde auch funktionieren.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 13.08.2015, 08:59 Titel: |
|
|
Ne ich brauch b und d als 0
so würde ja b oder d als 0 reichen ... wenn ich das jetzt richtig verstanden habe .... |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 13.08.2015, 10:10 Titel: |
|
|
Was man immer mit berücksichtigen muss ist, dass AND und OR keine logischen Operatoren sind, sondern binäre. Sie verhalten sich nur wie logische Operatoren, wenn es sich bei den Ausdrücken um die Werte -1 und 0 handelt.
Dazu habe ich übrigens schon was fertig:
http://users.freebasic-portal.de/nemored/buchBeginner/09_bedingungen.htm#kap9_2
Zitat: | Ne ich brauch b und d als 0
so würde ja b oder d als 0 reichen ... wenn ich das jetzt richtig verstanden habe .... |
Abgesehen davon, dass ich lieber keine Gleitkommazahlen binär verknüpfe. Aber "b OR d" ist tatsächlich nur dann 0, wenn sowohl bei b als auch bei d alle Bits 0 sind. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.08.2015, 16:58 Titel: |
|
|
Matze83 hat Folgendes geschrieben: | Ne ich brauch b und d als 0
so würde ja b oder d als 0 reichen ... wenn ich das jetzt richtig verstanden habe .... |
Wie schon erwähnt wurde, logische Operatoren haben teilweise wenig mit dem umgangssprachlichen und/oder zu tun.
"b OR d" heißt: Gehe durch alle Bits der Variablen b und d, und wenn ein Bit an einer Position gesetzt ist, setze es auch im Ergebnis.
Beispiel in Binärdarstellung:
Code: |
b = 0011
d = 0101
b OR d = 0111
|
Sprich, wenn (b OR d) = 0, dann weißt du, dass beide Variablen tatsächlich den Wert 0 haben.
Grundsätzlich sind logische Operationen auf Gleitkommawerten keine gute Idee, sauberer wäre die Verwendung von AndAlso und OrElse statt And und Or. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Zuletzt bearbeitet von Jojo am 13.08.2015, 19:15, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 13.08.2015, 19:08 Titel: |
|
|
Ich find den Fehler einfach nicht
Es wird nichts angezeigt..... Ist langer Tag gewesen... Vll bring ich was durcheiander und ihr seht da besser durch
Code: |
'Umschalten in den Grafikmodus
'
INPUT "Geben sie die gewünschte Intervallgrenze ein__"; lg!
SCREEN 12
WINDOW (-320, -240)-(320, 240)
'Koordinatenachsen zeichen in der Farbe gelb:
LINE (0, 240)-(0, -240), 14
LINE (-320, 0)-(320, 0), 14
FOR i% = 1 TO 100 STEP 1
LINE (i% * 310 / lg!, 3)-(i% * 310 / lg!, -4)
LINE (i% * -310 / lg!, 3)-(i% * -310 / lg!, -4)
LINE (-3, i% * 240 / g1!)-(4, i% * 240 / g1!)
LINE (-3, i% * -240 / g1!)-(4, i% * -240 / g1!)
NEXT i%
FOR x! = -320 TO 320 STEP 0.00001
y! = a# * x! ^ 3 + b# * x! ^ 2 + c# * x! + d#
PSET (x!, y!), 12
NEXT |
Zuletzt bearbeitet von Matze83 am 13.08.2015, 20:09, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.08.2015, 19:11 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Da bist du in eine typische Anfängerfalle getappt. Die mathematische Wirkungsweise von logischen Operatoren hat mit der Bedeutung der benutzten Begriffe im täglichen Sprachgebrauch nur sehr bedingt etwas zu tun. |
Grundproblem bei FreeBasic, welches sich von QB herkommt und hier ein Stück weit auch die Philosopie von C/C++ übernommen hat: Es existiert kein sauberer Datentyp Boolean! Oder anders herum: für Boolean müssen Integer herhalten, der Wert True wird durch eine Zahl <>0 dargestellt (typischerweise -1), False wird durch 0 dargestellt.
Wegen des fehlenden separaten Datentyps meckert der Compiler natürlich bei
Code: | ' Sinnlos-Beispiel
Dim As Integer a, b, c
a = ..
b = ..
c = ..
If a And b = c Then
...
End If |
überhaupt nicht. Dagegen bei Pascal und Ada führt so etwas wie
Code: | ' Dies wird nicht akzeptiert!
var a, b, c : integer;
a := ..;
b := ..;
c := ..;
if a AND b = c then begin
..
end; |
sofort zu einem Compilerfehler; hier muss ich es entweder klar als
Code: | ' Syntaktisch und semantisch korrekt
var a, b, c : integer;
a := ..;
b := ..;
c := ..;
if a <> 0 AND b = c then begin
..
end; |
oder
Code: | ' Syntaktisch und semantisch ebenfalls korrekt
var a : boolean;
var b, c : integer;
a := ..;
b := ..;
c := ..;
if a AND b = c then begin
..
end; |
umformuliert werden (=der Programmierer muss bewusst überlegen, ob a nun einen Wahrheitswert speichert oder eine gewöhnliche Zahl).
Vom Konzept her hätte aber FB eine gute Grundlage dank des "fbc -lang"-Parameters, z.B. eine strikte Sprachvariante in einer künftigen Compilerversion bereitstellen, welche Boolean kennt. Müsste sich dann konseqenterweise durch den kompletten Befehlssatz hindurchziehen, z.B. eof() (Dateiende erreicht?) müsste seinen Rückgabewert als Boolean liefern. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.08.2015, 19:16 Titel: |
|
|
Das ist nur so halbrichtig, schließlich bekommt FreeBASIC ja momentan Booleans spendiert, und auch C++ hat einen echten booleschen Datentyp. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 13.08.2015, 19:22 Titel: |
|
|
Matze83 hat Folgendes geschrieben: | Ich find den Fehler einfach nicht
Es wird nichts angezeigt..... Ist langer Tag gewesen... Vll bring ich was durcheiander und ihr seht da besser durch |
Nimm mal in der letzten Schleife eine größere Schrittweite (z. B. 0.001 statt 0.00001); ich halte es für möglich, dass darin das Problem liegt.
Und bittebittebitte verwende doch mal den Code-Tag; so ist das einfach nur schwer lesbar. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 13.08.2015, 19:35 Titel: |
|
|
sorry aber was ist der code tag ?? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 13.08.2015, 19:44 Titel: |
|
|
Wenn du den Text schreibst, hast du über dem Eingabefeld ein paar Buttons, z. B. B, i, u, Quote, Code, List usw. Code ist zum Eingeben von Quellcode gedacht.
Das sieht dann am Ende so aus wie diese Boxen, die bei dreal (und all den anderen) auftauchen. _________________ 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 13.08.2015, 19:45, insgesamt einmal bearbeitet |
|
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.
|
|