Zu langer Code?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

bmurray

Betreff: Zu langer Code?

BeitragMi, März 26, 2014 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Gemeinde,

ich habe das Gefühl, dass ich die "Struktur" von B+ falsch nutze, da ich inzwischen merke, dass mein Rechner mit dem Code nicht mehr klar kommt, also extrem hängt. Mein Programm hat bis jetzt 13.000 Zeilen Code. Da hab ich ein paar Fragen.

1) Ist es üblich, den ganzen Code eines Spiels in einer Datei zu speichern, oder sollte man den Code auf mehrere Dateien "aufteilen"?

2) Wenn man ihn aufteilen sollte, wie genau funktioniert das? Und muss man dann etwas beim Kompilieren beachten?

Viele Grüße,

bmurray

Xeres

Moderator

BeitragMi, März 26, 2014 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du so viel Code in einer einzelnen Datei hast, musst du praktisch den Überblick verlieren.
Teile deinen Code auf zusammengehörende Funktionen auf und inkludiere die in der Hauptdatei mit include.
Da B+ nicht Objektorientiert ist, ist das so ziemlich das höchste der Gefühle. Das Plus an Übersicht ist aber nicht zu verachten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMi, März 26, 2014 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
13.000 Zeilen sind ganz schön viel! Es könnte auch gut sein, dass man den um 50%-90% kürzen könnte....

Hast Du ihn immer in Funktionen aufgeteilt? Wie lange sind diese Funktionen im Durchschnitt (in Zeilen)? Gibt es Funktionen oder Code-Stellen, die sich ähnlich sind?

Wenn Du Lust hast, schau ich mal drüber...ZIP doch mal den gesamten Code (ohne Bilder, Resourcen, etc.. nur der Code!) Wie lange ist der? Kann man den noch per E-Mail senden?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Eingeproggt

BeitragMi, März 26, 2014 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast in einem anderen Thread etwas von einem Fußballmanager geschrieben.
Und du hast alles in einer großen Datei.
Darf ich annehmen, dass du auch "Daten" wie Spielernamen etc. in dem Code stehen hast? Weil solche Dinge lagert man gewöhnlich aus. Wie genau, darüber können wir lange diskutieren, aber im Grunde reicht schon ne Textdatei die du dann mit ReadFile und den damit verbundenen Befehlen (ReadLine etc) ausliest.

Und natürlich wie die beiden Vorposter schon schreiben, Code in Funktionen auslagern, diese thematisch zusammen passend in Includes. Und die Welt sieht schon ganz anders aus Wink

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Wipffinder

BeitragDo, März 27, 2014 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn dein Code hängt kannst du dies durch Aufteilen und Includieren des Codes und auslagern von Funktionen nicht ändern. Wie meine Vorredner bereits gesagt haben kannst du die Übersicht verbessern (sehr zu empfehlen) und das hilft den Code zu optimieren. Ich bin jetzt bei meinem Projekt auch schon bei 10k, geht mitlerweilen aber schneller da ich einiges optimieren konnte. Dabei hat mir folgendes Tool geholfen: Blitzprog Profiler 0.8.2. Damit kannst du ermitteln welche Funktion wie lange braucht und eventuell den Grund oder die Funktion finden wo die Performance zusammenbricht.

Handelt es sich um diesen Fussballmanager? Mehr Informationen und ein wenig Code (um deinen Programmierstil zu sehen) könnten helfen bessere Tipps zu geben.

Gruss Wipffinder

BladeRunner

Moderator

BeitragDo, März 27, 2014 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei so großen Dateien ist es klar dass das Bearbeiten länger dauert, all der Text wird ja auch bei jeder Eingabe bearbeitet und das Syntaxhighlighting angepasst. Daher ist ein auslagern in Includes durchaus sinnvoll.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

bmurray

BeitragDo, März 27, 2014 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, vielen Dank für eure Antworten. Also:

Midimaster hat Folgendes geschrieben:
13.000 Zeilen sind ganz schön viel! Es könnte auch gut sein, dass man den um 50%-90% kürzen könnte....


Also ich glaube schon, dass ich das Spiel "effizient" programmiert habe, es ist einfach wirklich sehr umfangreich geworden. Ich werde mal eine spielbare Version hier reinstellen, muss nur noch die aus dem Netz genutzten Bilder und Originalnamen abändern. Ehrlich gesagt schätze ich, dass ich bei 20% bin. Ich glaube also, dass, wenn ich mal fertig werde, ich sicher bei 60-70k Zeilen Codes angelange.

Midimaster hat Folgendes geschrieben:
Hast Du ihn immer in Funktionen aufgeteilt? Wie lange sind diese Funktionen im Durchschnitt (in Zeilen)? Gibt es Funktionen oder Code-Stellen, die sich ähnlich sind?


Ja, ich habe alles, was sich wiederholen lässt (mit anderen Parametern) in Funktionen gepackt. Manche sind nur ein paar Zeilen (6-10), manche sind schon länger (z.B. wenn die bestmögliche Aufstellung aller Teams errechnet werden soll), etwa 100-150 Zeilen.

Eingeproggt hat Folgendes geschrieben:
Darf ich annehmen, dass du auch "Daten" wie Spielernamen etc. in dem Code stehen hast? Weil solche Dinge lagert man gewöhnlich aus.


Ja, das ist ausgelagert. 90 Teams mit allen möglichen Attributen, zu jedem Team 20-30 Spieler mit Attributen, das lasse ich alles in Schleifen aus txt-Dateien einlesen, da ist also nichts im Code eingeschrieben.

Wipffinder hat Folgendes geschrieben:
Dabei hat mir folgendes Tool geholfen: Blitzprog Profiler 0.8.2. Damit kannst du ermitteln welche Funktion wie lange braucht und eventuell den Grund oder die Funktion finden wo die Performance zusammenbricht.


Cool, danke. Das werde ich mal ausprobieren!

Wipffinder hat Folgendes geschrieben:
Handelt es sich um diesen Fussballmanager? Mehr Informationen und ein wenig Code (um deinen Programmierstil zu sehen) könnten helfen bessere Tipps zu geben.


Ok, hier eine wichtige Funktion aus meinem Code: Hier werden die Ergebnisse des UEFA-Cups ermittelt (und zwar wird die Runde übergeben (1-19) wobei bei geraden Zahlen noch die Möglichkeit hinzutritt, dass das Spiel in die Verlängerung gehen kann (außer bei der Gruppenphase). Am Ende des Codes wird noch die nächste Runde ausgelost, sowie, bei Runde 19, der Sieger ermittelt und gespeichert.

Generell gilt bei mir: Ich bin noch ein Anfänger (mein Spiel habe ich bisher das vierte mal komplett neu angefangen, weil ich irgendwann gemerkt hatte, dass ich, so wie ich bisher programmiert hatte, nicht mehr auf einen grünen Zweig kommen würde). Jetzt sieht es meiner Ansicht nach aber ganz gut aus, dass ich auf dem richtigen Weg bin.

Hier der Code:

Code: [AUSKLAPPEN]
   

Function spieltag_ergebnisse_el(runde)
   If runde=1 Or runde=2 Then
      anzahlspiele=10
      auswahl_ep_runde_exakt=1
      hinrue=runde
   End If
   If runde=3 Or runde=4 Then
      anzahlspiele=20
      auswahl_ep_runde_exakt=2
      hinrue=runde-2
   End If
   If runde>=5 And runde<=10 Then
      anzahlspiele=24
      auswahl_ep_runde_exakt=runde-4
   End If
   If runde=11 Or runde=12 Then
      anzahlspiele=16
      auswahl_ep_runde_exakt=3
      hinrue=runde-10
   End If
   If runde=13 Or runde=14 Then
      anzahlspiele=8
      auswahl_ep_runde_exakt=4
      hinrue=runde-12
   End If
   If runde=15 Or runde=16 Then
      anzahlspiele=4
      auswahl_ep_runde_exakt=5
      hinrue=runde-14
   End If
   If runde=17 Or runde=18 Then
      anzahlspiele=2
      auswahl_ep_runde_exakt=6
      hinrue=runde-16
   End If      
   If runde=19 Then
      anzahlspiele=1
      auswahl_ep_runde_exakt=7
      hinrue=1
   End If
      
   ;Spiele
   For i = 1 To anzahlspiele

      ;Stärkeneinstellungen pro Spiel
      If runde<=4 Or runde>=11 Then
         offensiveheim=verein(el_ko_h_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_h_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\offensiv
         defensiveheim=verein(el_ko_h_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_h_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\defensiv
         offensiveausw=verein(el_ko_a_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_a_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\offensiv
         defensiveausw=verein(el_ko_a_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_a_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\defensiv
      End If
      If runde>=5 And runde<=10 Then
         offensiveheim=verein(el_gruppenspiele_h_land((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)),el_gruppenspiele_h_club((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)))\staerke\offensiv
         defensiveheim=verein(el_gruppenspiele_h_land((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)),el_gruppenspiele_h_club((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)))\staerke\defensiv
         offensiveausw=verein(el_gruppenspiele_a_land((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)),el_gruppenspiele_a_club((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)))\staerke\offensiv
         defensiveausw=verein(el_gruppenspiele_a_land((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)),el_gruppenspiele_a_club((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2)))\staerke\defensiv
      End If
      tore_h_temp=0
      tore_a_temp=0
      
      ;Durchgang der Spiele
      j=0
      While j<46+nsz(i)
         j=j+1
         tor_pro_minute(0,0,1,j,0,0,offensiveheim,defensiveheim,offensiveausw,defensiveausw)
         tore_h_temp=tore_h_temp+tor1
         tore_a_temp=tore_a_temp+tor2
         If j=45 Then
            nsz(i)=Rand(0,1)
         End If
      Wend
      j=44
      While j<91+nsz(i)
         j=j+1
         tor_pro_minute(0,0,2,j,0,0,offensiveheim,defensiveheim,offensiveausw,defensiveausw)         
         tore_h_temp=tore_h_temp+tor1
         tore_a_temp=tore_a_temp+tor2
         If j=91 Then
            nsz(i)=berechne_nsz(tore_h_temp+tore_a_temp)
         End If
      Wend
   
      ;Spielergebnis nach 90 Minuten speichern
      If runde<=4 Or runde>=11 Then
         el_ko_h_tore(hinrue,auswahl_ep_runde_exakt,i)=tore_h_temp
         el_ko_a_tore(hinrue,auswahl_ep_runde_exakt,i)=tore_a_temp
      End If   
      If runde>=5 And runde<=10 Then
         el_gruppenspiele_h_tore((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2))=tore_h_temp
         el_gruppenspiele_a_tore((i/2)+(i Mod 2),auswahl_ep_runde_exakt,2-(i Mod 2))=tore_a_temp
      End If
      
      ;War es das Rückspiel? Dann eventuell Verlängerung und 11er-Schießen
      If hinrue=2 Then
         el_ko_weiter_text(auswahl_ep_runde_exakt,i)=""
         If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)=el_ko_h_tore(2,auswahl_ep_runde_exakt,i) And el_ko_a_tore(1,auswahl_ep_runde_exakt,i)=el_ko_a_tore(2,auswahl_ep_runde_exakt,i) Then;Verlängerung?
            For j = 1 To 30
               tor_pro_minute(0,0,1,j,0,0,offensiveheim,defensiveheim,offensiveausw,defensiveausw)               
               el_ko_h_tore(2,auswahl_ep_runde_exakt,i)=el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+tor1
               el_ko_a_tore(2,auswahl_ep_runde_exakt,i)=el_ko_a_tore(2,auswahl_ep_runde_exakt,i)+tor2
            Next
            el_ko_weiter_text(auswahl_ep_runde_exakt,i)="n.V."
            If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)=el_ko_h_tore(2,auswahl_ep_runde_exakt,i) And el_ko_a_tore(1,auswahl_ep_runde_exakt,i)=el_ko_a_tore(2,auswahl_ep_runde_exakt,i) Then;11 Schießen?
               berechne_elfmeterschiessen()
               el_ko_h_tore(2,auswahl_ep_runde_exakt,i)=tor1
               el_ko_a_tore(2,auswahl_ep_runde_exakt,i)=tor2
               el_ko_weiter_text(auswahl_ep_runde_exakt,i)="i.E."
               If tor1>tor2 Then el_ko_weiter(auswahl_ep_runde_exakt,i)=1 Else el_ko_weiter(auswahl_ep_runde_exakt,i)=2
            End If;11er Schießen
         End If;Verlängerung?
         If el_ko_weiter_text(auswahl_ep_runde_exakt,i)<>"i.E." Then;Wer kam weiter?
            If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)>el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
               el_ko_weiter(auswahl_ep_runde_exakt,i)=2
            Else If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)<el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
               el_ko_weiter(auswahl_ep_runde_exakt,i)=1
            Else If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)=el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then;Nach Auswärtstoren
               If el_ko_a_tore(2,auswahl_ep_runde_exakt,i)>el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
                  el_ko_weiter(auswahl_ep_runde_exakt,i)=2
               Else
                  el_ko_weiter(auswahl_ep_runde_exakt,i)=1
               End If
            End If   
         End If                     
      End If

      ;Ist es das Finale? Dann kann es natürlich in die Verlängerung gehen
      If runde=19 Then
         ;Verlängerung?
         For i = 1 To 1
            el_ko_weiter_text(7,i)=""
            If el_ko_h_tore(1,7,i) = el_ko_a_tore(1,7,i) Then;Verlängerung?
               For j = 1 To 30;Verlängerung wird ausgespielt
                  tor_pro_minute(1,0,2,j,0,0,offensiveheim,defensiveheim,offensiveausw,defensiveausw)
                  el_ko_h_tore(1,7,i)=el_ko_h_tore(1,7,i)+tor1
                  el_ko_a_tore(1,7,i)=el_ko_a_tore(1,7,i)+tor2
               Next
               el_ko_weiter_text(7,i)="n.V."
               If el_ko_h_tore(1,7,i) = el_ko_a_tore(1,7,i) Then;11er-Schießen?
                  berechne_elfmeterschiessen()
                  el_ko_h_tore(1,7,i)=tor1
                  el_ko_a_tore(1,7,i)=tor2
                  el_ko_weiter_text(7,i)="i.E."
               End If;11er-Schießen?
            End If;Verlängerung?
      
            ;Wer hat den Cup geholt?
            If el_ko_h_tore(1,7,i)>el_ko_a_tore(1,7,i) Then
               el_ko_weiter(7,i)=1
               sieger_land=el_ko_h_land(1,7,i)
               sieger_club=el_ko_h_club(1,7,i)
            Else
               el_ko_weiter(7,i)=2
               sieger_land=el_ko_a_land(1,7,i)
               sieger_club=el_ko_a_club(1,7,i)
            End If
         
         Next
      
         ;Noch in die Rangliste einspeichern!
         verein(sieger_land,sieger_club)\erfolge\elsieger = verein(sieger_land,sieger_club)\erfolge\elsieger + 1
         berechne_rekordsieger(2)   
      End If

   Next


   ;Tabelle berechnen bei Gruppenphase
   If runde>=5 And runde<=10 Then
      berechnen_europokal_tabelle(1,2);Zuerst die Platzierung davor speichern
      berechnen_europokal_tabelle(0,2)   
   End If

   ;Eventuell Auslosungen
   If runde=2 Then loseaus_el(2);Zweite Qualirunde
   If runde=4 Then loseaus_el(3);Gruppenphase
   If runde=10 Then loseaus_el(4);Zwischenrunde
   If runde=12 Then loseaus_el(5);Achtelfinale
   If runde=14 Then loseaus_el(6);Viertelfinale
   If runde=16 Then loseaus_el(7);Halbfinale
   If runde=18 Then loseaus_el(8);Finale
   
End Function




BladeRunner hat Folgendes geschrieben:
Bei so großen Dateien ist es klar dass das Bearbeiten länger dauert, all der Text wird ja auch bei jeder Eingabe bearbeitet und das Syntaxhighlighting angepasst. Daher ist ein auslagern in Includes durchaus sinnvoll.


Genau das war die Antwort auf meine Frage Wink Dann werde ich mal das Auslagern in Includes vornehmen.

Danke für eure Hilfe, ich würde auch gerne mal meine Fortschritte hier präsentieren. Ich muss noch das Vorrendern der TEXTe abschließen und eben die Originalnamen und Bilder aus dem Netz ändern, dann lad ich das Spiel mal hoch.

~EDITIERT~

Leerzeichen im Code eingefügt um das Forenlayout nicht zu zerstören
Xeres

Midimaster

BeitragDo, März 27, 2014 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich finde die Variablennamen zu lang. Durch kürzen kann der Code übersichtlich werden. dieses Beispiel ist 1000 Zeichen kürzer als die Orginalstelle (2500 Zeichen):
BlitzBasic: [AUSKLAPPEN]
;War es das Rückspiel? Dann eventuell Verlängerung und 11er-Schießen
Local Aus%=auswahl_ep_runde_exakt
If hinrue=2 Then
Local H1%=el_ko_h_tore(1,Aus,i)
Local H2%=el_ko_h_tore(2,Aus,i)
Local A1%=el_ko_a_tore(1,Aus,i)
Local A2%=el_ko_a_tore(2,Aus,i)
Local Weiter%,T$
If H1=H2 And A1=A2 Then;Verlängerung?
For j = 1 To 30
tor_pro_minute(0,0,1,j,0,0,offensiveheim,defensiveheim,offensiveausw,defensiveausw)
H2=H2+tor1
A2=A2+tor2
Next
T="n.V."
If H1=H2 And A1=A2 Then;11 Schießen?
berechne_elfmeterschiessen()
H2=Tor1
A2=tor2
T="i.E."
If tor1>tor2 Then Weiter=1 Else Weiter=2
End If;11er Schießen
End If;Verlängerung?
If T<>"i.E." Then;Wer kam weiter?
If (H1+A2)>(H2+A1) Then
Weiter=2
Else If (H1+A2)<(H2+A1) Then
Weiter=1
Else If H1+A2=H2+A1 Then;Nach Auswärtstoren
If A2>A1 Then
Weiter=2
Else
Weiter=1
End If
End If
End If
End If

el_ko_h_tore(1,Aus,i)=H1
el_ko_h_tore(2,Aus,i)=H2
el_ko_a_tore(1,Aus,i)=A1
el_ko_a_tore(2,Aus,i)=A2
el_ko_weiter(Aus,i)=Weiter
el_ko_weiter_text(Aus,i)=T


Und da ist noch wesentlich mehr drin....



Außerdem kann man deutlich mehr zusammenfassen. Hier ein Beispiel:

BlitzBasic: [AUSKLAPPEN]
Function spieltag_ergebnisse_el(runde)
Select runde
Case 1,2
SetGame 10,1 runde
Case 3,4
SetGame 20,2 runde-2
...
End Select
....
End Function


Function SetGame(a%,b%,c%)
anzahlspiele=a
auswahl_ep_runde_exakt=b
hinrue=c
End Function
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

BladeRunner

Moderator

BeitragDo, März 27, 2014 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Argh!
Lange Variablennamen helfen enorm beim Überblick, die würde ich nicht zwangsweise eindampfen.
play_act_opt ist halt bei weitem nicht so lesbar wie player_action_option.
Das mag ja gehen wenn man nicht zu viele Variablen hat und stetig an was arbeitet, aber spätestens nach 2 Wochen Pause bin ich sehr froh über wirklich aussagekräftige Namen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragDo, März 27, 2014 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, BladeRunner, da ist mir das Gleiche gekommen, wie ich es gelesen habe.

Unnötige Namenteile kann man weglassen (z.B. alle_spieler_anzahl_int könnte man definitiv auf spieler_anzahl o.Ä. kürzen), aber es ist deutlich besser ein paar Zeichen pro Zeile mehr zu tippen (was die Funktion ja eh nicht verlängert, sondern höchstens verbreitert) aber dafür auch nach zwei Wochen noch zu wissen, worum es in der Funktion geht.
Gewinner der 6. und der 68. BlitzCodeCompo

bmurray

BeitragDo, März 27, 2014 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Midimaster

Danke für deine Verbesserungsvorschläge. Gerade die Vereinfachungen haben, glaube ich, wirklich Potential, den Code zu verbessern. Ich muss mal den ganzen Code durchgehen, was ich ändern kann..

Aber eine andere Sache: Inzwischen habe ich den Gesamtcode auf mehrere Dateien heruntergebrochen und in der Hauptmain mit Include eingeladen. Das funktioniert wirklich super, ich habe in der Main jetzt nur noch 400 Zeilen. Jetzt musste ich leider feststellen, dass BlitzPlus immer noch total hängt: Wenn ich etwa etwas in Zeile 300 schreibe, dann braucht B+ für jedes Zeichen 2 Sekunden, bis es geschrieben wurde. Es liegt also eher an meinem Rechner. Zum Vergleich: Mein alter, 8 Jahre alter Laptop hat selbst die 13.000 Zeilen ohne Murren verarbeitet. Als der letztens kaputt ging, habe ich für einige Zeit auf dem Laptop meiner Freundin programmiert (etwa 3 Jahre alt), da habe ich diese Verzögerungen ganz leicht bemerkt. Mein brandneuer Rechner (vorgestern gekommen, Asus Zenbook ux302la) kommt mit B+ überhaupt nicht klar, ich sitze erstmal 10 Sekunden da, bis der das Wort, das ich eingetippt habe, auch schreibt. Programmieren ist da leider undenkbar. Hat jemand eine Idee, woran das liegen könnte???

DAK

BeitragDo, März 27, 2014 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine Sache zum Code: Funktionen sind nicht nur zur Codewiederverwendung da, sondern in BB auch die einzige Möglichkeit den Code zu kapseln (=dafür zu sorgen, dass lokale Variablen auch lokal bleiben und nicht am anderen Ende des Codes unabsichtlich nochmal verwendet und somit unbeabsichtigt überschrieben werden können). Deswegen macht es auch für Codeteile, die nur ein Mal verwendet werden, Sinn, in Funktionen gepackt zu werden.
Und wenn man das tut sollte man auch gleich versuchen, globale Variablen so weit möglich zu meiden, da sie diese Codekapselung durchbrechen.
Auch sehr wichtig ist, dass includes möglichst nur Funktionen beinhalten und keinen "losen Code", aus dem gleichen Grund. Includes sieht man von der Stelle aus, wo man sie inkludiert üblicherweise nicht (da sie sich meist in einem anderen Fenster befinden), weswegen man sich da mit losem Code schnell Probleme macht.


@Langsame IDE: Das kann daran liegen, dass dein alter PC mit XP gelaufen ist und der neue wohl auf Win8 rennt und dieses uralte Programm (die Sandard-IDE ist jetzt auch schon fast 15 Jahre alt) mit dem neuen Windows nicht zu Rande kommt. Dafür gibt es zwei mögliche Abhilfen:
-Hol die VirtualBox (oder ein ähnliches Programm) und installiere dir WinXP als virtuellen Computer (das ist auch für einige andere Programme praktisch).
-Hol dir eine alternative IDE, die etwas neuer ist. Ich habe in BB nur die Standard-IDE verwendet, aber gehört, dass IDEal sehr gut sein soll)
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragDo, März 27, 2014 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ich tun würde: Inline Code eindampfen. Zum Beispiel:
Code: [AUSKLAPPEN]
If runde<=4 Or runde>=11 Then
   offensiveheim=verein(el_ko_h_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_h_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\offensiv
   defensiveheim=verein(el_ko_h_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_h_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\defensiv
   offensiveausw=verein(el_ko_a_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_a_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\offensiv
   defensiveausw=verein(el_ko_a_land(hinrue,auswahl_ep_runde_exakt,i), el_ko_a_club(hinrue,auswahl_ep_runde_exakt,i))\staerke\defensiv
End If

Der Code ist super lang, aber man erkennt ein klares Muster, das man so umformen kann:
Code: [AUSKLAPPEN]
If runde <= 4 Or runde >= 11 Then
   Local land_h = el_ko_h_land( hinrue, auswahl_ep_runde_exakt, i )
   Local land_a = el_ko_a_land( hinrue, auswahl_ep_runde_exakt, i )
   Local club_h = el_ko_h_club( hinrue, auswahl_ep_runde_exakt, i )
   Local club_a = el_ko_a_club( hinrue, auswahl_ep_runde_exakt, i )

   offensiveheim = verein( land_h, club_h )\staerke\offensiv
   defensiveheim = verein( land_h, club_h )\staerke\defensiv
   offensiveausw = verein( land_a, club_a )\staerke\offensiv
   defensiveausw = verein( land_a, club_a )\staerke\defensiv
End If

Ein paar temporäre Variablen tauschen ein minimales plus an Speicher gegen Übersicht und ein Tick Geschwindigkeit, wenn der Wert öfters benötigt wird.
Benutze auf jeden Fall Leerzeichen in deinem Code, damit du die Terme auseinander halten kannst.

Genauso kannst du einmal definieren:
Code: [AUSKLAPPEN]
For i = 1 To anzahlspiele
   Local even = i Mod 2

Und dann im folgenden diese teure Fließkommaberechnung 20 Mal einsparen.

Die ganzen Bedingungen mit der "runde" lassen sich teilweise vielleicht mit einer allgemeinen Formel berechnen, oder zumindest in ein Array auslagern, die die passenden Werte enthalten:
BlitzBasic: [AUSKLAPPEN]
Dim Spiele_per_Runde(20)
Spiele_per_Runde(1) = 10
Spiele_per_Runde(2) = 10

Function spieltag_ergebnisse_el( runde )

anzahlspiele=Spiele_per_Runde( runde )
auswahl_ep_runde_exakt=Auswahl_per_Runde( runde )
hinrue=Hinrunde_per_Runde( runde )


Du kannst deinen Code durchaus länger machen, wenn er in sinnvolle Includes ausgelagert wird und dadurch an Übersicht gewinnt!
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragFr, März 28, 2014 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin natürlich auch für aussagekräftige Dateinamen, aber wenn Sie zu lange sind schaden sie eindeutig dem Verständnis der Codestelle. Also ich kann hier wirklich beim besten Willen nicht mehr erkennen, worum es hier geht:

BlitzBasic: [AUSKLAPPEN]
         If el_ko_weiter_text(auswahl_ep_runde_exakt,i)<>"i.E." Then;Wer kam weiter?
If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)>el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
el_ko_weiter(auswahl_ep_runde_exakt,i)=2
Else If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)<el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
el_ko_weiter(auswahl_ep_runde_exakt,i)=1
Else If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)=el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i)


Da finde ich das kurzzeitige "Umtuppern" auf lokale Namen sehr sinnvoll:
H1 ist ja nicht einfach ein Buchstabe, sondern steht "für Heimspiel 1", usw...
BlitzBasic: [AUSKLAPPEN]
         If T<>"i.E." Then;Wer kam weiter?
If (H1+A2)>(H2+A1) Then
Weiter=2
Else If (H1+A2)<(H2+A1) Then
Weiter=1
Else If H1+A2=H2+A1 Then;Nach Auswärtstoren
If A2>A1 Then
Weiter=2
Else
Weiter=1
End If
End If


Danke an Xeres, der hier scheinbar genauso argumentiert...


Schön Bmurray, dass es Dir gelungen ist den Code aufzuteilen... Mir ist nur nicht klar, was daran jetzt "super" ist, wenn BlitzPlus anschließend immer noch so zäh läuft. Dann hast es ja wohl nichts gebracht... Mit nur 400 Zeilen sollte man eigentlich nichts merken... Hast Du den gesamten Code jetzt auf mehreren Fenstern offen? Beginnen die Probleme schon mit ganz neuen Code ab der ersten Zeile?

BladeRunner

Moderator

BeitragFr, März 28, 2014 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut er das?

Also, H1 für Heimmannschaft, das weiß ich genau an dem Tag an dem ich es tippe. Drei Tage später frage ich mich: Ist H1:

Heimmannschaft?
Halbzeit?
Ein Vogelgrippe-Virus?

Sorry, aber da kann ich mit deiner Sichtweise echt nicht konform gehen.
Xeres sagt ja nicht dass die Namen gekürzt werden sollen, er empfiehlt lokal Berechnungen zu staffeln, was wiederum sehr sinnvoll ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

bmurray

BeitragFr, März 28, 2014 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Midimaster

Richtig, die Stelle sieht hier etwas unübersichtlich aus, in B+ mit Syntaxhightlights geht es aber m.M.n. Wegen der Übersichtlichkeit bin ich aber eigentlich dennoch ganz gut klar gekommen, das ist wohl dann Geschmackssache.

@ Xerez
Diese ewigen If... Then Bedingungen für Runde finde ich auch nicht wirklich schön, aber auch hier sollte man sich fragen: Ist ein Array, das ja auch Speicherplatz benötigt, wirklich die bessere Lösung? (da es ja lediglich 10 IF... Then Bedingungen sind, und keine mehr dazukommen) Ich glaube, auch hier ist das eher Geschmackssache.

Xerez hat Folgendes geschrieben:

Genauso kannst du einmal definieren:
Code: [AUSKLAPPEN]
For i = 1 To anzahlspiele
   Local even = i Mod 2

Und dann im folgenden diese teure Fließkommaberechnung 20 Mal einsparen.


Richtig. Guter Einwand, werde ich umsetzen.


MidiMaster hat Folgendes geschrieben:
Schön Bmurray, dass es Dir gelungen ist den Code aufzuteilen... Mir ist nur nicht klar, was daran jetzt "super" ist, wenn BlitzPlus anschließend immer noch so zäh läuft. Dann hast es ja wohl nichts gebracht... Mit nur 400 Zeilen sollte man eigentlich nichts merken... Hast Du den gesamten Code jetzt auf mehreren Fenstern offen? Beginnen die Probleme schon mit ganz neuen Code ab der ersten Zeile?


Stimmt, super ist das nicht. Die Verzögerungen beginnen etwa ab Zeile 100. Laut DAK liegt es an der IDE / Windows 8. Inzwischen habe ich IDEal installiert, aber leider kommt immer eine Fehlermeldung, wenn ich B+ als Compiler nutzen will (er findet die "Keywords file" nicht??). Ich glaube, dieses Problem ist bekannt, ich muss noch ein bißchen hier im Forum suchen.

bmurray

BeitragFr, März 28, 2014 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich finde die Lösung nicht raus. Wenn ich IDEal start, und BlitzPlus als Compiler nehme, bekomme ich folgende Meldung:

"Invalid Keywords file for this compiler"

Ich habe eine keywords-Liste mit blitzcc.exe -k erstellt, aber wie geht es weiter?

BladeRunner

Moderator

BeitragFr, März 28, 2014 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Array wegen des Speicherplatzes nicht zu nehmen ist keine gute Idee. Wir reden hier von einer Handvoll Bytes in einer Gigabyte RAM- Maschine. Es erhöht die Wartbarkeit und die Lesbarkeit des Codes enorm.
Go for array, murray.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragFr, März 28, 2014 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@IDE: Such dir hald eine andere IDE raus, sollte ja noch ein paar Gute geben.
Die Standard-IDE hat ein extrem simples Code-Highlighting, dass auch mehrere tausend Zeilen ohne weiteres wegstecken sollte. Auch wird das Code-Highlighting einer Zeile nicht von anderen Zeilen beeinflusst und schon gar nicht von Zeilen in anderen Includes. Das sollte alles nicht dein Problem sein. Eventuell schau noch mal ob du auf dem neuen PC alle Treiber installiert hast, die du haben solltest, und dass sie alle aktuell sind (lade dir z.B. Grafikkartentreiber nicht vom Hersteller des Laptops sondern vom Hersteller der Karte runter, da sie dort immer deutlich aktueller und besser sind).

@Code-Optimierung:
BB ist echt alt. Es wurde gemacht, wie ein Durchschnittscomputer mit <1 GB RAM und einem P3 oder P4 herumgelungert sind. Damals waren solche Optimierungen wo es um ein paar Byte ging eventuell noch sinnvoll, heute nicht mehr.

Nur mal so kurz durchgerechnet, was dich ein Array an Speicher kostet:
Gehen wir mal von einem Int-Array aus, und davon, dass BlitzBasic Arrays nicht im Stack sondern als Referenzobjekte auf dem Heap macht (was den höchsten Gesamt-Speicherverbrauch für ein Int-Array hat).
Dann braucht ein Array mit n Feldern n*4 Byte Speicher für die Daten selbst, 4 Byte Speicher für den Pointer zum Array und im Debug-Modus zusätzlich noch 4 Byte Speicher um die Länge des Arrays zu speichern.

Wären die Arrays stattdessen auf dem Stack fallen die 4 Byte für den Pointer weg.

Wenn du ein Array mit 10 Objekten hast, dann braucht das also (am Heap und im Debug-Modus) satte 48 Bytes.
Halbwegs aktuelle Computer haben heutzutage mindestens 2 GB eher 4 GB RAM. 32-Bit-Programme bekommen üblicherweise bis zu ~1.7 GB die sie verwenden können. Man kann gut davon ausgehen, dass man diese ~1.7 GB fast immer zur Verfügung hat, sollte man sie wirklich brauchen.

Dein 10-Elemente-Array braucht also ganze 0,0000026% des für dein Programm verfügbaren Speicherplatzes aus.

Zum Vergleich: Wenn eine Fliege an der Windschutzscheibe eines fahrenden Autos zergitscht, dann verlangsamt sie das Auto um rund 0,0005% (bei einem 1000 kg Auto und einer 2.5 g Fliege).


Was ich damit sagen will ist nicht, dass man Code absichtlich langsam machen muss, aber solche Mikrooptimierungen sind nichts, worüber man sich heutzutage noch Gedanken machen muss.
Wenn es um einen Codeteil geht, der pro Frame mehrere tausend Mal aufgerufen wird (wie z.B. Teile eines A* o.Ä.), dann können solche Optimierungen schon manchmal sinnvoll sein, aber wenn es nur um was geht, was ein mal pro Frame oder noch seltener aufgerufen wird, dann ist sowas vollkommen egal.

Die meisten Programmierer haben ein übertriebenes Verständnis davon, was Rechenzeit kostet, und unterschätzen stark was ihre Arbeitszeit kostet (vor allem, wenn es ein Hobbyprojekt ist).
Da sitzt man dann öfters mal eine halbe Stunde dran, um ein paar hundert Byte rauszukitzeln. Absolut unnötig.
Schlimm ist das besonders, wenn durch solche unnötigen Mikrooptimierungen der Code unleserlicher wird, was dann im Laufe des Rests des Projekts noch mehr Zeit kostet.

Das kommt daher, dass viele Leute angefangen haben zu programmieren, wie Speicher und Rechenzeit tatsächlich noch sehr knapp waren.
Denk zurück an den C64, den doch noch sehr viele Leute hier erlebt haben, oder zumindest die "Mentoren" von vielen Leuten hier noch erlebt haben. Dort gab es 64 KB RAM, von denen ein Gutteil für das System weggefallen ist. Hat man z.B. in Comodore Basic v2 programmiert, dann waren nur knapp 38 KB verfügbar.
Verliert man in so einem System ein paar hundert Bytes, dann macht das wirklich was aus.

Seit dem sind die Speichergrößen über drei Jahrzehnte hinweg exponentiell gewachsen, das Gefühl vieler Programmierer aber nicht.
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragFr, März 28, 2014 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Ich bin natürlich auch für aussagekräftige Dateinamen, aber wenn Sie zu lange sind schaden sie eindeutig dem Verständnis der Codestelle. Also ich kann hier wirklich beim besten Willen nicht mehr erkennen, worum es hier geht:

BlitzBasic: [AUSKLAPPEN]
         If el_ko_weiter_text(auswahl_ep_runde_exakt,i)<>"i.E." Then;Wer kam weiter?
If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)>el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
el_ko_weiter(auswahl_ep_runde_exakt,i)=2
Else If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)<el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i) Then
el_ko_weiter(auswahl_ep_runde_exakt,i)=1
Else If el_ko_h_tore(1,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(2,auswahl_ep_runde_exakt,i)=el_ko_h_tore(2,auswahl_ep_runde_exakt,i)+ el_ko_a_tore(1,auswahl_ep_runde_exakt,i)


Da finde ich das kurzzeitige "Umtuppern" auf lokale Namen sehr sinnvoll:
H1 ist ja nicht einfach ein Buchstabe, sondern steht "für Heimspiel 1", usw...
BlitzBasic: [AUSKLAPPEN]
         If T<>"i.E." Then;Wer kam weiter?
If (H1+A2)>(H2+A1) Then
Weiter=2
Else If (H1+A2)<(H2+A1) Then
Weiter=1
Else If H1+A2=H2+A1 Then;Nach Auswärtstoren
If A2>A1 Then
Weiter=2
Else
Weiter=1
End If
End If



Dem kann ich eigentlich nur beipflichten.
Oben genannte struktur, die direkt funktionsaufrufe mit langen variablennamen verwendet verläuft sich einfach.
Bei sowas passieren mir auch die meisten fehler - entweder sind die variablennamen ähnlich (beispiel: TileOffsetX vs TileOffsetY) oder die operatoren sind einfach verdreht ( > vs < ).
Wenn der komplette baum ähnlich aussieht erkennt man die meisten fehler nicht auf anhieb und muss alles nochmal perfiede durchlesen. Und da man den code ja geschrieben hat, bildet man sich das meiste dazu - man überliest die fehler und bildet es richtig aus dem gedächtnis nach.

Hier kann tatsächlich das "umtuppern" auf lokale variablen hilfreich sein.
Mein generelles vorgehen bei solchen funktionen:
1) Einen mehrzeiligen kommentar, der grob die schritte der funktion durchgeht. Diehnt als mindmap / zur übersicht.
2) Globale referenzen die durch rückgabe von funktionen geholt werden, werden am anfang der funktion - oder wenn nötig, am anfang der schleife in aussagekräftige variablen gepackt.
3) Im weiteren code der funktion werden einzig und ausschließlich die variablen verwendet.

Beispiel (pseudocode, evtl ist die syntax falsch)
Code: [AUSKLAPPEN]
'######################
; Bestimmt das gewicht der äpfel.
; Hierzu werden peters und Anjas äpfel verglichen und der entsprechende name zurückgegeben.
;#######################
Function GetAppleName:String()
        ;Gewicht von Peters apfel bestimmen. Es wird der Erste Apfel vom Zweiten Baum des Dritten Feldes genommen.
         Local Gewicht_PeterApfel:Int = CalcAppleWeight(1,2,3, PETER)

        ;Gewicht von Anjas Apfel bestimmen. Es wird der Zweite Apfel vom Zweiten Baum des Dritten Feldes genommen.
         Local Gewicht_AnjaApfel:int = CalcAppleWeight(2,2,3, ANJA)

         If Gewicht_PeterApfel  >  Gewicht_AnjaApfel then Return "Peter"
         If Gewicht_AnjaApfel   >  Gewicht_PeterApfel then Return "Anja"
         if Gewicht_AnjaApfel   =  Gewicht_PeterApfel then Return "Anja;Peter"

         return ""
end function


Klar, ein sehr schnödes beispiel. Und vorallem: Warum wollte man das wissen? Smile
Aber: Die lokalen variablen lassen sich besser lesen als die selbe struktur mit den funktionsaufrufen für "CalcAppleWeight".
Weitere kleinigkeit: Ich bevorzuge stehts leerzeichen zwischen variablen und operatoren, weil sich diese besser lesen lassen. Aber nunja, jedem seinen stil.


Andererseits kann ich mich auch nur dem verwenden eines Arrays für diverse dinge anschließen.
Beim groben überfliegen des codes fällt auf, das viele bedingungen fixwerte setzen, dh für fall A wird wert 1 gesetzt, für fall B und C wird wert 2 gesetzt undsoweiter.

Ich weiß nicht genau, ob Blitz+ Constante unterstüzt, aber die sind immer begrüßenswert mit solchen lookup tables.
(Nachtrag: Laut der HILFE gibt es const.)

In solchen consts kannst du die indexzahlen des arrays speichern und als "name" im code verwenden.
Das hilft wiederrum der übersichtlichkeit, solange die namen brauchbar gewählt sind. Mit der passenden IDE (IDEal ist wahrscheinlich eine solche) wird es auch nicht weiter schwer, diese consts zu verwenden.
Ratenswert ist hier aber: Mach dir selbst klar, was Consts sind und welche nicht. Üblicherweise sind Constante werte groß geschrieben:
FLAG_MANNSCHAFT_1
FLAG_MANNSCHAFT_2
etc.
weiter: Wenn du für identische sachen immer mit dem selben prefix (hier: FLAG_) anfängst, wird es nacher leichter diese wiederzufinden, da du immer nur FLAG_ eintippen musst und per autovervollständigunsliste eine auswahl angezeigt bekommst.



Aaaaaaber:
Solche "übersichtlichkeitsverbesserungen" helfen sehr wahrscheinlich nicht bei dem problem, das ab ein paar hundert zeilen code deine IDE anfängt zu laggen.
Hier kann ich mich nur der meinung meiner Vorrender anschließen: Es ist am wahrscheinlichsten, das hier eine Mischung aus zu alter IDE und zu neuem OS zu problemen führt.
Eventuell findet sich ja jemand, der bereits IDEal unter Win8 zum laufen gekriegt hat. Hast du zugriff auf einen rechner mit älterem windows? Du könntest hier mal testen, ob es wirklich am OS liegt.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group