struct initialisieren - bitte um Hilfe



  • Hi,
    ich möchte ein struct TestParms initialiseren und die Member mit memcpy/memset befüllen. Anschliessend ein Pointer erstellen auf den Memory-Beginn des struct, um es als Aufrufparameter für ein Cobol-Modul zu benutzen. Würde unteres Konstrukt funktionieren? Ich bin noch relativ neu und habe es so einfach wie möglich versucht.

    Header.h
    
    class TestHandler
    {
        public:
            struct TestParms
            {
                TestHandlerParms(void)
                    throw();
             
                char m_eyeCatcher[8];
                char m_version[4];
                char m_MessagePtr[sizeof(void *)];
                char m_TargetEntity[3];
            };
    }
    ...
    //------------------------------------------------
    Main.cpp
    ...
    
    TestParms MsgParms;
    
    memcpy(MsgParms.m_eyeCatcher, validEyeCatcher, sizeof(MsgParms.m_eyeCatcher));
    memcpy(MsgParms.m_version, version_1_0, sizeof(MsgParms.m_eyeCatcher));
    memcpy(MsgParms.m_MessagePtr, &data, sizeof(MsgParms.m_eyeCatcher));
    memset(MsgParms.m_TargetEntity, ' ', sizeof(MsgParms.m_eyeCatcher));
    ...
    TestParms * testParmsPtr = &MsgParms;
    //in COBOL muss man ein Bit hinzufügen, bevor man den Aufruf machen kann
    TestParms * addTestParmsPtr = (TestParms *)(((int)testParmsPtr) | 0x80000000);
    ...
    


  • Warum memcpy? Das ist C und kein C++. Jede deiner Zuweisungen müsste mit einem Operator funktionieren.



  • @Joe1903 sagte in struct initialisieren - bitte um Hilfe:

    TestHandlerParms(void)
    throw();

    void in Klammern für 0 Argumente ist nur in C, nicht in C++ nötig.
    das throw() ist seit C++11 deprecated in inzwischen nicht mehr gültig. Vergleiche https://en.cppreference.com/w/cpp/language/except_spec und https://en.cppreference.com/w/cpp/language/noexcept_spec



  • @axels sagte in struct initialisieren - bitte um Hilfe:

    Warum memcpy? Das ist C und kein C++. Jede deiner Zuweisungen müsste mit einem Operator funktionieren.

    Könntest du mir evtl. ein Beispiel geben? Und würde es so "rein technisch" funktionieren?
    Ich muss eine Änderung in ein Programm machen, was mehr als 20 Jahre alt ist und den Stil beibehalten.. Macht kein Sinn ich weiss, aber naja..



  • @wob sagte in struct initialisieren - bitte um Hilfe:

    @Joe1903 sagte in struct initialisieren - bitte um Hilfe:

    TestHandlerParms(void)
    throw();

    void in Klammern für 0 Argumente ist nur in C, nicht in C++ nötig.
    das throw() ist seit C++11 deprecated in inzwischen nicht mehr gültig. Vergleiche https://en.cppreference.com/w/cpp/language/except_spec und https://en.cppreference.com/w/cpp/language/noexcept_spec

    Das ist bereits 20 Jahre alter Code, bei dem ich eine Änderung hinzufügen, jedoch den Stil beibehalten muss.
    Würde es aber rein technisch funktionieren? Es ist ein c89 Compiler nebenbei bemerkt.


  • Mod

    @Joe1903 sagte in struct initialisieren - bitte um Hilfe:

    Würde es aber rein technisch funktionieren?

    Das sollte nicht einmal compilieren. Dann kann's ja auch nicht funktionieren. Wenn wir annehmen, dass du uns hier nicht den richtigen Code zeigst und du tatsächlich irgendwo compilierbaren Code hast, der nur so ähnlich aussieht, wie das was du uns hier zeigst: Vielleicht? Wir kennen ja nicht die Konventionen deines Cobol-Moduls. Vielleicht hast du sie passend umgesetzt, vielleicht nicht. Aber: Die Klassendefinition ist schon irgendwie schräg. Ich habe Zweifel dass die wirklich so aussehen soll.

    Es ist ein c89 Compiler nebenbei bemerkt.

    Nein, ist es nicht. Das ist mindestens mal ein C++-Compiler, sonst scheitert es schon an Zeile 1. Du willst und solltest wahrscheinlich C machen, hast aber C++ gemacht. Ich habe doch Zweifel, dass eine Cobol-API mit C++-Sprachelementen zurecht kommt.

    Komischerweise fragst du auch im C++-Forum, obwohl wir auch ein C-Forum haben. Was soll es denn wirklich sein? C und C++ sind ganz unterschiedliche Sprachen. Daher musst du schon ganz genau wissen, dass und welche Unterschiede es gibt, bevor du entscheiden kannst.



  • @Joe1903 sagte in struct initialisieren - bitte um Hilfe:

    Und würde es so "rein technisch" funktionieren?

    Nein, alleine folgender Code funktioniert nur auf gut Glück.

    TestParms * testParmsPtr = &MsgParms;
    //in COBOL muss man ein Bit hinzufügen, bevor man den Aufruf machen kann
    TestParms * addTestParmsPtr = (TestParms *)(((int)testParmsPtr) | 0x80000000);
    

    Liegt die Adresse von MsgParms beispielsweise an der Adresse 0x90000000, so wird deine Cobal Funktion aus der Adresse 0x90000000 entweder die Adresse 0x10000000 (Bit wieder abziehen) oder vermutlich die Adresse 0x0000 (16 Bit Adressen) machen und danach zugreifen. Eine Access Violation wäre die Folge.

    Das ganze ist ein ziemlich böser Hack.



  • @Joe1903 sagte in struct initialisieren - bitte um Hilfe:

    memcpy(MsgParms.m_eyeCatcher, validEyeCatcher, sizeof(MsgParms.m_eyeCatcher));

    also wenn du memcpy(&(MsgParms.m_eyeCatcher), &validEyeCatcher, sizeof(MsgParms.m_eyeCatcher));aufrufen würdest, müsste das eigentlich gehen - vorausgesetzt sowohl MsgParms als auch validEyeCatcher liegen als lokale variablen vor. strukturen kannst du aber auch initialisieren, indem du sowas schreibst:

    struct MeineStruktur ms = {
                                   .var0 = 0,
                                   .var1 = 1,
                                   //usw. usf.
                              };
    

Anmelden zum Antworten