Crossplattform-Kompatibilität einfacher als gedacht?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von Regenduft »

Hallöle miteinander,

ist mir ja fast peinlich solche scheinbaren Absolutanfängerfragen zu stellen, aber ich vermute, dass ich nicht der einzige bin, der hier herumrätselt:

Ich bin gerade am grübeln, ob ich mir nicht immer viel zu viel Arbeit mache, wenn ich versuche crossplatform-kompatibel zu programmieren.

Zum einen das alte leidige Thema "/" und "\" in Dateipfaden. Ich habe immer mal wieder von Zeit zu Zeit absichtlich (ja... oft auch unabsichtlich...) unter Windows statt "\" ein "/" verwendet. Und was ist passier? Ganichts... alles funktioniert fehlerfrei...

Code: Alles auswählen

reset$ = GetCurrentDirectory()

Debug GetCurrentDirectory()     ; C:\Program Files\PureBasic\
Debug FileSize("..\PureBasic")  ; -2
Debug FileSize("../PureBasic")  ; -2
Debug ""
Debug FileSize("C:/Program Files\PureBasic/compilers")  ; -2 (sogar beim Mischen!)
Debug ""

SetCurrentDirectory(reset$)
SetCurrentDirectory("\")
Debug GetCurrentDirectory()     ; C:\

SetCurrentDirectory(reset$)
SetCurrentDirectory("/")
Debug GetCurrentDirectory()     ; C:\
Daher Die Frage: Kann ich mir "\" nicht einfach sparen und stattdessen immer "/" verwenden? Wenn Windows wirklich IMMER mit dem Forward-Slash klarkommt, warum dann überhaupt noch Backslashes nutzen? Das hätte z.B. folgende Vorteile:
  • Der Code ist übersichtlicher, da kein CompilerIf und/oder Slashkonstanten verwendet werden müssen
  • Relative Pfade, welche man z.B. in einer Prefereces-Datei speichert können ohne Bearbeitung zwischen Windows, Linux und MacOS ausgetauscht werden
  • Wenn HTTP ins spiel kommt, läuft man wenier Gefahr die Slashes durcheinanderzubringen und...
  • ...man braucht nicht ständig hin- und her zu konvertieren, wenn man z.B. Verzeichnisstrukturen vergleicht oder kopiert
  • Shift+7 ist beidhändig bzw. symmetrisch erreichbar; AltGr+ß nicht bzw. nur über den Umweg Strg+Alt+ß
  • usw. usf.
Kann es also sein, dass ich hier wirklich einfach zu archaisch arbeite bzw. zu misstrauisch gegenüber Windows bin, dass es zu Problemen kommen könnte? Schließlich habe ich auch schon oft auf MSDN zu irgendwelchen APIs gelesen, dass ausdrücklich "\" und "/" komplett gleichwertig sind (allerdings immer auf die jeweilige API bezogen).

Das zweite ist das EOL-Thema, also #CRLF$ oder nur #LF$. Auch hier scheint Windows keine Probleme zu machen (außer "Notepad.exe"!) und ich meine, dass ts-soft mal erwähnte, dass auch Linux immer #CRLF$ problemlos frisst.

Code: Alles auswählen

a$ = "#LF$"  + #LF$  +#LF$
a$ = "#CRLF$"+ #CRLF$+#CRLF$
a$ = "#CR$"  + #CR$  +#CR$    ; <- nur zur Vollständigkeit...
For i = 1 To 10
  a$ + "Zeile " + Str(i) + #LF$
  b$ + "Zeile " + Str(i) + #CRLF$
  c$ + "Zeile " + Str(i) + #CR$
Next

If OpenWindow (0,   0, 0, 300, 180, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0,   0, 0, 100, 180)
  EditorGadget(1, 100, 0, 100, 180)
  EditorGadget(2, 200, 0, 100, 180)
  SetGadgetText(0, a$) ; OK! 10 Zeilen
  SetGadgetText(1, a$) ; OK! 10 Zeilen
  SetGadgetText(2, a$) ; OK! 10 Zeilen
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
CloseWindow(0)

MessageRequester("bla", a$) ; OK! 10 Zeilen
MessageRequester("bla", b$) ; OK! 10 Zeilen
MessageRequester("bla", c$) ; OK! 10 Zeilen
Was meint den hier die Community? Ist das ganze krampfhafte OS-bezogene programmieren wirklich nötig? Hat jemand da schon "längere Erfahrung"?

Durch kommerzielles Interesse Seitens MS und "das Linux-Internet" sollte Windows doch eingentlich damit umgehen können (die waren ja schon immer bemüht sogar die Fehler der Programmierer OS-seitig zu korrigieren!).

Und im Bezug auf EOLs sollte der OpenSource- und Community-Gedanke doch eigentlich bei Linux zum gleichen Ergebnis geführt haben.

Bei Apple bin ich mir unsicher... aber eher aus einer subjektiven Antipathie heraus. :wink:

PS: Was machen die obigen Codes eigentlich unter Linux? Habe hier gerade kein lauffähiges PureBasic unter Linux.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von RSBasic »

Nur leider funktioniert es bei Requestern/Dialogen nicht. Da muss man unter Windows trotzdem "\" verwenden.
Wie sieht es eigentlich umgekehrt aus? Funktioniert eigentlich unter Linux, wenn man stattdessen bei Pfadangaben "\" nutzt?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von NicTheQuick »

Umgekehrt funktioniert es nicht. Man kann nämlich in Linux alle Zeichen außer '/' in Dateinamen benutzen, das heißt '\' ist ein erlaubtes Zeichen für einen Dateinamen.

Beweis:
Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von Regenduft »

RSBasic hat geschrieben:Nur leider funktioniert es bei Requestern/Dialogen nicht.
Oh ja! Danke! Das führt zu richtig schön unberechenbarem Verhalten... Somit bleibt es wohl wie es ist: "\" und "/" sind immernoch die "Weltentrenner".

Code: Alles auswählen

a$ = "C:/Program Files/PureBasic/PureBasic.chm" ; /
b$ = "C:\Program Files\PureBasic\PureBasic.chm" ; \
c$ = "C:\Program Files/PureBasic\PureBasic.chm" ; \ / ...
d$ = "C:/Program Files\PureBasic/PureBasic.chm" ; / \ ...

Debug GetPathPart(a$) ; -> C:/Program Files/PureBasic/
Debug GetPathPart(b$) ; -> C:\Program Files\PureBasic\
Debug GetPathPart(c$) ; -> C:\Program Files/PureBasic\
Debug GetPathPart(d$) ; -> C:/Program Files\PureBasic/
Debug ""
                                    ; Startet mit: 
OpenFileRequester("", a$, "*.*", 0) ; -> C:\Program Files\PureBasic\
OpenFileRequester("", b$, "*.*", 0) ; -> C:\Program Files\PureBasic\PureBasic.chm
OpenFileRequester("", c$, "*.*", 0) ; -> C:\Program Files\PureBasic\PureBasic.chm 
OpenFileRequester("", d$, "*.*", 0) ; -> C:\Program Files\PureBasic\

PathRequester("", GetPathPart(a$)) ; -> C:\Users\[Name]\
PathRequester("", GetPathPart(b$)) ; -> C:\Program Files\PureBasic\
PathRequester("", GetPathPart(c$)) ; -> C:\Users\[Name]\
PathRequester("", GetPathPart(d$)) ; -> C:\Users\[Name]\
Danke auch an NicTheQuick!

Aber wie sieht es jetzt eigentlich mit dem EOL aus? Ist ja nicht so "low level" wie Pfad-Trenner. Aber gerade bei Linux verfüge ich da über Null Erfahrungen...

PS: Kann es sein, dass GetPathPart() auf Linux nicht berücksichtigt, dass "\" ein legaler Teil eines Dateinamens ist?
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von NicTheQuick »

Standard ist bei Linux ja eigentlich LF, aber bisher hat noch jeder Editor, mit dem ich gearbeitet habe, die Zeilentrennung korrekt erkannt und auch wieder nach einer Änderung richtig in die Datei geschrieben.

Interessant finde ich aber folgendes:

Code: Alles auswählen

Debug "1. Zeile" + #LF$ + "2. Zeile"
Debug "--"
Debug "1. Zeile" + #CR$ + "2. Zeile"
Debug "--"
Debug "1. Zeile" + #LFCR$ + "2. Zeile"
Das sieht bei mir dann so aus:
Bild
Wie sieht es denn da unter Windows aus?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von RSBasic »

Ebenfalls so.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von STARGÅTE »

Die Doppelzeile kommt ja nur, weil es falschrum ist, muss ja wenn dann: #CRLF$ sein.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von NicTheQuick »

Hoppala :oops:
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Crossplattform-Kompatibilität einfacher als gedacht?

Beitrag von Nino »

Regenduft hat geschrieben:Aber wie sieht es jetzt eigentlich mit dem EOL aus? Ist ja nicht so "low level" wie Pfad-Trenner. Aber gerade bei Linux verfüge ich da über Null Erfahrungen...
Ich denke, das lässt sich nicht pauschal beantworten.
Zwar wird z.B. unter Windows standardmäßig CRLF verwendet und unter Linux LF, aber letztlich hängt es von jedem einzelnen Programm ab, wie es CR, LF und CRLF verarbeitet. Bei einem Cross-Platform-Programm würde ich normalerweise darauf achten, dass es beim Lesen von Dateien diesbezüglich möglichst robust ist, d.h. dass die Versionen auf allen beteiligten Betriebssystemen sowohl CR, LF als auch CRLF als Zeilenumbruch interpretieren. Beim Schreiben ist die Situation schwieriger, denn man muss sich für eine Variante entscheiden. Außerdem gibt es z.T. spezielle Regeln, so darf z.B. ein Programm das E-Mails erzeugt und verschickt gemäß RFC 2822 für den Zeilenumbruch nur CRLF verwenden, unabhängig vom Betriebssystem.
Antworten