Problem beim Kompilieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem beim Kompilieren

    Ich hab folgende Fehlermeldung erhalten:

    1>C_ProcessingPoint.obj : error LNK2005: "struct Movie * * Film" (?Film@@3PAPAUMovie@@A) ist bereits in C_Cinema.obj definiert.

    1>C_ProcessingPoint.obj : error LNK2005: "struct Order * NewOrder" (?NewOrder@@3PAUOrder@@A) ist bereits in C_CollectionPoint.obj definiert


    Kann mich mal jemand aufklären, was das genau heißt?

    Ich versteh nur, dass das Objekt ProcessingPoint ein struct Movie * * Film bzw. struct Order* NewOrder definiert, welches bereits im Cinema Objekt definiert worden ist.

    Wobei mir das:"struct Movie * * Film" mit dem 2fachen Stern doch seltsam vorkommt.

    Hier der Code

    S_Movies.h

    Quellcode

    1. #ifndef S_MOVIES_H
    2. #define S_MOVIES_H
    3. struct MTime
    4. {
    5. unsigned int m_Hour;
    6. unsigned int m_Minute;
    7. };
    8. struct Movie
    9. {
    10. const char* m_MovieName;
    11. unsigned int m_Seats[3];
    12. MTime* m_StartTime[3];
    13. };
    14. Movie* Film[3];
    15. #endif S_MOVIES_H
    Alles anzeigen

    S_Order.h beinhalten ungefähr das selbe
    Das: Order* NewOrder; is der einzigste Unterschied

    C_Cinema.h

    Quellcode

    1. {
    2. #ifndef C_CINEMA_H
    3. #define C_CINEMA_H
    4. class C_CollectionPoint;
    5. class C_ProcessingPoint;
    6. class C_IssuingOffice;
    7. class C_Cinema
    8. {
    9. public:
    10. C_Cinema(void);
    11. ~C_Cinema(void);
    12. C_CollectionPoint* m_CollectionPoint;
    13. C_ProcessingPoint* m_ProcessingPoint;
    14. C_IssuingOffice* m_IssueOffice;
    15. void start();
    16. void showMovies();
    17. };
    18. #endif C_CINEMA_H
    19. }
    Alles anzeigen


    ProcessingPoint.h

    Quellcode

    1. #ifndef C_PROCESSINGPOINT_H
    2. #define C_PROCESSINGPOINT_H
    3. class C_ProcessingPoint
    4. {
    5. public:
    6. C_ProcessingPoint(void);
    7. ~C_ProcessingPoint(void);
    8. bool CheckOrder();
    9. };
    10. #endif C_PROCESSINGPOINT_H
    Alles anzeigen


    in der CPP von Cinema
    Include ich S_Movies.h
    und ProcessingPoint.h

    und erstell im Konstruktor vom Cinema eine Instanz von ProcessingPoint
    m_ProcessingPoint= new C_ProcessingPoint();

    Ich hoffe ihr könnt mir helfen.
    Gruß Nobody
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Hmm wie sehen die CPP Dateien aus, was und wie Includierst du?
    Der Fehler sagt halt aus das du zwei Variablen mit dem sleben Namen hast welche er nicht unterscheiden kann.
    Du musst die Variablen in der CPP deklarieren und in den Headerdatei definieren (mit dem Schlüsselwort extern), damit beim einbinden der Headerdatei klar ist das die Variable nur einmal deklariert ist.

    Bsp:
    CPP:

    Quellcode

    1. int GlobaleVariable = 0;


    Header:

    Quellcode

    1. extern int GlobaleVariable;


    Mfg Rushh0ur
  • Das mit dem extern ist mir neu... also das es das gibt.
    Habs mal umgesetzt
    Hier der Code

    S_Order.h

    Quellcode

    1. #ifndef S_ORDER_H
    2. #define S_ORDER_H
    3. struct OTime
    4. {
    5. unsigned int m_Hour;
    6. unsigned int m_Minute;
    7. };
    8. struct Order
    9. {
    10. char* m_OrderMovie;
    11. unsigned int m_OrderSeats;
    12. OTime* m_OrderTime;
    13. };
    14. extern Order* NewOrder;
    15. #endif S_ORDER_H
    Alles anzeigen


    In S_Movies hab ich es natürlich genauso umgesetzt
    extern Order* NewOrder;
    wollte nur nicht nochmal den ganzen Code posten

    ProcessingPoint.cpp

    C-Quellcode

    1. #include "C_ProcessingPoint.h"
    2. #include "S_Order.h"
    3. #include "S_Movies.h"
    4. C_ProcessingPoint::C_ProcessingPoint(void)
    5. {
    6. }
    7. C_ProcessingPoint::~C_ProcessingPoint(void)
    8. {
    9. }
    10. bool CheckOrder()
    11. {
    12. Order* NewOrder;
    13. Movie* Film[3];
    14. for(int i = 0; i < 3; ++i)
    15. {
    16. if(Film[i]->m_MovieName == NewOrder->m_OrderMovie)
    17. {
    18. for(int j = 0; j < 3; ++j)
    19. {
    20. if(Film[i]->m_StartTime[j]->m_Hour == NewOrder->m_OrderTime->m_Hour)
    21. {
    22. if(Film[i]->m_StartTime[j]->m_Minute == NewOrder->m_OrderTime->m_Minute)
    23. {
    24. if(Film[i]->m_Seats[j] >= NewOrder->m_OrderSeats)
    25. {
    26. Film[i]->m_Seats[j] -= NewOrder->m_OrderSeats;
    27. return true;
    28. }
    29. }
    30. }
    31. }
    32. }
    33. }
    34. return false;
    35. }
    Alles anzeigen


    Cinema.cpp

    C-Quellcode

    1. #include "C_Cinema.h"
    2. #include "C_CollectionPoint.h"
    3. #include "C_IssuingOffice.h"
    4. #include "C_ProcessingPoint.h"
    5. #include "S_Movies.h"
    6. #include <iostream>
    7. #include <stdlib.h>
    8. C_Cinema::C_Cinema(void)
    9. {
    10. Film[0]->m_MovieName="Film1";
    11. Film[0]->m_Seats[0]=100;
    12. Film[0]->m_Seats[1]=100;
    13. Film[0]->m_Seats[2]=100;
    14. Film[0]->m_StartTime[0]->m_Hour=13;
    15. Film[0]->m_StartTime[0]->m_Minute=30;
    16. Film[0]->m_StartTime[1]->m_Hour=17;
    17. Film[0]->m_StartTime[1]->m_Minute=15;
    18. Film[0]->m_StartTime[2]->m_Hour=22;
    19. Film[0]->m_StartTime[2]->m_Minute=30;
    20. Film[1]->m_MovieName="Film2";
    21. Film[1]->m_Seats[0]=100;
    22. Film[1]->m_Seats[1]=100;
    23. Film[1]->m_Seats[2]=100;
    24. Film[1]->m_StartTime[0]->m_Hour=13;
    25. Film[1]->m_StartTime[0]->m_Minute=30;
    26. Film[1]->m_StartTime[1]->m_Hour=17;
    27. Film[1]->m_StartTime[1]->m_Minute=15;
    28. Film[1]->m_StartTime[2]->m_Hour=22;
    29. Film[1]->m_StartTime[2]->m_Minute=30;
    30. Film[2]->m_MovieName="Film3";
    31. Film[2]->m_Seats[0]=100;
    32. Film[2]->m_Seats[1]=100;
    33. Film[2]->m_Seats[2]=100;
    34. Film[2]->m_StartTime[0]->m_Hour=13;
    35. Film[2]->m_StartTime[0]->m_Minute=30;
    36. Film[2]->m_StartTime[1]->m_Hour=17;
    37. Film[2]->m_StartTime[1]->m_Minute=15;
    38. Film[2]->m_StartTime[2]->m_Hour=22;
    39. Film[2]->m_StartTime[2]->m_Minute=30;
    40. m_CollectionPoint = new C_CollectionPoint();
    41. m_ProcessingPoint= new C_ProcessingPoint();
    42. m_IssueOffice = new C_IssuingOffice();
    43. }
    44. C_Cinema::~C_Cinema(void)
    45. {
    46. delete m_CollectionPoint;
    47. delete m_ProcessingPoint;
    48. delete m_IssueOffice;
    49. }
    50. void C_Cinema::start()
    51. {
    52. Movie* Film[3];
    53. unsigned int Menu=3;
    54. do
    55. {
    56. system("cls");
    57. std::cout<<"Kinokarten Bestellsystem\n";
    58. std::cout<<"1: Kartenbestellen\n";
    59. std::cout<<"2: Vorführung anzeigen\n";
    60. std::cout<<"3: Beenden";
    61. std::cin>>Menu;
    62. switch(Menu)
    63. {
    64. case 1: //Order
    65. m_CollectionPoint->DoOrder();
    66. break;
    67. case 2: //Show Movies
    68. showMovies();
    69. break;
    70. case 3: //exit
    71. //delete all
    72. default: system("pause");
    73. }
    74. if(Menu==1)
    75. {
    76. if(m_ProcessingPoint->CheckOrder())
    77. {
    78. if(m_IssueOffice->SetContainer())
    79. {
    80. std::cout<<"Karten liegen zum abholen im Container bereit";
    81. system("pause");
    82. }
    83. }
    84. else
    85. {
    86. std::cout<<"Es ist ein Fehler aufgetreten";
    87. system("pause");
    88. }
    89. }
    90. }
    91. while(Menu!=3);
    92. }
    93. void showMovies()
    94. {
    95. for (int i = 0; i < 3; ++i)
    96. {
    97. std::cout<<"Filmtitel"<<Film[i]->m_MovieName;
    98. std::cout<<"\nZeiten";
    99. for(int j = 0; j < 3; ++j)
    100. {
    101. std::cout<<"\nZeit(HH:MM)"<<Film[i]->m_StartTime[j]->m_Hour;
    102. std::cout<<Film[i]->m_StartTime[j]->m_Minute;
    103. std::cout<<"\nPLaetze"<<Film[i]->m_Seats[j];
    104. }
    105. }
    106. }
    Alles anzeigen


    Nun spuckt er mir folgendes aus:

    c_cinema.cpp(63): warning C4101: 'Film': Unreferenzierte lokale Variable
    Handelt sich zwar nur um eine Warnung, aber ich glaube trotzdem das mein Programm dadurch nicht korrekt laufen wird.

    1>C_Cinema.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""struct Movie * * Film" (?Film@@3PAPAUMovie@@A)".

    struct Movie * * Film: Bedeutet das nicht eigentlich das man mit einem Pointer auf einen anderen Pointer verweist? Bin mir grad nicht sicher.
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • nobody special schrieb:

    c_cinema.cpp(63): warning C4101: 'Film': Unreferenzierte lokale Variable

    Bedeutet nur das du die Variable nicht benutzt hast.

    nobody special schrieb:

    struct Movie * * Film: Bedeutet das nicht eigentlich das man mit einem Pointer auf einen anderen Pointer verweist? Bin mir grad nicht sicher.

    Jou bedeutet es, wobei der letzter Pointer dan auf die Structur Movie verweist.


    nobody special schrieb:


    1>C_Cinema.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""struct Movie * * Film" (?Film@@3PAPAUMovie@@A)".

    Ist das nun der einzige Fehlertyp (LNK2001) der kommt?

    Also du möchtest die Variablen Movie* Film[3]; global in jeder cpp Datei verwenden.
    Dafür definierst du diese in einer CPP-Datei einmal global (nicht lokal):

    cinema.cpp

    Quellcode

    1. #include "C_Cinema.h"
    2. #include "C_CollectionPoint.h"
    3. #include "C_IssuingOffice.h"
    4. #include "C_ProcessingPoint.h"
    5. #include "S_Movies.h"
    6. #include <iostream>
    7. #include <stdlib.h>
    8. Movie* Film[3];
    9. ....
    Alles anzeigen


    Um diese nun in den anderen zu Benutzen musst du diese entweder direkt in der CPP Datei in der du diese benutzt oder in einem eingebunden Header mit extern nochmal aufführen.

    Quellcode

    1. extern Movie* Film[3];
    2. ...
    3. int funktion()
    4. {
    5. *Film[0] = ....
    6. }


    Google mal am besten nach C/++ und extern um die Funktionsweiße besser zu verstehen. Siehe auch hier.

    Mfg Rushh0ur
  • "Ist das nun der einzige Fehlertyp (LNK2001) der kommt?"

    Jo, das ist der einzige danach kommen nur LNK2019 Fehler.
    Das sind aber denk ich Folgefehler.
    1>C_Cinema.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: bool __thiscall C_IssuingOffice:: SetContainer(void)" (?SetContainer@C_IssuingOffice@@QAE_NXZ)" in Funktion ""public: void __thiscall C_Cinema::start(void)" (?start@C_Cinema@@QAEXXZ)".

    Ich danke dir für deine Hilfe :)
    Ich werd mir morgen das mit dem extern erstmal genauer anschauen.
    eventuell kann mir mein Prof. dann noch weiterhelfen

    schönen abend noch
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."