Seite 3 von 3

Re: StdOut to StdErr

Verfasst: 26.01.2022 15:08
von NicTheQuick
Vorsicht! "MemorySize()" funktioniert nur mit Speicherbereichen, die du mit "AllocateMemory()" alloziert hast, nicht mit beliebigen Pointern.

Re: StdOut to StdErr

Verfasst: 28.01.2022 18:51
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.

Re: StdOut to StdErr

Verfasst: 28.01.2022 19:50
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()

Re: StdOut to StdErr

Verfasst: 29.01.2022 14:40
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?