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:

Frage Menü Aufbau
Gehe zu Seite Zurück  1, 2, 3, 4  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
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 01.08.2015, 17:54    Titel: Antworten mit Zitat

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

von daher sei beruhig, hier helfen eigendlich alle gern.
wer, wie, was .... wer nich frag bleibt dumm. zwinkern

salute

PS: genau so meinte ich das lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2015, 21:42    Titel: Antworten mit Zitat

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. lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 02.08.2015, 12:46    Titel: Antworten mit Zitat

Also ich liege gerade am Strand und habe das Buch qbasic vor mir. Es Lässt mich keine Ruhe lächeln. 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

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

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 lächeln ).
_________________
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
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 03.08.2015, 12:14    Titel: Antworten mit Zitat

Das ja Super... Besten Dank für die Aufklärung lächeln
Dann kann ich langsam anfangen mein Programm zu vervollständigen lächeln

Danke an alle für eure Mithilfe ... Vll kommen da noch eins zwei Fragen x10 grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 12.08.2015, 17:07    Titel: Antworten mit Zitat

Moin Jungs...

schnelle Frage, und vll könnt ihr mir auch schnell helfen lächeln

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



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 12.08.2015, 18:00    Titel: Antworten mit Zitat

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 zwinkern

salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 12.08.2015, 21:14    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

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

@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. lächeln
_________________
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
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 13.08.2015, 08:21    Titel: Antworten mit Zitat

Hey ihr drei Profis lächeln

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 zwinkern
aber konnte mich zu diesem Zeitpunkt nicht dran erinnern das es im Buch stand
durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 13.08.2015, 08:39    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 13.08.2015, 08:59    Titel: Antworten mit 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 ....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.08.2015, 10:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 13.08.2015, 16:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 13.08.2015, 19:08    Titel: Antworten mit Zitat

Ich find den Fehler einfach nicht traurig
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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 13.08.2015, 19:11    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 13.08.2015, 19:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 13.08.2015, 19:22    Titel: Antworten mit Zitat

Matze83 hat Folgendes geschrieben:
Ich find den Fehler einfach nicht traurig
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. traurig
_________________
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
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 13.08.2015, 19:35    Titel: Antworten mit Zitat

sorry aber was ist der code tag ??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.08.2015, 19:44    Titel: Antworten mit Zitat

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
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, 4  Weiter
Seite 2 von 4

 
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