-
Ich glaube nicht ganz das es an dem Aufrufkonventionen liegt.
Ich habe noch ein C-Funktion erstellt welche diesmal keine String zurückgibt und auch kein CHAR * sondern zwei int Werte und bei da funktioniert das auf einmal.
C-Funktion:
int Random_Num(int iMin, int iMax)
RPGLE:
cRand PR 10I 0 ExtProc('Random_Num__FiT1')
iMin 10I 0 VALUE
iMax 10I 0 VALUE
Die Werte kommen bei dieser Funktion auch ganz normal in der C-Funktion an, deswegen glaube ich liegt es an dem *CHAR.
PS: Was ich überhaupt nicht nachvollziehen kann, wieso beim erstellen des Modules der Symbolname nicht gleich dem Funktionsnamen ist. Also Random_Num -> Random_Num und nicht wie aktuell Random_Num -> Random_Num__FiT1.
-
Hast Du eigentlich mal versucht anstatt die Parameter als Variablen oder als Pointer auf die Variablen und nicht als Konstanten zu übergeben?
Was passiert, wenn Du am Ende der Konstanten x'00' hinzufügst?
Birgitta
-
Die Diskrepanz liegt in der Definition des Return-Wertes!
XXXXX PR 50A ExtProc('XXXX') <- Ist 50A überhaupt richtig?
Die Frage habe ich überlesen.
"string" ist kein nativer C-Typ sondern eine Klasse.
C++-Klassen können aber nicht ausgetauscht werden.
Der Return-Wert ist hier auch als Pointer (* in RPGLE, CHAR* in CPP) zu definieren.
Legst du aber in CPP eine string-Klasse in der Funktion an und returnierst die Adresse, hat das aufrufende Programm direkt ein Speicherproblem, da die Klasse automatisch aufgelöst wird.
Hilfreich wäre allenfalls eine statische klasse (außerhalb der Prozedur), was aber ggf. auch nicht hilft (Mehrfachaufrufe zerstören ggf. den noch benötigten Inhalt).
Das sicherste ist ein malloc() im CPP und ein dealloc() in RPGLE.
Kommen wir nun zum Returnwert in RPGLE selber.
Das Ergebnis muss in einer Pointervariablen gespeichert werden, dann kannst du den String per %str() in eine RPG-Variable kopieren.
Anschließend mit dealloc den Speicher freigeben, da du sonst ein "Memory-Leak" produzierst, dass erst bei Jobende aufgelöst wird (temporärer Speicher).
Ob allerdings die Heapverwaltung von RPGLE und CPP identisch ist kann ich auch nicht sagen.
Vom Operator "new" (char* xVar = new char[nn]) ist abzuraten, da dieser vor der Adresse eine Längeninformation ablegt und der "delete" dies dann prüft und der dealloc das nicht kennt.
Similar Threads
-
By ExAzubi in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 02-07-14, 14:13
-
By JonnyRico in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 24-04-03, 16:54
-
By Frank in forum NEWSboard Server Software
Antworten: 0
Letzter Beitrag: 02-09-01, 11:35
-
By FGN in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 08-08-01, 11:18
-
By Helwo in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 08-08-01, 08:50
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks