OemToChar funzt nicht in einer UserLib

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

OemToChar funzt nicht in einer UserLib

Beitrag von Josef Sniatecki »

Hallo,

melde mich mal wieder mit einem Fehler der bei mir aufgetreten ist.

Folgendes habe ich in einer UserLib verwendet. Zum kompilieren habe ich
TailBite genommen:

Code: Alles auswählen

ProcedureDLL.s OemToChar(String.s)
  Protected Result.s=Space(String)
  
  OemToChar_(@String,@Result)
  ProcedureReturn Result
EndProcedure
Diese Funktion wandelt einen eigegebenen String aus der Konsole in
normale Zeichen um (da die Konsole ein anderes Format unterstützt).

Das Problem ist, dass das einfach nach der erstellung der UserLib
nicht richtig funzen will:

Code: Alles auswählen

OpenConsole()
Debug OemToChar(Input())
Wenn ich "ä" eingebe, dann zeigt er mir was ganz komisches in der Debugger-Anzeige an, was eigentlich nicht sein soll.

Programmiere ich in die UserLib den umgekehrten Befehl "CharToOem",
dann kann ich diesen einwandfrei benutzen. Es funktioniert also
"PrintN(CharToOem("ä"))".



Also meine Frage ist: Wieso funktioniert "OemToChar_" in einer UserLib
nicht richtig? Ist das ein API-Problem? Ein Fehler von mir? Oder ist das
ein Fehler an TailBite?

Danke im Voraus
Gruß Josef
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Könnte ein TailBite problem sein, kann ich aber nicht testen, vielleicht
probierste mal eine neuere Version.

Andere Frage: Warum machste aus einem simplen Einzeiler

Code: Alles auswählen

OemToChar_(@string, @string)
Eine IMHO etwas umständliche Funktion in einer Userlib?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

ts-soft hat geschrieben:Könnte ein TailBite problem sein, kann ich aber nicht testen, vielleicht
probierste mal eine neuere Version.

Andere Frage: Warum machste aus einem simplen Einzeiler

Code: Alles auswählen

OemToChar_(@string, @string)
Eine IMHO etwas umständliche Funktion in einer Userlib?
achso, stimmt... Schönheitsfehler. Bin der gleichen Meinung, dass es ein
Fehler an TailBite sein könnte. Denn wenn ich die Funktion als Include
nutze oder direkt in den Code einfüge, dann funzt sie.

Mal sehen was die anderen sagen.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Bisonte
Beiträge: 2466
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Also nee....

Das von euch keiner drüber gestolpert ist....

Code: Alles auswählen

Protected Result.s=Space(String) 
Das geht doch gar nicht .... bei Space muss doch eine Zahl(die anzahl der Spaces) in den Klammern stehen und kein String.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bisonte hat geschrieben:Also nee....

Das von euch keiner drüber gestolpert ist....
Naja, wird ja auch vom Compiler angemeckert :mrgreen:
Nach sowas ... hab ich garnicht ausgeschaut :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10712
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Bisonte hat geschrieben:Das von euch keiner drüber gestolpert ist....
Josef Sniatecki hat geschrieben:Denn wenn ich die Funktion als Include
nutze oder direkt in den Code einfüge, dann funzt sie.
soviel dazu :-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

OK. Aber das ist nicht der Grund. War halt nur ein Schreibfehler.

Also, hier nochmal richtig:

Code: Alles auswählen

ProcedureDLL.s OemToChar(String.s)
  OemToChar_(@String,@String)
  ProcedureReturn String
EndProcedure
Und genau so habe ich das jetzt in einer UserLib kompiliert und trotzdem
funzt es einfach nicht. Also die Funktion wird zwar korrekt aufgerufen, jedoch
ist das Ergebnis nicht richtig. So als ob das "OemToChar_" ignoriert werden
würde.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

Aus der PB-Hilfe:

Hinweise zur Rückgabe von Strings aus DLL's:

Bei der Rückgabe von Strings aus einer DLL-Funktion muß der String als Global deklariert sein.
Beispiel:

Global ReturnString$

ProcedureDLL.s MyFunction(var.s)
ReturnString$ = var + " test"
ProcedureReturn ReturnString$
EndProcedure

Ohne die Deklaration als Global ist der String nur Lokal in der ProcedureDLL verfügbar und kann somit nicht außerhalb verwendet werden.

Bei der Verwendung von CallFunction() (oder einer ihrer verwandten CallXXX-Funktionen) auf eine DLL-Funktion wird bei der Rückgabe eines Strings immer ein Zeiger auf diesen zurückgegeben, welcher mit PeekS() ausgelesen werden muss.
Beispiel:

String.s = PeekS(CallFunction(0,"FunctionName",Parameter1,Parameter2


Vielleicht hängts ja da dran...
Win11 64Bit / PB 6.0
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

Ich kann zwar nicht gut genug Englisch, jedoch konnte ich entnehmen das
da was nicht TailBite stimmt.

@alter mann
Habe das Resultat als global definiert. Trotzdem will es nicht richtig
funzen. So wie ich weiß gilt das auch nur für einen Aufruf durch Call...
und nicht für Prototypen und UserLibs.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Antworten