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:

Probleme beim Einsatz mit FbEdit 1.0.7.6c?
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2013, 18:01    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Zitat:
Quellcode der die Bilder lädt, kein Fehler!

Ich bin mir da mit den Speichergrößen nicht so ganz sicher. Ein 32bit-Imagepuffer der Größe 100x100 Pixel ist laut IMAGEINFO 40'004 Byte groß. Deine Bilddateien sind laut meiner Anzeige aber 40'009 Byte groß (ich frage mich übrigens nach wie vor, warum du dem alten QBASIC-Format anhängst anstatt einfach Bitmaps einzubinden).


Weil ich die Bilddateien immer verschlüsseln will! So das man auf den ersten Blick nicht gleich sieht, um was es sich für Bilddateien handelt bzw. was es für Bilder sind!

Zitat:
Niemand ist perfekt, auch nicht du.

Das stimmt! Auch ich bin nicht perfekt!
Ich kann ja mal versuchen, das mit den Bildern umzustellen? Vielleicht hilft es? An so was denkt man natürlich nicht! Wenn es wirklich mehr Byte sind, wäre das natürlich schlecht! Aber wie kommen die 5 Byte mehr zustande? Immerhin habe ich diese Routine irgendwo mal unter Freebasic gefunden. Vielleicht war es auch bei Qbasic? Kann mich da nicht mehr so genau dran erinnern!

Welche Möglichkeiten gibt es sonst noch, Bilder zu verschlüsseln?

Das wäre dann schon erstaunlich, wenn das ganze wegen der Bilder nicht korrekt funktioniert! Denkbar wäre es! Einen Versuch ist es immerhin wert!

Ein Neuanfang würde in dem Fall nichts bringen! Da habt ihr schon recht. Noch dazu, wenn die Bilder die Ursache für den Fehler sind. Da hilft auch ein Neuanfang nicht!

Möglich wäre auch, dass Freebasic ab einer bestimmten Zeilenanzahl, das Programm nicht mehr korrekt verarbeiten kann. Wobei ihr aber schon mal erwähnt habt, dass sogar 10000 Zeilen kein Problem darstellt!

Nun denn! Versuch Nummer xxx!
Schließlich lernt man aus Fehlern! lachen

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 16.07.2013, 19:28    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Möglich wäre auch, dass Freebasic ab einer bestimmten Zeilenanzahl, das Programm nicht mehr korrekt verarbeiten kann.


Die Limits, die sich aus dem 32-Bit-Speichermodell ergeben, wirst du beim Compilieren wohl nie erreichen. Ein paar tausend Zeilen Code sind da quasi "nichts".

Schau dir zum Beispiel einmal an, wie viel Code eingebunden wird, wenn du ein einfaches
Code:
#include "windows.bi"

machst. Dazu kannst du mal die windows.bi und alle darin verwiesenen Header rekursiv zusammenzählen.

[Ironie-Modus]
Aber was erzähl ich da. Der Compiler ist natürlich so konstruiert, bei Programmen von ALWIM ab ein paar hundert Zeilen dafür zu sorgen, dass die Spielkarten durcheinander kommen. Schließlich arbeitet eine CPU intern mit Kartenstapeln (daher auch die Bezeichnung "Einsteckkarten" bei PCI-Express und so). Jedenfalls, nach ein paar hundert Zeilen BASIC-Code denkt sich der Compiler "Mensch, wer soll das alles lesen?!" und greift verärgert ins Spielgeschehen ein! Machmal gibt der Compiler dann bei Multiplayer-Games auch dem Gegner Tipps oder schmuggelt zusätzliche Joker-Karten ins Spiel. Spielkarten-Verwechselungen zu den häufigsten Fehlfunktionen von Compilern und Interpretern. Manchmal enthielten sogar ganze CPU-Baureihen kartenspielbezogene Fehler, wie etwa den FDIV-Bug (FDIV = FreeCell-bezogenes Damen-Interpretations-Versagen). Einen Fehler in ALWIMs Programm, z. B. falsche Array-Indizes, zu kleine Speicherreservierungen, Probleme mit Pointerarithmetik, ... würde ich für absolut ausgeschlossen halten.
Probleme mit selbst-programmierten Kartenspielen sind, das sagt die Erfahrung, in aller Regel auf den Compiler oder sogar die PC-Hardware zurückzuführen (CPU-Bugs, spielkartenbezogene Design-Fehler des Mainboards, ...). Manchmal sogar auf das Stromnetz. Wenn die 50 Hz im Stromnetz nicht exakt gleichmäßig geliefert werden, werden beim Ausgeben von Karten schon mal welche doppelt ausgegeben oder Skat-Computergegner verzählen sich gar beim Reizen.
[/Ironie-Modus]
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2013, 23:24    Titel: Antworten mit Zitat

Wäre es eine (gute) Lösung, wenn ich die Werte der Variable in eine externe Datei speichere und an entsprechender Stelle wieder lade?

Gespeichert werden die Werte in die Variable korrekt. Zumindest stehen die in der Textdatei an richtiger Stelle und richtig drin.
Da die Werte richtig gespeichert werden und beim Computerteil richtig überprüft werden, dürfte der eigentlich keine falsche Karte nehmen.

Es könnte ja theoretisch möglich sein, dass ein anderes Computerprogramm dafür verantwortlich ist, dass der Computer Karten nimmt, die schon aus dem Spiel sind! Da meine ich jetzt nicht Freebasic und die IDE! Demnach kann ich keine Chance haben, das Problem zu beheben! Ich weiß ja dann nicht mal welches Programm dafür verantwortlich ist.

Fehler finde ich so gut wie keinen mehr! Das mit den Bildern habe ich noch nicht getestet! Ich kann einfach noch nicht glauben, dass es daran liegt!

Müsste nicht -exx beim laden der Bilder anschlagen? Sind ja 5 Bytes unterschied laut einem User von euch?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 17.07.2013, 01:13, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 17.07.2013, 01:04    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Es könnte ja theoretisch möglich sein, dass ein anderes Computerprogramm dafür verantwortlich ist, dass der Computer Karten nimmt, die schon aus dem Spiel sind!

Autsch!
Jedes Programm hat auf einem modernen Betriebssystem seinen eigenen Speicherbereich und kann nicht ohne weiteres einfach im Speicher anderer Programme rumspielen. Wann siehst du endlich ein, dass der Fehler in deinem Code liegt?!

Zitat:
Wäre es eine (gute) Lösung, wenn ich die Werte der Variable in eine externe Datei speichere und an entsprechender Stelle wieder lade?

Damit lässt du allerhöchstens die Symptome (vielleicht) verschwinden, nicht aber das eigentliche Problem. Plus, andere Programme könnten ja in deiner Datei rumschreiben... weinen
_________________
» 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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 17.07.2013, 01:18    Titel: Antworten mit Zitat

Zitat:
Wann siehst du endlich ein, dass der Fehler in deinem Code liegt?!

Ich will es ja einsehen, bloß wo ist dann der Fehler? Ich finde nämlich ihn nicht!

Bei einem weiteren Test, konnte ich herausfinden, dass der Wert in der Variable gezKarte(i) nicht verändert wird! Kurz vor der Auswahl einer Zufallszahl ist der Wert der Variable immer noch der gleiche!

Code:
DO
    DO
        KC1 = INT(RND * 64) + 1
    LOOP WHILE gezKarte(KC1) = - 1
    DO
        KC2 = INT(RND * 64) + 1
    LOOP WHILE gezKarte(KC2) = - 1
LOOP WHILE KC1 = KC2


Nach obigen Quellcode müsste nach meiner Überlegung keine Karte genommen werden, die schon aus dem Spiel ist!
Hm? Vielleicht doch ein Programmierfehler meinerseits im Quellcode?
Kann es sein, dass die Zufallszahl weiter unten nochmal irrtümlich verändert wird? Nur frage ich mich dann, wieso das dann bei Version 1.9 funktioniert?
Das gibt mir jetzt mehr als ein Rätsel auf? Möglicherweise doch ein Flüchtigkeitsfehler von Version 1.9 zur Version 2? Gefunden habe ich bisher aber keinen? Und ich verdächtige die IDE? Kopf schütteln
Jetzt geht es mir schon so, wie damals Hape Kerkeling! Der wusste auch nicht was los war! Publikum gab Applause an Stellen wo es keinen Applause hätte geben sollen. Oder lachte an Stellen wo überhaupt nichts Witzig war!

Edit:
Habe den Fehler wahrscheinlich jetzt gefunden!

Code:
LOOP WHILE gezKarte(KC1) = - 1

True speichert doch als -1 wenn ich mich nicht irre? beim Testen fiel mir aber auf, dass der Wert 1 ist??? Der Wert wird falsch gespeichert? Version 1.9 hat bei meinen Tests funktioniert! Wie ist das möglich??? An wen liegt es?



Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 17.07.2013, 01:45    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Zitat:
Wann siehst du endlich ein, dass der Fehler in deinem Code liegt?!

Ich will es ja einsehen, bloß wo ist dann der Fehler? Ich finde nämlich ihn nicht!


bitte lass mich eines nochmal gaaaaanz deutlich formulieren:
wenn du einen Speicherzugriffsfehler hast, dann hat das KOMISCHE, UNVERSTAENDLICHE Effekte, die bei KLEINSTEN Aenderungen von denen man nicht glaubt, dass sie etwas bewirtken, nicht mehr auftreten koennen.

Bitte beantworte mir folgende Fragen:

1) Hast du komische, unerklaerliche Effekte?
2) Werden diese beeinflusst durch Aenderungen, die damit eigenltich garnichts zu tun haben duerften?
3) Hast du den Code, der fehlfunktioniert, genaustestens geprueft und bist du dir SICHER, dass er fehlerfrei ist?

Wenn das zutrifft, dann HAST du einen illegalen Speicherzugriff.
Nein, -exx faengt nicht alles ab.
Nein, das Programm stuerzt nicht automatisch bei illegalen Zugriffen ab.
Nein, mit -exx zu kompilieren, nur weil aus unerfindlichen Gruenden dann alles klappt ist KEINE Option.


Valgrinde dein Programm, oder finde ein vergleichbares Tool fuer Windows. Oder installiere Linux, vielleicht in eine VM, und lern damit klarzukommen.



Und weils so schoen ist, nochmal:

Unerklaerliche Effekte werden durch illegale Speicheroperationen verursacht. Das kann Array Index Out Of Bounds, ein zu kleiner Bildpuffer beim Laden, oder irgendwas was direkt oder indirekt mit Pointern zu tun hat (ZString Ptrs z.B.) sein. Es koennte sogar ein Stack Overflow, verursacht durch zu viele und zu grosze Variablen auf dem Stack, sein.
Was auch immer es ist, dieser Fehler ist hoechstwahrscheinlich nicht da, wo Dinge kaputtgehen sondern ganz woanders. In deinem Programm, nicht in einem fremden!

(Etwas Hintergrund: deine Arrays, Bildpuffer, Schleifenvariablen und sonstige Karten-Datenstrukturen liegen in einem gemeinsamen Arbeitsspeicher. Nebeneinander. In einer Reihenfolge, die der Compiler so festlegt, wie es ihm gerade passt. Wenn du mehr Daten in deinen Puffer schreibst, als reinpassen, dann schreibt das Programm eiskalt hinter den Puffer. Denn es weiss nicht, wie gross dieser Puffer ist. Es nimmt an "der ist schon ausreichend gross".
Damit ueberschreibst du andere Variablen (welche das sind, weisst du nicht, da der Compiler den Speicher so anordnen kann, wie ER will). Variablen, die moeglicherweise garnichts damit zu tun haben. Variablen, die in einer GANZ anderen Funktion benoetigt werden. Und dort dann zu Fehlfunktionen fuehren.)


Nochmal, zum memorieren: Speicherzugriffsfehler. Unerklaerliche Effekte, die Stelle, wo du den Fehler machst und die, in der Dinge kaputtgehen, haben nichts miteinander zu tun. Valgrind hilft. Rewrite hilft nicht. Debugging mit gdb hilft vielleicht. Valgrind hilft (fast) sicher!
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 17.07.2013, 02:06    Titel: Antworten mit Zitat

Ok mal schauen:

Zitat:
1) Hast du komische, unerklaerliche Effekte?

Ja, einen! Computer nimmt aus dem Spiel genommene Karten.

Zitat:
2) Werden diese beeinflusst durch Aenderungen, die damit eigenltich garnichts zu tun haben duerften?

???

Zitat:
3) Hast du den Code, der fehlfunktioniert, genaustestens geprueft und bist du dir SICHER, dass er fehlerfrei ist?

Überprüft habe ich beide Quellcodes! Version 1.9 sowie Version 2! Sie sind fehlerfrei! Von der Theorie her müsste es funktionieren!

Zitat:
Valgrinde dein Programm, oder finde ein vergleichbares Tool fuer Windows. Oder installiere Linux, vielleicht in eine VM, und lern damit klarzukommen.

Linux will ich auf meinem Rechner nicht installieren! Da Valgrinde so wie ich das sehe, nur mit Linux läuft, fällt das weg. Ich habe zwar etwas für Windows gefunden, bringe es aber nicht zum laufen? Bisher nur Programme ohne Exedateien oder unvollständigen Dateien.

Ich würde ja gerne ein Programm oder Dateien oder was auch immer die mit Freebasic funktionieren zum laufen bringen.

Das ist das erste Mal, dass ich so ein Problem habe!
Eine Speicherverletzung wird wahrscheinlich vorliegen, jetzt wo ich den einen Test vorhin gemacht habe!

Edit:
komischerweise funktioniert es wenn ich mit einer älteren Compilerversion kompiliere?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 17.07.2013, 08:00    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Code:
LOOP WHILE gezKarte(KC1) = - 1

True speichert doch als -1 wenn ich mich nicht irre? beim Testen fiel mir aber auf, dass der Wert 1 ist??? Der Wert wird falsch gespeichert? Version 1.9 hat bei meinen Tests funktioniert! Wie ist das möglich??? An wen liegt es?

Da ich kein windows.bi-Experte bin, hilft mir nur ein Blick in die Datei windef.bi.
Code:
#ifndef TRUE
#define TRUE 1
#endif

Ich würde wirklich entweder die Werte TRUE und FALSE verwenden oder -1/1 und 0. Das zu mischen ist absolut sinnfrei.
_________________
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
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 17.07.2013, 10:28    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
ALWIM hat Folgendes geschrieben:
Code:
LOOP WHILE gezKarte(KC1) = - 1

True speichert doch als -1 wenn ich mich nicht irre? beim Testen fiel mir aber auf, dass der Wert 1 ist??? Der Wert wird falsch gespeichert? Version 1.9 hat bei meinen Tests funktioniert! Wie ist das möglich??? An wen liegt es?

Da ich kein windows.bi-Experte bin, hilft mir nur ein Blick in die Datei windef.bi.
Code:
#ifndef TRUE
#define TRUE 1
#endif

Ich würde wirklich entweder die Werte TRUE und FALSE verwenden oder -1/1 und 0. Das zu mischen ist absolut sinnfrei.


gnagnagna. Genaugenommen willst du innerhalb von Freebasic TRUE=-1 verwenden. Sonst geht NOT TRUE kaputt.

wenn true = -1, dann ist NOT TRUE = 0, also false.

wenn true =1, dann ist NOT TRUE = -2.
und IF NOT TRUE ... = IF -2 = IF -2 <> 0. und das wertet zu TRUE aus. fail.



Du koenntest eine virtuelle Maschine nutzen.
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 17.07.2013, 12:07    Titel: Antworten mit Zitat

Flo hat Folgendes geschrieben:
nemored hat Folgendes geschrieben:
ALWIM hat Folgendes geschrieben:
Code:
LOOP WHILE gezKarte(KC1) = - 1

True speichert doch als -1 wenn ich mich nicht irre? beim Testen fiel mir aber auf, dass der Wert 1 ist??? Der Wert wird falsch gespeichert? Version 1.9 hat bei meinen Tests funktioniert! Wie ist das möglich??? An wen liegt es?

Da ich kein windows.bi-Experte bin, hilft mir nur ein Blick in die Datei windef.bi.
Code:
#ifndef TRUE
#define TRUE 1
#endif

Ich würde wirklich entweder die Werte TRUE und FALSE verwenden oder -1/1 und 0. Das zu mischen ist absolut sinnfrei.


gnagnagna. Genaugenommen willst du innerhalb von Freebasic TRUE=-1 verwenden. Sonst geht NOT TRUE kaputt.

wenn true = -1, dann ist NOT TRUE = 0, also false.

wenn true =1, dann ist NOT TRUE = -2.
und IF NOT TRUE ... = IF -2 = IF -2 <> 0. und das wertet zu TRUE aus. fail.
Du koenntest eine virtuelle Maschine nutzen.


Das ist der Fehler!!!!

Windows.bi: True = 1
CONST FALSE=0, TRUE=Not FALSE: True = -1


Also ganz klar ein Denkfehler! Klar, dann nimmt dieser natürlich Karten die schon aus dem Spiel sind! Keine Speicherzugriffsverletzungen! Yahooo!!!! vor Freude klatschen
Hätte mich schon gewundert! Das Programm funktionierte! Ich programmiere die Windows.bi hinzu, es funktioniert nicht mehr. Klar ich prüfe immer noch auf -1! Ob das jetzt ein Fehler im Programm ist, oder ein Fehler der Windows.bi, darüber streiten sich die Geister! An so etwas denkt man natürlich nicht!

Ich könnte natürlich dann so schreiben:
Code:
LOOP WHILE gezKarte(KC1) <> 0

Man war das eine schwere Geburt!
Ich danke euch vielmals!

Jetzt kann ich wieder ruhig schlafen!

In der Version 1.9 wird keine Windows.bi aufgerufen! Deswegen geht es da!!!

Ich frage mich nur eins: Wusstet ihr es und wolltet es mir nicht erzählen?
Oder kam da wirklich keiner so schnell drauf? Ich kam ja auch nicht drauf. Erst als ich gemerkt habe, dass da als 1 gespeichert wird, habe ich mir so meine Gedanken gemacht, warum der als 1 speichert!

Ich will nicht als -1 speichern, sondern nur, dass das ganze funktioniert!

Ich entschuldige mich bei all denjenigen, denen ich Unannehmlichkeiten bereitet habe.

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 17.07.2013, 13:02    Titel: Antworten mit Zitat

Zitat:
Ob das jetzt ein Fehler im Programm ist, oder ein Fehler der Windows.bi, darüber streiten sich die Geister!

Nein, darüber streiten sich die Geister nicht. In der WinAPI ist TRUE wie invielen anderen Sprachen eben als 1 definiert, und wenn du 1 mit -1 vergleichst, ist das deine eigene Schuld und nicht die der Windows-Programmierer. Es ist ganz alleine dein Fehler! Man verwendet eben nicht an einer Stelle Zahlen und anderen stellen vordefinierte Konstanten (TRUE), wenn man eigentlich in beiden Fällen dasselbe meint.

Zitat:
An so etwas denkt man natürlich nicht!

Wer ist dieser "man"? Mit einem grafischen Debugger (Insight sollte wohl gut genug dafür sein), oder einfach nur mit ein paar PRINT-Statements im Programm hättest du durchaus auch rausfinden können, dass die Schleife nicht das gewünschte tut, bzw. dass andere Zahlen als erwartet in deinem Array stehen.
_________________
» 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
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 17.07.2013, 15:18    Titel: Antworten mit Zitat

Hallo, ich bin neu hier im Forum, hab mich zwar schon vor ein paar Tagen Angemeldet weil ich Fragen hatte, allerdings kam es nicht dazu weil sich die Fragen immer wieder in Luft aufgeloest haben. Es gibt ja enorm viele Informationen hier. Um
FreeBASIC kennen zu lehrnen hab ich mir aus dem Download
Bereich/Spiele das Spiel Sokoban(QBASIC) herruntergeladen um es in ein Windows-Programm um zu Basteln. Das hat (natuerlich nicht ohne Schwierigkeiten) geklappt, war als FB-Einsteiger auch zu frieden, bis
ich den Sound einbauen wollte. Kurz nach Tutorials bzw Beispielprogrammen geschaut und auch gefunden. Dafuer musste ich aber die WINDOWS.BI einbinden und bekam beim Kombilieren gleich die Meldung das False und True bereits Deklariert seien. Also habe
ich meine Konstanten wieder entfernt und beim Programm Starten eine ueberraschung erlebt, dass Programm Funktionierte naemlich nicht mehr. Gut, auf grund der beschriebenen Fehlermeldung wusste ich sofort wo ich
suchen musste und habs dann entsprechent geaendert,
Logisch korrekt ist die Definition TRUE = 1 aber nur in der
Digitalelektronik, nicht aber in einer Programmiersprache.

Warum ?
Weil logische Vergnuepfungen mit einer 1 als TRUE eben nicht Invertiert werden koennen, was aber der Fall sein muss. Angenommen es wird eine Variable beim Programmstart mit TRUE initialisiert und soll im laufe des Programms (aus welchen gruenden auch immer) einer anderen Variable als NOT zugewiesen werden, macht das Programm nicht mehr das was es soll.
Ich meine, das die 1 (Programmiertechnisch) im TRUE nichts zu suchen hat, dass ist aber nur meine Meinung.

Was das Programm Dubletten angeht, kann ich nur sagen das beide Versionen bei mir Fehlerfrei Funktionieren (komisch).

gruss elor
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 17.07.2013, 16:13    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:

Weil logische Vergnuepfungen mit einer 1 als TRUE eben nicht Invertiert werden koennen, was aber der Fall sein muss. Angenommen es wird eine Variable beim Programmstart mit TRUE initialisiert und soll im laufe des Programms (aus welchen gruenden auch immer) einer anderen Variable als NOT zugewiesen werden, macht das Programm nicht mehr das was es soll.
Ich meine, das die 1 (Programmiertechnisch) im TRUE nichts zu suchen hat, dass ist aber nur meine Meinung.

Das Problem ist hier einfach nur, dass BASIC nicht den Unterschied zwischen einem logischen NOT (! in C) und einem binären NOT (~ in C) kennt. C selbst hat auch keinen bool-Datentyp (wohl aber C++), aber dort und in vielen anderen Sprachen ist es üblich, TRUE mit 1 zu belegen und dann die logischen statt der binären Operatoren zu verwenden. Also Beispielsweise a && b (a ANDALSO b in FB) statt a & b (a AND b in FB). Oder eben a = !b statt a = ~b. Das funktioniert prima mit TRUE=1. Wenn man eben wie in FB kein logisches NOT hat, muss man TRUE=-1 setzen.
_________________
» 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: 4704
Wohnort: ~/

BeitragVerfasst am: 17.07.2013, 16:52    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Ich frage mich nur eins: Wusstet ihr es und wolltet es mir nicht erzählen?

Dass TRUE nicht notwendigerweise als -1 definiert wird, wusste ich schon, aber ganz ehrlich - ich habe neben meiner hauptsächlichen Tätigkeit, im knapp 1000 Zeilen umfassenden Quellcode anderer Forenmitgliedern nach Fehlern zu suchen, nebenbei auch ein bisschen beruflich zu tun und das ein oder andere eigene Programmierprojekt am Laufen. Vom Privatleben jetzt mal gar nicht zu sprechen. Tut mir Leid, dass ich versäumt habe zu schauen, ob du bei gezKarten() teilweise auf TRUE umsteigst und teilweise den Vergleich mit -1 beibehältst. Zumal du ja versichert hast, dass du gar nichts geändert hast, sondern es sich um den identischen Quellcode handelt.
_________________
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
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 17.07.2013, 17:08    Titel: Antworten mit Zitat

Zitat:
Wenn man eben wie in FB kein logisches NOT hat, muss man TRUE=-1 setzen.


Das ist, was ich eigentlich sagen wollte, also warum Definiert man eine Konstante die fuer Logische Operationen verwendet nicht von vorne herrein so, dass sie in der verwendeten Programmiersprache auch mit den eigenen Mitteln Funktioniert? Warscheinlich bin ich als Einsteiger noch nicht in der lage das zu verstehen.

gruss Elor
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 17.07.2013, 17:15    Titel: Antworten mit Zitat

Ich verwende ja TRUE und FALSE schon gleich überhaupt nicht, sondern nehme gleich -1 und 0. happy

Die Definition TRUE = 1 liegt sicherlich in der Kompatibilität zu C. Da du auch andere C-Bibliotheken verwenden kannst, würde ich da mit Problemen rechnen, wenn die mit unterschiedlichen TRUE-Werten arbeiten.
_________________
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: 17.07.2013, 19:31    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Das ist, was ich eigentlich sagen wollte, also warum Definiert man eine Konstante die fuer Logische Operationen verwendet nicht von vorne herrein so, dass sie in der verwendeten Programmiersprache auch mit den eigenen Mitteln Funktioniert? Warscheinlich bin ich als Einsteiger noch nicht in der lage das zu verstehen.

FreeBASIC selbst definiert TRUE und FALSE ja nicht. Die Definitionen aus der windows.bi müssen eben zum Rest der WinAPI kompatibel sein, da diverse WinAPI-Funktionen eben genau diese Werte erwarten oder zurückgeben. Wäre TRUE in der windows.bi -1, wären viele WinAPI-Beispiele nicht direkt auf FB portierbar.
_________________
» 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
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

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

Zitat:
Die Definition TRUE = 1 liegt sicherlich in der Kompatibilität zu C. Da du auch andere C-Bibliotheken verwenden kannst, würde ich da mit Problemen rechnen, wenn die mit unterschiedlichen TRUE-Werten arbeiten.


Das ergibt fuer mich kein sinn, denn die 1 ist ja wie wir wissen nicht Kompatibel zu FB. Anders sieht es bei C/C++ aus, da ist es egal ob True 1 ist oder -1. Gibt man mit !(not) True aus, kommt immer Null dabei raus. Da wir aber nicht die FB Entwickler sind, werden wir dieses problem leider nicht loesen koennen.

gruss Elor
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 957
Wohnort: Austria

BeitragVerfasst am: 17.07.2013, 19:48    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Das ergibt fuer mich kein sinn, denn die 1 ist ja wie wir wissen nicht Kompatibel zu FB. Anders sieht es bei C/C++ aus, da ist es egal ob True 1 ist oder -1. Gibt man mit !(not) True aus, kommt immer Null dabei raus. Da wir aber nicht die FB Entwickler sind, werden wir dieses problem leider nicht loesen koennen.

Nicht "kompatibel zu FB"? ich glaube da siehst du etwas falsch.
FreeBasic definiert schlicht und einfach mit NOT eine binäre Negation (~ in C), zu ! in C gibt es meines Wissens kein Äquivalent. Der Entwickler ist dafür verantwortlich, wie er diesen Operator verwendet, und muss eben wissen, dass es um eine binäre Negation handelt.
Da ist in den Headern nichts falsch definiert, auch der Compiler macht nichts falsch. Einzig allein der Programmierer macht etwas falsch wenn er NOT(TRUE) hinschreibt und eigentlich das C-Äquivalent !(TRUE) haben will.
_________________
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
Jojo
alter Rang


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

BeitragVerfasst am: 17.07.2013, 21:43    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Das ergibt fuer mich kein sinn, denn die 1 ist ja wie wir wissen nicht Kompatibel zu FB. Anders sieht es bei C/C++ aus, da ist es egal ob True 1 ist oder -1. Gibt man mit !(not) True aus, kommt immer Null dabei raus. Da wir aber nicht die FB Entwickler sind, werden wir dieses problem leider nicht loesen koennen

Lies noch mal meinen Post.

1) FreeBASIC selbst definiert nicht TRUE.
2) Der WinAPI-Header windows.bi definiert TRUE=1, weil er kompatibel zur WinAPI sein muss.

Der klassische Weg, wie TRUE meistens in BASIC definiert wird ist "TRUE = NOT FALSE". So wird das z.B. in der vbcompat.bi (Bestandteil von FreeBASIC) gemacht.
_________________
» 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
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 3 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