Wie baut man modularisierte Projekte überhaupt auf?



  • Hi,
    ich bin ein absoluter C/C++-Anfänger und habe bisher keine wirklichen Projekte geschrieben, sondern nur den üblichen "Hallo Welt"-Kram. Nun wollte ich ein (für mich) anspruchsvolleres Programm schreiben, dessen Projekt ich modularisieren wollte. Leider fehlen mir dazu jegliche Grundkenntnisse. Mal ein sehr einfaches Beispiel:

    //Haupt.h
    #ifndef HAUPT_H
    #define HAUPT_H
    
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    int iTest;
    
    #endif
    
    //Haupt.cpp
    #include "Haupt.h"
    
    int main(int argc, char *argv[])
    {
      iTest = 55;
      Neben();
      return 0;
    }
    
    //Neben.h
    #ifndef NEBEN_H
    #define NEBEN_H
    
    #include <stdio.h>
    
    extern int iTest;
    
    #endif
    
    //Neben.cpp
    #include "Neben.h"
    
    void Neben(void)
    {
      Beep(500, 500); // Eine Funktion, die in windows.h definiert ist, benutzen?
      printf("%d\r\n", g_iTest); // Eine globale Variable, die in Haupt.h deklariert und in Haupt.cpp initialisiert wurde, verwenden?
      return;
    }
    

    Wie würde das korrekt (funktionsfähig) aussehen?
    Danke!



  • In Headerdateien kommen üblicherweise nur Deklarationen, keine Definitionen. Es muss also extern int iTest; in der Headerdatei heißen und int iTest; in einer .cpp-Datei.
    Des weiteren gehört die Deklaration nur in den Header in dessen .cpp-Datei die Definition steht. Heißt, in Haupt.h steht extern int iTest;, in Haupt.cpp steht int iTest;, und in Neben.cpp steht #include "Haupt.h".



  • es kommt ein bischen darauf an, wie immer im leben oder 😃
    also du kannst module auch zur laufzeit laden das würde bedeuten das du eigentlich nur ein programm baust das andere programme dynamisch modular einläd. das klingt natürlich super blöd, macht aber sinn, da jeder halbwegs normale mensch bei gewisser software größe den überblick verliert und dann nur noch so rumstochert...

    also wird das ganze in schöne kleine teil probleme(programme) zerlegt und diese dann über schnittstellen verbunden. da liegt aber auch das problem wenn du den aufbau der schnittstelle änderst werden sehr wahrscheinlich die module nicht mehr funktionieren. Andererseits können die an den schnittstellen hängenden module schnell verändert werden.

    stell dir mal ne glühbirne vor die kannst end schnell austauschen, aber mach das mal mit der fassung 😉

    evtl. willst dir dazu auch die windows functionen "LoadLibrary" und "GetProcAddress" anschauen

    hier ist auch ein kleines beispiel
    http://msdn.microsoft.com/de-de/library/64tkc9y5(VS.80).aspx

    lg lolo



  • Komplizierte Algorithmen sollte man in dlls auslagern, da man sie später dann einfach austauschen kann, aber der Rest kann ruhig statisch ins Programm gelinkt werden.



  • player4245 schrieb:

    Komplizierte Algorithmen sollte man in dlls auslagern, da man sie später dann einfach austauschen kann, aber der Rest kann ruhig statisch ins Programm gelinkt werden.

    was aber immer dazu verleitet die geschaffenen schnittstellen zu umschiffen 😉
    und final hast dann einen wollknäul

    lg lolo



  • Versteh ich jetzt nicht *am Kopf kratz*



  • worauf ich hinaus wollte ist:

    #inlcude "modul_a.h"
    #inlcude "modul_b.h"

    modul b und a sollten ja nicht zusammen hängen aber da b nach a kommt könnten in modul b functionen aus modul a verwendet werden wodurch die zusammen hängen oder 😕



  • Das ist manchmal aber unumgänglich.



  • Man teilt das Programm am besten in kleine Module auf. Die Abhängigkeiten der Module von einander sollten möglichst gering gehalten werden, so klein wie nur möglich. Die Schnittstellen sollten kompakt gehalten werden.

    Schnittstellenweite globale Variablen sind ein absolutes Tabu. Modulweite globale Variablen sollten vermieden werden.



  • Janjan schrieb:

    Modulweite globale Variablen sollten vermieden werden.

    damit hatte ich bisher nicht so das problem, könnte sein das ich dann noch bekomme, sollte ich eins zweimal laden wollen 😉

    lg lolo



  • noobLolo schrieb:

    damit hatte ich bisher nicht so das problem, könnte sein das ich das noch bekomme, sollte ich eins zweimal laden wollen

    😞



  • Ganz einfach. Modularisieren heisst: eine komplexe Aufgabe in überschaubare Teilaufgaben zu unterteilen. Auch das gehört zur Programmierung! :p


Anmelden zum Antworten