StdOut to StdErr

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: StdOut to StdErr

Beitrag von NicTheQuick »

Vorsicht! "MemorySize()" funktioniert nur mit Speicherbereichen, die du mit "AllocateMemory()" alloziert hast, nicht mit beliebigen Pointern.
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: StdOut to StdErr

Beitrag von ccode_new »

Ach ja!

Was ist den nun eigentlich wirklich besser?

Zeichenketten im Stack-Speicher?
Zeiger global anlegen und Speicher dann reserviern und mit einer Befreiungsfunktion wieder freigeben.
Also das Ganze im Heap-Speicher handeln.
Reallocate wäre damit ja möglich.

Die Zeiger sollten doch als Funktionsparameter von der Funktion beim beenden freigegeben werden.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: StdOut to StdErr

Beitrag von NicTheQuick »

Prinzipiell gibt es diese Möglichkeiten, wenn es dir um eine feste Speichergröße geht. Sobald es dynamisch wird, brauchst du aber immer entweder Dim oder AllocateMemory:

Code: Alles auswählen

#size = 100

Procedure temp_heap()
	Protected *mem = AllocateMemory(#size)
	PokeS(*mem, "Hello World")
	Debug PeekS(*mem)
	FreeMemory(*mem)
EndProcedure

Structure temp_mem
	b.b[#size]
EndStructure

Global _global_mem.temp_mem
Procedure temp_global()
	Debug "Old value: " + PeekS(_global_mem)
	PokeS(_global_mem, "Hello World")
	Debug PeekS(_global_mem)
EndProcedure

Procedure temp_stack()
	Protected mem.temp_mem
	PokeS(mem, "Hello World")
	Debug PeekS(mem)
EndProcedure

Procedure temp_static()
	Static mem.temp_mem
	Debug "Old value: " + PeekS(mem)
	PokeS(mem, "Hello World")
	Debug PeekS(mem)
EndProcedure

Threaded _threadsafe_mem.temp_mem
Procedure temp_threadsafe()
	Debug "Old value: " + PeekS(_threadsafe_mem)
	PokeS(_threadsafe_mem, "Hello World")
	Debug PeekS(_threadsafe_mem)
EndProcedure

Debug "## temp_heap"
temp_heap()

Debug ""
Debug "## temp_global"
temp_global()
temp_global()


Debug ""
Debug "## temp_stack"
temp_stack()

Debug ""
Debug "## temp_static"
temp_static()
temp_static()

Debug ""
Debug "## temp_threadsafe"
temp_threadsafe()
temp_threadsafe()
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: StdOut to StdErr

Beitrag von ccode_new »

Schöne Zusammenstellung!

Geht das so:

Code: Alles auswählen

Procedure.s Termi_inputbox(*this.termi_t, title.s, text.s, height.i, width.i, init.s="", options.s="")
    Protected exit.s, prog.i
    Protected *pstr, *modus
    Protected *pout.character, plen.i
    
    *pstr = UTF8(#DIALOG + " " + UnescapeString(options) + ~" --clear --title \"" + title + ~"\" --inputbox \"" + text + ~"\" " + Str(height) + " " + Str(width) + " " + UnescapeString(init) + " 3>&1 1>&2 2>&3")
    *modus = UTF8("r")
    
    If *this\run
      
      prog = popen_(*pstr, *modus)
      
      If( prog <> #Null )
        getline_(@*pout, @plen, prog)
      EndIf
      pclose_(prog)
      exit = PeekS(*pout, #PB_Any, #PB_UTF8)
      FreeMemory(*pstr):FreeMemory(*modus)
      ProcedureReturn exit
    Else
      ProcedureReturn "-1"
    EndIf
EndProcedure
,oder müsste ich einige Dinge anders machen?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten