Verständnisproblem mit namespace



  • Hi

    hier mal die Datei:

    // TestFuncDll.cpp
    // compile with: /EHsc /link freemodbus.lib

    #include<windows.h>
    #include<iostream>

    #include "modbus.h"

    using namespace std;

    int main(){

    printf("Test\n");

    return 0;
    }



  • Denke daran auch in der .cpp Datei den namespace anzugeben:

    // Header:
    
    #ifdef MYPROJECT_EXPORTS
    #define MY_DLL_EXPORT __declspec(dllexport)
    #else
    #define MY_DLL_EXPORT __declspec(dllimport)
    #endif
    
    namespace foo
    {
       class MY_DLL_EXPORT bar   {
       public:
              void hello();
       };
    }
    
    // Source Datei:
    #include "foo.h"
    
    //Entweder:
    void foo::bar::hello()
    {
    }
    
    // oder:
    namespace foo
    {
        void bar::hello()
        {}
    }
    

    HTH



  • Markus82 schrieb:

    hier mal die Datei:

    Kann ich nicht reproduzieren.

    Kannst du mal zum Test die Includedirektive durch den Inhalt von modbus.h ersetzen?



  • So da bin ich wieder. Hatte leider einpaar Probleme mit meiner Internetverbindung 😞

    @MFK
    Kannst du mir erklären was ich da genau machen muss um die Includedirektive durch den Inhalt von modbus.h zu ersetzen? Bin noch relativ am Anfang meiner Programmierlaufbahn :D.

    @Scorcher24
    Danke dir für dein Code Beispiel. Werde das gleich mal ausprobieren :). Ich glaube das wird eine lange Nacht 🙄
    Kann ich den einfach den Namen foo inkludieren? Ich dachte das gut nur wenn man bei der .h Datei am Anfang #ifndef __DATEI_H, #define __DATEI_H und am Ende #endif stehen hat? Bin ein bischen verwirrt 😞



  • Markus82 schrieb:

    Kannst du mir erklären was ich da genau machen muss um die Includedirektive durch den Inhalt von modbus.h zu ersetzen?

    Du ersetzt die Zeile, in der #include "modbus.h" steht, durch das, was in modbus.h steht.



  • So hier mal der Quellcode:

    ->modbus.h

    //modbus.h
    
    #ifndef __MODBUS_H_
    #define __MODBUS_H_
    
    #if defined(_MSC_VER)
    #include<windows.h>
    #define DLL extern "C" __declspec(dllexport)
    #else
    #define DLL
    #endif
    
    DLL void usMBCRC16();
    
    #endif
    

    ->mbcrc.cpp
    (Dies ist die Datei deren Funktion ich später aus der DLL heraus nutzen möchte)

    #include "port.h"
    
    static const UCHAR aucCRCHi[] = {
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40
    };
    
    static const UCHAR aucCRCLo[] = {
        0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
        0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
        0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
        0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
        0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
        0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
        0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
        0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 
        0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
        0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
        0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
        0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
        0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 
        0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
        0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
        0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
        0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
        0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
        0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
        0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
        0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
        0x41, 0x81, 0x80, 0x40
    };
    
    USHORT
    usMBCRC16( UCHAR * pucFrame, USHORT usLen )
    {
        UCHAR           ucCRCHi = 0xFF;
        UCHAR           ucCRCLo = 0xFF;
        int             iIndex;
    
        while( usLen-- )
        {
            iIndex = ucCRCLo ^ *( pucFrame++ );
            ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] );
            ucCRCHi = aucCRCLo[iIndex];
        }
        return ( USHORT )( ucCRCHi << 8 | ucCRCLo );
    }
    

    Bin ziemlich am verzweifeln :(. Habe mal versucht die h. Datei anders zu schreiben.

    @Scorcher24
    Deine Version ist aber mit Hilfe von C++ ?

    Trotz intensivem Lesen und Forenbeiträgen durchsuchen hab ich immer noch Schwierigkeiten :/. Danke euch aber für eure tolle Hilfe 🙂 !



  • Markus82 schrieb:

    @Scorcher24
    Deine Version ist aber mit Hilfe von C++ ?

    Sie ist genauso viel beziehungsweise wenig C++ wie deine. DLL,Lib,so... sind allesamt nicht im Ansi C++ Standard definiert. Was möglich ist und was nicht ist daher abhängig vom Betriebssystem und Compiler.



  • Markus82 schrieb:

    So hier mal der Quellcode:

    Der ist ja nun komplett anders. Ein Problem mit namespace kann's nicht mehr geben, weil namespace nicht mehr auftaucht. Der Header wird auch gar nicht mehr eingebunden.

    Was ist also das Problem mit diesem Code?



  • @MFK:

    So hab im letzten Post versucht das so zu machen wies bei Wiki steht :/. Aber dem Code kriege ich jetzt die Fehlermeldung Syntaxfehler 'Zeichenfolge' . Woraufhin ich gegoogelt habe und herausfand das die Dateien cpp sein müssen. Nun verschwindet der Fehler aber ich bekomme dann mehrere LInker fehler über nicht aufgelöste externe Symbole ??...

    Also mein Problem ist das ich nicht weis was alles C ist und was schon C++ und was man bei den entsprechenden Implementationen beachten muss 😕 bzw. das anscheinen durcheinander Werfe bzw. Schwierigkeiten hab das auseinander zu halten.
    Weshalb der letzte Code den ich gepostet habe anders ist. Vielleicht könntest du mir einpaar grundsätzliche Tipps geben auf was ich beim implementieren achten muss ?





  • @MFK
    Danke dir für den Link und für deine / eure Hilfe. Den Link hab ich durchgearbeitet und auch soweit gut verstanden. Wie ist das den wenn ich nun sagen wir mal 10 verschiedene cpp und h Dateien hab. Wie muss ich da vorgehen um die zu einer DLL zumachen?
    Was genau haben den die Kommentarzeilen über dem Code zu bedeuten, also z.B.

    // MathFuncsDll.cpp
    // compile with: /EHsc /LD
    

    Hab das versucht auf der MS Seite nachzuvollziehe werde aber nicht so wirklich schlau draus :/.


Anmelden zum Antworten