[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.808
    Ein direktes Mapping gibt es so nicht, es ist allerdings relativ einfach:

    short -> Pic s9(4) comp-4
    long -> Pic s9(9) comp-4
    int ist meist identisch mit long.
    Float -> Pic s9(n)v9(m) comp-1
    Double -> Pic s9(n)v9(m) comp-2
    Decimal -> Pic s9(n)v9(m) comp-3

    CHAR[n] -> pic x(n)
    WCHAR[n] -> pic n(n)

    *int -> usage pointer
    *char usw.
    Pointer müssen dann auf einen Bereich des entsprechenden Types verweisen.

    Bei CHAR-Variablen (Strings) ist es halt häufig so, dass diese Nul-Terminiert sind, also am Ende ein x"00" enthalten.
    Hier hat man ggf. bei Cobol ein Problem, da Strings in der Länge häufig nicht klar definiert sind. Man muss also die max. mögliche Länge vorsehen und beim Inhalt per Inspect die Zeichen vor dem x"00" zählen und kann dann per Referenzänderung, "Varname(1:Len)" auf die Variable zugreifen.
    Bei der Übergabe setzt man den Inhalt dann per String-Funktion zusammen.

    string
    MyVar delimited by space
    x"00" delimited by size
    into MyCVar.

    Wenn allerdings Leerzeichen vorkommen können und dürfen muss die Länge per Inspect ggf. rückwärts ermittelt werden und der String dann so aussehen:

    string
    MyVar(1:Len) delimited by size
    x"00" delimited by size
    into MyCVar.

    Bei C-Strukturen ist also genau der Ursprungstyp (int, char, ...) zu kennen um das in Cobol nachzuvollziehen.
    Das Problem hierbei ist, dass in C der Typ umdeklariert werden kann wie dein obiges Beispiel ja zeigt.
    Man benötigt also tatsächlich die Ursprungsdeklaration was besonders dann schwierig wird, wenn diese auch noch kaskadiert sind.

    Zusätzlich hat C noch die Eigenheit ggf. die einzelnen Felder einer Struktur auszurichten, also z.B. an geraden Adressen, teilbar durch 2, 4 oder 16.

    der C-Programmierer braucht sich darum nicht zu kümmern, das macht ja der Compiler. Ähnliches gibt es auch für Cobol, wird aber selten verwendet.
    Ausnahme sind Pointer, die sind immer an der nächste durch 16 teilbaren Adresse ausgerichtet.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Man benötigt also tatsächlich die Ursprungsdeklaration was besonders dann schwierig wird, wenn diese auch noch kaskadiert sind.
    Ich habe die WSDL, die XSD und dann die einzelnen C-Procedure Definitionen. Das Problem liegt derzeit bei folgender Definition:

    typedef struct kundeRqType_ArrayTag {
    struct kundeRqTypeTag ** m_Array;
    int m_Size;
    AXISC_XSDTYPE m_Type;
    } kundeRqType_Array;

    Die dazugehörige kundeRqType_ArrayTag

    typedef struct kundeRqTypeTag {
    xsdc__string kundennummer;
    xsdc__long* kundeSeit;
    kundentypType kundentyp;
    xsdc__string strasse;
    xsdc__string plz;
    xsdc__string hausnummer;
    xsdc__string land;
    xsdc__string ort;
    kreditfaehigkeitType kreditfaehigkeit;
    xsdc__date* kreditfaehigkeitDatum;
    mahnstufeType mahnstufeAktuell;
    mahnstufeType mahnstufeHoechste;
    xsdc__date* mahnstufeHoechsteDatum;
    bonitaetType* uwrBonitaet;
    bonitaetType* saBonitaet;
    bonitaetType* gwbBonitaet;
    bonitaetType* externalBonitaet;
    xsdc__string gvKRatingverbundKundennummer;
    xsdc__double* gvKRatingverbundGewicht;
    kompetenzUWRType kompetenzUWR;
    personRqType* person;
    firmaRqType* firma;
    vertragRqType_Array* vertragRq;
    } kundeRqType;

    Im Cobol weiß ich nicht wie ich die kundeRqType_ArrayTag nachbauen soll, damit ich Sie dann in einem übergeben kann.
    Vor allem verstehe ich nicht, wie ich sie dem Aufruf Bonität mitgeben soll.
    Andreas
    Ein AS/400 Dinosaurier since 1989

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.808
    Jetzt wird es allerdings so kompliziert, dass es den Rahmen dieses Forums sprengt.

    Eine Variable vom Typ "**" ist ein Pointer, der auf ein Pointer-Array verweist.

    In Cobol sähe das in etwa so aus:

    01 StructArray.
    05 kundeRqTypeTag usage pointer.
    05 m_Size pic s9(9) comp-4.
    05 AXISC_XSDTYPE.
    10 ?????

    01 kundeRqTypeArr.
    05 kundeRqTypePtr usage pointer dim(10).

    01 kundeRqTypeStruct.
    05 kundeRqType.
    10 KundenNr pic x(nn).
    :

    Jetzt sind nur noch die Pointer korrekt zu initialisieren. m_Size gibt wohl die Anzahl der Verweise an.
    Was aber immer noch fehlt, sind halt die Typdefinitionen der restlichen Felder.

    Hier ist wohl Fleißarbeit angesagt.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Jetzt wird es allerdings so kompliziert, dass es den Rahmen dieses Forums sprengt.
    Was aber immer noch fehlt, sind halt die Typdefinitionen der restlichen Felder.
    Hier ist wohl Fleißarbeit angesagt.
    Danke einmal für Deine Hilfe, die Fleißarbeit ist eigentlich ganz einfach, 40 C-Procedure-Definitionsdateien durchackern und die richtigen Typen finden.
    Andreas
    Ein AS/400 Dinosaurier since 1989

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.433
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Jetzt sind nur noch die Pointer korrekt zu initialisieren.
    Das müßte mit SET ... TO ADDRESS OF ... gehen, siehe auch hier: Pointer Data Item

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.808
    Nicht zu vergessen, die Typen neu definieren und die ganzen Verpointerungen zu setzen.

    Die Frage ist ja auch, was du dann zurückbekommst.
    In diesem Fall musst du die Strukturen in der Linkage Section definieren und deren Adressen dann mit den Pointern der Rückgabe verbinden.

    Ganz schön mühsam, nur um das Ganze in Cobol zu machen, was dann anschließend keiner mehr versteht.

    Bei der Rückgabe von Strukturen und Pointern ist zu beachten, dass du gewaltige Memory Leaks bekommen kannst.
    In C werden Bereiche mit malloc() ganz einfach angelegt und mit free() wieder freigegeben.
    In C++ sieht das leider anders aus, da es hier Konstruktoren und Destruktoren gibt, die du aus Cobol nicht aufräumen kannst.

    Wenn deine Routine also häufig im selben Job läuft, kann irgendwann dein Speicher platzen.

    Lass dir doch lieber ein paar C-Routinen entwickeln, die dir dieses Mapping abnehmen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Nicht zu vergessen, die Typen neu definieren und die ganzen Verpointerungen zu setzen.

    Die Frage ist ja auch, was du dann zurückbekommst.
    In diesem Fall musst du die Strukturen in der Linkage Section definieren und deren Adressen dann mit den Pointern der Rückgabe verbinden.

    Ganz schön mühsam, nur um das Ganze in Cobol zu machen, was dann anschließend keiner mehr versteht.

    Bei der Rückgabe von Strukturen und Pointern ist zu beachten, dass du gewaltige Memory Leaks bekommen kannst.
    In C werden Bereiche mit malloc() ganz einfach angelegt und mit free() wieder freigegeben.
    In C++ sieht das leider anders aus, da es hier Konstruktoren und Destruktoren gibt, die du aus Cobol nicht aufräumen kannst.

    Wenn deine Routine also häufig im selben Job läuft, kann irgendwann dein Speicher platzen.

    Lass dir doch lieber ein paar C-Routinen entwickeln, die dir dieses Mapping abnehmen.
    Danke für Deine Hinweise, vor allem mit dem Speicher. Das mit den C-Routinen wäre ja nicht uninteressant, aber ich muss diesen Webservice aus einer online Anwendung aufrufen, die in COBOL gepinselt worden ist(1995 und später).
    Aber vielen Dank für Deine Unterstüzung, die uns schon sehr viel weitergeholfen hat. Heute habe ich Pause, bin erst morgen wieder im Büro und werde dann weiter die ganzen Mappings pinseln.
    Gruß aus dem sonnigen Wien
    Andreas
    Ein AS/400 Dinosaurier since 1989

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.808
    Du sollst dir ja nicht alles in C schreiben lassen sondern man definiert eine feste Schnittstelle zwischen COBOL und C, die mit festen Strukturen (Unicode, N(xx) und gepackte/gezonte Felder) umgeht.

    Diese C-Routine wird dann von Cobol aufgerufen, macht dann alles und übergibt das gewünschte Ergebnis wieder zurück.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Du sollst dir ja nicht alles in C schreiben lassen sondern man definiert eine feste Schnittstelle zwischen COBOL und C, die mit festen Strukturen (Unicode, N(xx) und gepackte/gezonte Felder) umgeht.

    Diese C-Routine wird dann von Cobol aufgerufen, macht dann alles und übergibt das gewünschte Ergebnis wieder zurück.
    Nochmals danke für deine fundierten Tipps und die Anregung werd ich mal morgen bei uns im Büro einwerfen, vielleicht find ich ja einen C-Programmierer, der mir das schnitzt.
    Danke vielmals.
    Andreas
    Ein AS/400 Dinosaurier since 1989

  10. #10
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von nico1964 Beitrag anzeigen
    Nochmals danke für deine fundierten Tipps und die Anregung werd ich mal morgen bei uns im Büro einwerfen, vielleicht find ich ja einen C-Programmierer, der mir das schnitzt.
    Danke vielmals.
    So Spät aber doch, mein Zugang zu dem Thema. Keinen C-Programmierer bei uns gefunden, welcher die Zeit hätte das zu schnitzen. Nochmals Dr. Google bemüht und siehe da es gibt eine COBOL-Version für das HTTP-API von Scott Klement. Dieses für meine Bedürnisse adaptiert und schon funktioniert der ganze Krempel reibungslos. Vielen Dank für eure Unterstützung und die Zeit die ihr für meine Fragen aufgewendet habt. Mein Horizont hat sich durch dieses Projekt eindeutig erweitert.
    Andreas
    Ein AS/400 Dinosaurier since 1989

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.945
    Schau mal, ob Dir vielleicht XMLSERVICE weiterhilft:

    XMLSERVICE

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  12. #12
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Schau mal, ob Dir vielleicht XMLSERVICE weiterhilft:

    XMLSERVICE

    Birgitta
    Hallo,
    danke für den LinK, aber ich glaube ich habe im Moment alles was ich brauche. Werde mir aber in einer ruhigen Minute das ganze mal genauer anschauen. Aber so wie ich das verstehe ist das ganze in RPg und ich bin halt auf der COBOL-Schiene daheim.
    Andreas
    Andreas
    Ein AS/400 Dinosaurier since 1989

Similar Threads

  1. v4 of PHP Toolkit can be downloaded from AURA
    By Hellena Smejda in forum Archiv NEWSblibs
    Antworten: 0
    Letzter Beitrag: 22-04-11, 06:20
  2. Dekleration Cobol <-> RPG
    By Xanas in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 12-01-07, 08:32
  3. Programmbibliothek in einem Cobol oder CL Programm ermitteln
    By schatte in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 10-01-07, 12:32
  4. Cobol <> RPGLE
    By Xanas in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 13-12-06, 14:38
  5. Cobol
    By Uli Müller in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 09-11-06, 10:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •