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:

Schachturnierorganistionsprogramm (STOP)
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 26.08.2016, 19:03    Titel: Schachturnierorganistionsprogramm (STOP) Antworten mit Zitat

Ich habe einen Quellcode bei https://www.freebasic-portal.de/porticula/stop-1828.html hochgeladen. In dem Programm bringt der mir mit -exx Zugriffsfehler die ich nicht beheben bzw. finden kann??? Ich muss beim Programmieren irgendwo einen Fehler gemacht haben.

Der Fehler tritt immer dann auf, wenn ich 2001 Teilnehmer lade und auf Paarungen klicke und dann eine der Pfeiltasten drücke!!!Wird zuerst ausgelost, hängt sich das Programm ohne -exx nicht auf. Vielleicht kann sich mal jemand den Quellcode ansehen? Achtung, es sind viele Kommentare vorhanden und vieles noch im Beta Zustand!

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



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

BeitragVerfasst am: 26.08.2016, 19:15    Titel: Antworten mit Zitat

-exx hat ja den Vorteil, dass das Programm eine Rückmeldung über den Fehler gibt. Was gibt es denn aus?
(muss natürlich aus der Konsole heraus gestartet werden, sonst kannst du die Meldung nicht lesen)

Wenn sich die problematische Stelle durch die Fehlermeldung nicht genau lokalisieren lässt (bei allgemeinen Speicherzugriffsverletzungen), kannst du dich z. B. mit GETKEY und Debugmeldungen über PRINT an die Stelle annähern.

Ich kann dir leider nicht aktiv bei der Suche helfen; bei WinAPI macht mein Linux-Rechner nicht mit.
_________________
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 26.08.2016, 22:14    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
-exx hat ja den Vorteil, dass das Programm eine Rückmeldung über den Fehler gibt. Was gibt es denn aus?
(muss natürlich aus der Konsole heraus gestartet werden, sonst kannst du die Meldung nicht lesen)

Wenn sich die problematische Stelle durch die Fehlermeldung nicht genau lokalisieren lässt (bei allgemeinen Speicherzugriffsverletzungen), kannst du dich z. B. mit GETKEY und Debugmeldungen über PRINT an die Stelle annähern.

Ich kann dir leider nicht aktiv bei der Suche helfen; bei WinAPI macht mein Linux-Rechner nicht mit.
Keinen Windowsrechner zur Verfügung? Das ist aber schade. Ich verwende eine Datei-Lade-Funktion. Deswegen die Windows-Bibliotheken!

Ich bekomme folgende Meldung:
Zitat:
Aborting due to runtime error 6 (out of bounds array access) at line 1474 of Stop.bas::AUSLOSUNG()

Habe schon alles erdenkliche versucht, den Fehler zu beheben. Bis jetzt keine Chance!

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 26.08.2016, 23:21    Titel: Antworten mit Zitat

Hallo ALWIM!

Bei mir meckert der Compiler erst einmal über die Zeile
Code:
  REDIM paarungen((1 TO (ppr+58)), 1 TO 2, 1 TO RAZ) ' Paarungen neu initialisieren
aber das verschwindet, wenn man die Klammern entfernt:
Code:
  REDIM paarungen(1 TO (ppr+58), 1 TO 2, 1 TO RAZ) ' Paarungen neu initialisieren

Zum Testen bräuchte ich eine Teilnehmerdatei, so kann ich im Augenblick leider nicht mehr sagen. In Zeile 1474 steht bei mir
Code:
END SUB
Scheint mir etwas unlogisch.

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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 26.08.2016, 23:52    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Hallo ALWIM!

Bei mir meckert der Compiler erst einmal über die Zeile
Code:
  REDIM paarungen((1 TO (ppr+58)), 1 TO 2, 1 TO RAZ) ' Paarungen neu initialisieren
aber das verschwindet, wenn man die Klammern entfernt:
Code:
  REDIM paarungen(1 TO (ppr+58), 1 TO 2, 1 TO RAZ) ' Paarungen neu initialisieren


Zitat:
Zum Testen bräuchte ich eine Teilnehmerdatei, so kann ich im Augenblick leider nicht mehr sagen. In Zeile 1474 steht bei mir
Code:
END SUB
Scheint mir etwas unlogisch.

Gruß
grindstone


In Zeile 1474 steht bei mir
Code:
END SUB

Scheint mir etwas unlogisch.

Die Klammern sind irrtümlich mit reingekommen. Keine Ahnung wieso?

Wieso? Unterprogramm ist an dieser Stelle zu ende! Deswegen auch der Befehl "END SUB".
Teilnehmerdatei kommt...
Ich habe mir die per Kopieren erstellt! Einen Spieler abgespeichert und dann die Datei mit dem Texteditor geöffnet. Str+C und Str+V bis 2000 Spieler vorhanden waren. Die Suche geht weiter... mit dem Kopf durch die Mauer wollen
Vielen Dank an alle die mithelfen!

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



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

BeitragVerfasst am: 27.08.2016, 00:32    Titel: Antworten mit Zitat

Zitat:
Wieso? Unterprogramm ist an dieser Stelle zu ende! Deswegen auch der Befehl "END SUB".


Die Zeile 1474: END SUB passt nicht zur Fehlermeldung "Aborting due to runtime error 6 (out of bounds array access) at line 1474 of Stop.bas::AUSLOSUNG()".
Daher wäre interessant, was denn in deinem Editor an Stelle 1474 auftaucht.

Mögliche kritische Stelle könnte das hier sein:
Code:
Spieler(paarungen(j+Brett,2,Runde))

Da würde ich erst einmal prüfen, ob Brett einen sinnvollen Wert annimmt, also ob j+Brett im erforderlichen Bereich von 1 bis ppr+58 liegt. Wenn das soweit passt, könnte es noch sein, dass in paarungen(j+Brett,2,Runde) ein Wert drin steht, der nicht als Index für Spieler() erlaubt ist. Das sind jetzt die einzigen zwei Ansatzstellen für einen "out of bound array access", die ich entdecken kann.
_________________
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 27.08.2016, 00:40    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Zitat:
Wieso? Unterprogramm ist an dieser Stelle zu ende! Deswegen auch der Befehl "END SUB".


Die Zeile 1474: END SUB passt nicht zur Fehlermeldung "Aborting due to runtime error 6 (out of bounds array access) at line 1474 of Stop.bas::AUSLOSUNG()".
Daher wäre interessant, was denn in deinem Editor an Stelle 1474 auftaucht.

Mögliche kritische Stelle könnte das hier sein:
Code:
Spieler(paarungen(j+Brett,2,Runde))

Da würde ich erst einmal prüfen, ob Brett einen sinnvollen Wert annimmt, also ob j+Brett im erforderlichen Bereich von 1 bis ppr+58 liegt. Wenn das soweit passt, könnte es noch sein, dass in paarungen(j+Brett,2,Runde) ein Wert drin steht, der nicht als Index für Spieler() erlaubt ist. Das sind jetzt die einzigen zwei Ansatzstellen für einen "out of bound array access", die ich entdecken kann.
Das Interessante dabei ist ja, dass die Fehlermeldung nur kommt, wenn nicht ausgelost wird. Wird vorher ausgelost, läuft das Programm erstmal soweit! Ich werde jetzt mal schauen, ob es an den zwei Sachen liegt. Wenn nicht, was dann?
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 27.08.2016, 07:36    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Wenn nicht, was dann?
Dann ist es etwas anderes. grinsen

Mit dem geposteten Code erscheint als Fehlerzeile 1462:
Code:
If Spieler(paarungen(j+Brett,1,Runde)) <> "" THEN FONT LTRIM$(STR$(Brett+j)) + "| " + LTRIM$(STR$(paarungen(j+Brett,1,Runde))) + " " + Spieler(paarungen(j+Brett,1,Runde)), 9+sx, 43, &hFFFFFF, &hAAAAAA, &h555555, 0, 0


Ich habe die Werte mal ausdrucken lassen. Bevor ausgelost wird, sind sowohl "Brett" als auch "j" 0. Damit ist der 1. Index 0 und außerhalb des definierten Bereichs.
Code:
 REDIM paarungen(1 TO (ppr+58), 1 TO 2, 1 TO RAZ) ' Paarungen neu initialisieren

Also entweder die Untergrenze auf 0 setzen oder dafür sorgen, daß "Brett" > 0 ist. Rein logisch scheint mir das Problem aber eher beim Wert von "ppr" zu liegen (zumindest soweit ich die Funktionsweise des Programms in der kurzen Zeit verstanden habe), der zu diesem Zeitpunkt noch nicht gesetzt (also 0) ist.

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
nemored



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

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

ppr wird ganz am Anfang von AUSLOSUNG gesetzt:
Code:
    IF TAZ < 3 THEN EXIT SUB


    ' Rundensystem
    IF Paarungssystem = 1 THEN

        ' Partien pro Runde ermitteln!
        IF TAZ MOD 2 <> 0 THEN
            ppr = (TAZ - 1) / 2
            ppr += 1
            RAZ = TAZ
            ' IF ppr < 0 THEN ppr = 1
            ' IF RAZ < 0 THEN RAZ = 1
        ELSE
            ppr = TAZ / 2
            RAZ = TAZ - 1
            ' IF ppr < 0 THEN ppr = 1
            ' IF RAZ < 0 THEN RAZ = 1
        END IF

Wenn ich keinen Denkfehler habe, ist ppr dadurch immer mindestens 1.

Brett = 0 wäre auf jeden Fall ein Problem, das einen Zugriff außerhalb des Array-Bereichs auslöst.


edit:
Zeile 567 (laut NoPaste):
Code:
            IF Brett >= ppr THEN Brett = ppr

Wenn zuvor noch nicht ausgelost wurde, ist ppr = 0 (wird ja erst während der Auslosung gesetzt), und damit kann auch Brett auf 0 gesetzt werden, was dann in der folgenden Auslosung zu einem Zugriffsfehler führt.
_________________
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: 27.08.2016, 09:33    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Wenn zuvor noch nicht ausgelost wurde, ist ppr = 0 (wird ja erst während der Auslosung gesetzt), und damit kann auch Brett auf 0 gesetzt werden, was dann in der folgenden Auslosung zu einem Zugriffsfehler führt.
Genau das meinte ich. lächeln Einen Rat zu geben, wie man das stilistisch sauber lösen kann (ohne Seiteneffekte), traue ich mich aber mangels ausreichenden Einblicks in das Gesamtprogramm nicht.

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
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 27.08.2016, 11:24    Titel: Antworten mit Zitat

Allein die Bezeichner... durchgeknallt ELO(j), DWZ(j), BB, E, K, L, T, XXX, TAZ, RAZ, ppr, BV, ... und natürlich alles SHARED...

https://de.wikipedia.org/wiki/Sprechender_Name#Sprechende_Namen_in_der_Programmierung
_________________

Der Markt regelt das! | 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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 27.08.2016, 13:57    Titel: Antworten mit Zitat

Und ein paar GOTOs sind auch noch drin! grinsen

Ich vermute mal, die erste Version dieses Programms ist noch unter QB entstanden. Im Laufe der Zeit ist es dann immer mehr erweitert und zwischendurch nach FB portiert worden. Richtig?

Und mittlerweile hat es einen Umfang erreicht, bei dem der damals gängige Programmierstil anfängt, Probleme zu bereiten.

Aus den kryptischen Bezeichnern aussagekräftige zu machen ist mit Suchen & Ersetzen eine Sache von wenigen Minuten. Die globalen Variablen soweit wie möglich durch lokale zu ersetzen ist schon etwas schwieriger, aber auch nicht unmöglich. Das Programm wird dadurch auf jeden Fall wesentlich übersichtlicher und pflegeleichter.

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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 27.08.2016, 15:33    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Und ein paar GOTOs sind auch noch drin! grinsen

Ich vermute mal, die erste Version dieses Programms ist noch unter QB entstanden. Im Laufe der Zeit ist es dann immer mehr erweitert und zwischendurch nach FB portiert worden. Richtig?

Und mittlerweile hat es einen Umfang erreicht, bei dem der damals gängige Programmierstil anfängt, Probleme zu bereiten.

Aus den kryptischen Bezeichnern aussagekräftige zu machen ist mit Suchen & Ersetzen eine Sache von wenigen Minuten. Die globalen Variablen soweit wie möglich durch lokale zu ersetzen ist schon etwas schwieriger, aber auch nicht unmöglich. Das Programm wird dadurch auf jeden Fall wesentlich übersichtlicher und pflegeleichter.

Gruß
grindstone

Ja, das Programm enstand damals in Qbasic. Irgendwann habe ich es für Freebasic "neu" geschrieben. Nun habe ich das Programm fast komplett erneut neu geschrieben. Lediglich die ein oder andere Sub wurde vom damaligen alten Quellcode übernommen. Deswegen sind da auch noch ein paar Goto's vorhanden! Die werde ich irgendwann schon noch rausschmeissen. Wusste gar nicht mehr, dass die noch drin sind! Das Problem mit der Speicherzugriffsverletzung ist ja, dass man an gewisse Dinge im ersten Moment gar nicht dran denkt! Zum Beispiel daran, dass man auch ab der Null oder gar im Minusbereich deklarieren soll/muss, eben weil dies vorkommen kann. Noch bin ich nicht dazugekommen, mich nochmals auf Fehlersuche zu begeben. Aber sobald ich etwas Zeit habe, werde ich das tun.

Was ich noch machen muss, ist die Realisierung der Abspeicherung von den Ergebnissen und der Paarungen. Da bin ich im Moment noch ein wenig am überlegen, wie ich das am besten mache. Aber das kriege ich auch noch hin. Die Krönung für dieses Programm wäre ja Auslosung im Schweizer System! Ich fürchte aber, dass ich daran scheitern werde... traurig

Wobei das damalige Qbasic-Projekt eh nur auf Rundensystem ausgelegt war. Man konnte nur 16 Teilnehmer eingeben! Bei der ersten Freebasic Version waren es dann schon ein paar mehr. Leider halt immer ohne Punkteeingabe. Dies versuchte ich nun zu ändern! Mit Erfolg wie man sieht! Oder nicht?

Guß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 27.08.2016, 17:05, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 27.08.2016, 16:10    Titel: Antworten mit Zitat

Den Hinweis von grindstone zum Umbenennen von Variablen find ich auf jeden Fall gut. Für Außenstehende (und auch für einen selber ein paar Monate oder Jahre später) ist ein Programm viel einfacher zu verstehen, wenn Variablen "obligoInHauswaehrung", "spielerNummer" oder "buttonPosition" heißen und nicht "abc", "xxx" oder "K". lächeln
_________________

Der Markt regelt das! | 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: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 27.08.2016, 16:56    Titel: Antworten mit Zitat

Sebastian hat Folgendes geschrieben:
Den Hinweis von grindstone zum Umbenennen von Variablen find ich auf jeden Fall gut. Für Außenstehende (und auch für einen selber ein paar Monate oder Jahre später) ist ein Programm viel einfacher zu verstehen, wenn Variablen "obligoInHauswaehrung", "spielerNummer" oder "buttonPosition" heißen und nicht "abc", "xxx" oder "K". lächeln

Das stimmt schon, aber bei DWZ und ELO muss ich eine Ausnahme machen, denn das sind die Abkürzungen bzw. Bezeichnungen für die Wertungszahlen beim Schach!

DWZ = Deutsche Wertungszahl
ELO = Internationale Wertungszahl

Jeder Schachspieler wird bei diesen Bezeichnungen sofort wissen, worum es geht! Darum habe ich auch DWZ und ELO genommen. Bei For - Next Schleifen wollte ich halt nicht unbedingt lange Variablennamen verwenden. Deswegen i, j und k.

Den Bildschirminhalt müsste ich doch speichern können oder? Sobald ich nämlich wieder auf Paarungen klicke, sind die alten Daten weg. Also es wird keine Paarung + Ergebnis mehr angezeigt. Muss ich mal schauen, ob sich das irgendwie vernünftig realisieren lässt. happy

Fröhliches programmieren allerseits!

Edit:
Habe den Fehler wahrscheinlich gefunden! Kein Zugriffsfehler bis jetzt!!!

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



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

BeitragVerfasst am: 27.08.2016, 19:17    Titel: Antworten mit Zitat

Als offizielle Abkürzungen sind DWZ und ELO durchaus sprechende Namen (DWZ sagt mir zwar nichts, aber ELO ist mir auch als Nicht-Schachspieler ein Begriff). Für Laufvariablen i, j und k zu verwenden ist ebenfalls in Ordnung; das wird sehr häufig so gemacht, und deshalb rechnet man bei diesen Variablen schon damit, dass es die Laufvariablen sein werden. Bei anderen Kurzbezeichnungen sieht das schon anders aus.

Allerdings würde ich dringend empfehlen, Laufvariablen nicht SHARED zu deklarieren! In FreeBASIC kannst du sie sogar direkt für eine FOR-Schleife deklarieren:
Code:
FOR i AS INTEGER = start TO ende
  ' ...
NEXT

Eine globale Laufvariable macht spätestens dann Schwierigkeiten, wenn du in der Schleife ein Unterprogramm aufrufst, das dieselbe Variable verwendet. Und ich garantiere dir, dass du den Fehler dann nicht finden wirst.

Zitat:
Den Bildschirminhalt müsste ich doch speichern können oder?

Ja, das kann man selbstverständlich; Stichwörter IMAGECREATE, GET und PUT (jeweils der Grafikbefehl). Wenn du aber die Anzeige nicht einfach nochmal neu generieren kannst, liegt da vermutlich noch irgendwo ein Problem.
_________________
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 27.08.2016, 21:37    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Als offizielle Abkürzungen sind DWZ und ELO durchaus sprechende Namen (DWZ sagt mir zwar nichts, aber ELO ist mir auch als Nicht-Schachspieler ein Begriff). Für Laufvariablen i, j und k zu verwenden ist ebenfalls in Ordnung; das wird sehr häufig so gemacht, und deshalb rechnet man bei diesen Variablen schon damit, dass es die Laufvariablen sein werden. Bei anderen Kurzbezeichnungen sieht das schon anders aus.

Allerdings würde ich dringend empfehlen, Laufvariablen nicht SHARED zu deklarieren! In FreeBASIC kannst du sie sogar direkt für eine FOR-Schleife deklarieren:
Code:
FOR i AS INTEGER = start TO ende
  ' ...
NEXT

Eine globale Laufvariable macht spätestens dann Schwierigkeiten, wenn du in der Schleife ein Unterprogramm aufrufst, das dieselbe Variable verwendet. Und ich garantiere dir, dass du den Fehler dann nicht finden wirst.

Zitat:
Den Bildschirminhalt müsste ich doch speichern können oder?

Ja, das kann man selbstverständlich; Stichwörter IMAGECREATE, GET und PUT (jeweils der Grafikbefehl). Wenn du aber die Anzeige nicht einfach nochmal neu generieren kannst, liegt da vermutlich noch irgendwo ein Problem.

Da muss ich mal schauen, wie ich das hinbekomme mit dem Bildschirm speichern. Das habe ich noch nicht in Angriff genommen. Programm funktioniert bis jetzt. Keine Zugriffsverletzungen mehr!

Übrigens: Da gabe es bei Wer wird Millionär vom Günther Jauch mal eine 500.000 Eurofrage zu der ELO-Zahl! (Wer oder was hat eine ELO-Zahl) Ich hätte das auf Anhieb gewusst!!! Für mich wäre das keine 500.000 Euro Frage gewesen.

Ich mache halt immer die Laufvariablen Shared.

Falls jemand Schweizer System realisieren möchte, darf dies gerne tun. Ich werde es wahrscheinlich nicht hinbringen. Das wäre schon etwas für mein Stop-Projekt!

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.08.2016, 12:01    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Da muss ich mal schauen, wie ich das hinbekomme mit dem Bildschirm speichern.

Ich bin mir zwar alles andere als sicher, ob das in diesem Fall die richtige Methode ist, aber den Bildschirminhalt als Grafik zu speichern ist relativ einfach:
Code:
Dim Shared As Any Ptr bildpuffer

Sub BildschirmSpeichern
   Dim As Integer breite, hoehe, farbtiefe, bpp
   
   If bildpuffer = 0 Then
      ScreenInfo breite, hoehe, farbtiefe, bpp
      bildpuffer = ImageCreate(breite, hoehe,, bpp * 8) 'grafikpuffer erzeugen
      Get (0, 0) - (breite - 1, hoehe - 1), bildpuffer 'bildschirminhalt in puffer schreiben
   EndIf
End Sub

Sub BildschirmHolen
   Dim As Integer breite, hoehe, farbtiefe, bpp
   
   If bildpuffer Then
      ScreenInfo breite, hoehe, farbtiefe, bpp
      Put (0, 0),bildpuffer,(0, 0) - (breite - 1, hoehe - 1), PSet 'pufferinhalt auf bildschirm schreiben
      ImageDestroy bildpuffer 'speicher freigeben
      bildpuffer = 0 'pointer löschen
   EndIf
End Sub


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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 12.06.2017, 23:54    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Die Krönung für dieses Programm wäre ja Auslosung im Schweizer System! Ich fürchte aber, dass ich daran scheitern werde... traurig

Jetzt habe ich tatsächlich Schweizer System in meinem Programm drin! Ich bin nicht gescheitert!!! Habe nämlich eine Möglichkeit gefunden Schweizer System in mein Programm einzubauen. happy Wär hätte das gedacht?

Kleines Fazit zum Programm:
Programm funktioniert, Schweizer System ist drin, HTML Ausgabe ist drin, abspeichern funktioniert, Punkteeingabe ist drin, TRF-File Ausgabe ist drin!

Das Programm, wurde bei einem offiziellen Schachturnier im Einsatz getestet. Keine nennenswerte Abstürze oder größere Bugs gefunden. Funktioniert so, wie es sein soll! Lediglich ein paar Kleinigkeiten, die noch geändert gehören. Aber sonst, funktioniert das Ding im großen und ganzen!

Ein Problem habe ich allerdings doch noch:
Die Sonderbuchstaben ß, ä, ö, ü werden nicht korrekt angezeigt! Ich kann zwar mittels eines Befehles
Code:
CharToOem Wort, Wort
was machen, aber das nur bedingt. Das hilft mir nicht so recht weiter. Wenn ich den Befehl verwende, habe ich an anderer Stelle wieder komische Zeichen auf dem Bildschirm sofern ich was mache (einlesen/abspeichern, ... ect.). Wenn jemand eine vernünftige Lösung kennt, bitte mitteilen! Ich brauche etwas, was immer funktioniert und die richtigen Buchstaben auf dem Bildschirm ausgibt und in eine Datei abspeichert!!!

Falls jemand Interesse hat, daran mitzuwirken, einfach melden?

Es fehlt noch Buchholz- bzw. Sonneborn-Bergerberechnung mit Ranglistenkorrektur; einlesen eines TRF-Files; Spieler in ausgewählter Runde aussetzen lassen; Rundendatum Eingabemöglichkeit; Übersetzung ins Französische/Spanische.

Wann ich das Ding allen zur Verfügung stelle, steht noch in den Sternen? Geplant ist eventuell, eine Anerkennung seitens der FIDE!!! Dies ist möglich, sofern alles im Programm drin ist, was die FIDE verlangt.

https://www.fide.com/FIDE/handbook/C04Annex4_VCL17.pdf
https://www.fide.com/FIDE/handbook/C04Annex3_FEP16.pdf

Dann programmiere ich mal weiter!

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

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

ALWIM hat Folgendes geschrieben:
Wenn jemand eine vernünftige Lösung kennt, bitte mitteilen!
Ist doch ganz einfach. Statt
Code:
CharToOem(Wort, Wort)
sowas wie
Code:
CharToOem(OriginalWort, AusgabeWort)

Dadurch bleibt der ursprüngliche Text erhalten, und AusgabeWort wird nur zur korrekten Bildschirmausgabe verwendet.

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
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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