Was mache ich Falsch?Oder Bug!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Nighthawk
Beiträge: 13
Registriert: 13.05.2006 14:51
Wohnort: Saarland

Was mache ich Falsch?Oder Bug!

Beitrag von Nighthawk »

Hallo,

ich brauche mehrere Rückgabewerte aus einer Funktion,beim probieren
bin ich über folgendes gestolpert


EnableExplicit
Define mytest.s=""

Procedure TestString(*test.s)

*test="Teststring"

EndProcedure

;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest

;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest


Hab ich nun was übersehen oder geht sowas nicht mit PB?

Gruß
Nighthawk
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Strukture für Ergebnis übergeben.

Code: Alles auswählen

Structure udtResult
  value1.l
  value2.l
  value3.l
EndStructure

Procedure test(value.l, *Result.udtResult)

  With *Result
    \value1 = value * 10
    \value2 = value * 20
    \value3 = value * 30
  EndWith
  
EndProcedure

Result.udtresult

test(5, Result)

Debug Result\value1
Debug Result\value2
Debug Result\value3
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Also der String ist ja erstmal leer, d.h. länge 1 im Speicher. Desshalb musst du ihn erstmal durch Space(gewünschteMaximallänge) initialisieren.

Code: Alles auswählen

EnableExplicit
Define mytest.s=Space(1024)

Procedure TestString(*test.STRING)

*test\s="Teststring"

EndProcedure

;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest

;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest
So dürfte es funktionieren, tut es aber auch nicht. Warum ein "Invalid Memory Access" kommt verstehe ich hier nun wirklich nicht.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Bei Pointern und Speicherzugriffen würde ich immer mit den entsprechenden Poke-Befehlen arbeiten. Das sichert in diesem Fall ab, dass der richtige String an die richtige Speicheradresse geschrieben wird und das Ende des dort abgelegten Strings sauber nullterminiert wird.

Code: Alles auswählen

EnableExplicit 
Define mytest.s="" 

Procedure TestString(*test) 
  PokeS(*test,"Teststring")
EndProcedure 

;Erster Aufruf der Funktion ergibt nur Müll 
TestString(@mytest) 
Debug mytest 

;Zweiter Aufruf ist korekt 
TestString(@mytest) 
Debug mytest
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 »

etwas simpler, wobei die stringlänge begrenzt ist:

Code: Alles auswählen

EnableExplicit
Define mytest.s{100}

Procedure TestString(*test.s)

*test="Teststring"

EndProcedure

;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest

;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest 
hab nur das Define geändert auf FixString
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
Nighthawk
Beiträge: 13
Registriert: 13.05.2006 14:51
Wohnort: Saarland

Beitrag von Nighthawk »

Hallo,an alle!

Vielen Dank für die schnelle Hilfe.

Gruß
Nighthawk
Antworten