globale struktur (im modul definiert, und dennoch in der main() bekannt !!



  • Also extern verhilft einem nicht dazu eine Variable in deinem main anzulegen, sondern sagt nur das man eine extern schon angelegte Variable benutzen kann.

    Wenn ich dein Problem richtig verstanden haben dann solltest du das volgendermassen machen:

    f.h

    struct Meinestruktur;
    
    dateieinlesen(Meinestruktur[]);
    feldsortieren(Meinestruktur[]);
    feldausgeben(Meinestruktur[]);
    

    Die Sache hier nennt sich Deklaration

    f.cpp

    struct Meinestruktur{
      int x;
      int y;
    }
    
    dateieinlesen(Meinestruktur[]){
      ...
    }
    feldsortieren(Meinestruktur[]){
      ...
    }
    feldausgeben(Meinestruktur[]){
      ...
    }
    

    Das ist die Definition, die wohl oder uebel ja irgendwo bekannt sein muss, so aber halt nicht in der .h, aber wenn du die irgendwann nur als Objekt File zur Verfuegung hast dann reicht es, und keiner sieht mehr deine Implementierung.

    Dann kannst du:
    main.cpp

    #include "f.h"
    int main(){
    
      meinestruktur feld[500];
    
      dateieinlesen(feld);
      feldsortieren(feld);
      feldausgeben(feld); 
    
      return 0;
    }
    

    Musst dann allerdings beim linken die Objekt oder die .cpp Datei von f angeben.

    Gruß

    Entyl Sa



  • virtuell Realisticer schrieb:

    Export? Das ist mir aber ganz neu.

    Irgendwer hat schon gezeigt wie du das erreichen kannst, was du willst. Du
    deklarierst in einer Headerdatei deine Struktur als extern und in einer
    Implementationsdatei machst du dann die Strukturdeklaration.

    @tobidope: Bitte doch etwas freundlicher, es war ja klar was gemeint war. wir
    wolln doch net gleich jeden verkraulen.

    mfg
    v R

    Nein, ich habe ihm die Lösung zu seinem Problem genannt. Anders geht es nicht. Ansonsten muss er die Programmiersprache wechseln. Er wird ein Struktur ohne Deklaration nicht verwenden können.



  • @Entyl_Sa
    meinestruktur feld[500]; in der main geht so nicht,
    da er ja die grösse der struct nicht kennt kann er dieses array nicht anlegen, als folge kommt ein kompilerfehler

    möglich ist z.b. das folgende:

    f.h:

    #ifndef F_H
    #define F_H
    
    struct Meinestruktur; 
    
    struct Meinestruktur* feldanlegen(int count);
    void feldzerstoeren(struct Meinestruktur *feld);
    void feldeinlesen(struct Meinestruktur *feld); 
    void feldsortieren(struct Meinestruktur *feld); 
    void feldausgeben(struct Meinestruktur *feld);
    
    #endif
    

    f.cpp:

    #include "f.h"
    
    struct Meinestruktur
    {
    	int x;
    	int y;
    };
    
    struct Meinestruktur* feldanlegen(int count)
    {
    struct Meinestruktur *feld = 0;
    
    	// ....
    	return feld;
    }
    
    void feldzerstoeren(struct Meinestruktur *feld)
    {
    	// ....
    }
    
    void feldeinlesen(struct Meinestruktur *feld)
    {
    	// ....
    }
    
    void feldsortieren(struct Meinestruktur *feld)
    {
    	// ....
    }
    
    void feldausgeben(struct Meinestruktur *feld)
    {
    	// ....
    }
    

    main.cpp:

    #include "f.h"
    
    void main(void)
    {
    	struct Meinestruktur *feld;
    
    	feld = feldanlegen(500);
    	feldeinlesen(feld);
    	feldsortieren(feld);
    	feldausgeben(feld);
    	feldzerstoeren(feld);
    }
    


  • Jetzt stellt sich nur noch eine Frage, was für einen Sinn hat das ganze?



  • kapselung

    die implementierung dieses modules kann völlig unabhängig vom rest des programms verändert, erweitert, .... werden (solange sich die public funktionen nicht verändern), und dies ohne, das eine neu-kompilation der anderen module nötig ist



  • warum fragst du eigentlich? 😉

    dein genanntes "Pimpl Idiom" geht doch unter anderem auch in diese richtung



  • bozo schrieb:

    warum fragst du eigentlich? 😉

    dein genanntes "Pimpl Idiom" geht doch unter anderem auch in diese richtung

    Deshalb wundere ich mich ja, es gibt funktionierende, dokumentierte und allgemein bekannte Alternativen. Wieso sollte man es anders machen?



  • @tobidope

    diese methode ist doch auch funktionierend, dokumentiert und allgemein bekannt 🙂
    und auch noch länger im gebrauch, da sie schon in c benutzt wurde

    es gibt nun mal nicht nur eine möglichkeit etwas zu tun, oft sind es mehrere, z.b. kann man auch statt des pointers im obrigen beispiel einen index benutzen

    warum man etwas anders machen sollte? weil es jenach genauem anwendungsfall einige unterschiede gibt, und nicht immer alle lösungsvarianten gleich gut passen

    (
    nicht so ernst zu nehmende antwort wäre ->

    warum sollte man c++ nutzen, es gibt doch c, warum c, es gibt doch asm, .....
    warum sollte man ...... (kannst etwas einsetzen), es gibt doch .....

    😉

    )



  • Aber wenn man C will, sollte man auch nicht unbedingt C++ nutzen. Berichtige mich, aber auf x und y kann er in obiem Beispiel nicht zugreifen, oder?



  • ja und nein
    kommt drauf an von wo du diesen zugriff meinst:
    in main.c kann man nicht auf die daten in der struct zugreifen, was ja auch der sinn für diese lösung ist, nur in f.cpp kann man auf die daten in der struct zugreifen, und nur dort gehört ja auch der direkte zugriff auf die daten in der struct hin



  • kapselung

    die implementierung dieses modules kann völlig unabhängig vom rest des programms verändert, erweitert, .... werden (solange sich die public funktionen nicht verändern), und dies ohne, das eine neu-kompilation der anderen module nötig ist

    Das ist nicht Kapselung sondern Functionoverheat. Jedes mal wenn du einen Wert in der Structur verändern willst musst du eine ganze Funktion aufrufen. Ist dir es wirklich so wichtig die 2 int zu verkapseln?

    und auch noch länger im gebrauch, da sie schon in c benutzt wurde

    Die extern Methode ist eine C Methode die C++ compatible ist.

    warum sollte man c++ nutzen, es gibt doch c, warum c, es gibt doch asm, .....
    warum sollte man ...... (kannst etwas einsetzen), es gibt doch .....

    Warum sollte man sich das Leben leicht machen, wenn es auch schwer geht?

    in main.c kann man nicht auf die daten in der struct zugreifen, was ja auch der sinn für diese lösung ist, nur in f.cpp kann man auf die daten in der struct zugreifen, und nur dort gehört ja auch der direkte zugriff auf die daten in der struct hin

    Vielleicht ist das die C Weise dies zu tun aber in C++ gibt es dafür private Member und Funktionen. Und da dies ein C++ Forum ist...



  • @Iregendwer
    sorry, aber du hast es falsch verstanden

    Das ist nicht Kapselung sondern Functionoverheat. Jedes mal wenn du einen Wert in der Structur verändern willst musst du eine ganze Funktion aufrufen. Ist dir es wirklich so wichtig die 2 int zu verkapseln?

    diese zwei int's sind nur ein beispiel das Entyl_Sa benutzt hatte, und ich habs einfach übernommen,
    die sind total unwichtig, waren nur sein beispiel,
    es geht im grunde um einen abstrakten datentypen, der gekapselt werden soll, und für den kontextbezogene funktionen definiert werden

    Die extern Methode ist eine C Methode die C++ compatible ist.

    das mit dem extern ist aber etwas völlig anderes,
    da wird eine variable global zugänglich gemacht, was man nun wirklich nur mit bedacht machen sollte, auch wollte er die struct auch erst in der main.cpp benutzen und kein festdefinierte variable in der moduldatei haben

    Warum sollte man sich das Leben leicht machen, wenn es auch schwer geht?

    habe ich denn etwas anderes geschrieben, nein

    Vielleicht ist das die C Weise dies zu tun aber in C++ gibt es dafür private Member und Funktionen. Und da dies ein C++ Forum ist..

    he?
    was hat das damit zu tun, nichts
    meine antwort passt einfach auf die in diesem thread gestellte frage und um die geht es ja wohl, es geht hier nicht um private member und funktionen, sondern darum das die struct nicht gloabal (in dem header) genau deklariert werden soll



  • he?
    was hat das damit zu tun, nichts
    meine antwort passt einfach auf die in diesem thread gestellte frage und um die geht es ja wohl, es geht hier nicht um private member und funktionen, sondern darum das die struct nicht gloabal (in dem header) genau deklariert werden soll

    Es geht darum ein struct in einem module zu definiren (definiren!=declariren) und es in einem anderen Module zugänglich zu machen, das ist für mich eindeutig die extern Methode, von Kapselung war nie die Rede.

    Desweiteren wenn man in C++ Variablen einer struct für den Endprogrammirer unzugänglich machen will dann benutzt man private. Die Memberfunctionen werden in ein separates Modul gepackt. Und wenn man seine struct (was inzwischen schon eine class ist) verändern will dann verändert man sie im Header denn wenn man die neue benutzen will muss man eh den neuen Header benutzen.



  • Irgendwer schrieb:

    he?
    was hat das damit zu tun, nichts
    meine antwort passt einfach auf die in diesem thread gestellte frage und um die geht es ja wohl, es geht hier nicht um private member und funktionen, sondern darum das die struct nicht gloabal (in dem header) genau deklariert werden soll

    Es geht darum ein struct in einem module zu definiren (definiren!=declariren) und es in einem anderen Module zugänglich zu machen, das ist für mich eindeutig die extern Methode, von Kapselung war nie die Rede.

    Desweiteren wenn man in C++ Variablen einer struct für den Endprogrammirer unzugänglich machen will dann benutzt man private. Die Memberfunctionen werden in ein separates Modul gepackt. Und wenn man seine struct (was inzwischen schon eine class ist) verändern will dann verändert man sie im Header denn wenn man die neue benutzen will muss man eh den neuen Header benutzen.

    Du weißt wirklich nicht so ganz genau, was extern bedeutet, oder?



  • genau tobidope

    Irgendwer, du unterliegst einem irrtum

    schau doch einfach noch mal in die post's von xdsmpDS, er schrieb zwar etwas von definieren, aber durch die nachfolgenden aussagen wird ganz klar deutlich was er will

    ...ahso ich will die struktur auch auf keinen fall in der .h definieren !! jedenfalls nicht so das man dort etwas über ihren aufbau erkennen könnte !...

    und genau darum geht es in diesem thread!

    was du mit deinem extern machen willst ist etwas völlig anderes!

    und deine sache mit der class und private passt hier einfach auch nicht, hier ist eine ganz andere zielsetzung gefragt worden!
    z.b. ist es eben möglich die daten in der struct zu verändern ohne das der header verändert wird und alle dateien die diesen header benutzen neu kompiliert werden müssen

    schau dir einfach noch mal die post's in diesem thread genau an,
    dann sollte es dir eigentlich klar werden, um was es hier geht und was der unterschied zu deinem jeweils geschriebenen ist



  • Du hast auch nicht so ganz genau gelesen, was ich sagte. Mir ging es darum, das er denn Beriff extern falsch verwendet. Mir ist schon klar was er letztenendes bezweckt, doch der scopeidentifier extern hat damit nun mal gar nichts zu tun. Ich habe bisher überhaupt nichts von extern gesagt.



  • der sinn ?
    naja es gibt in c++ ja die möglichkeit module zu kapseln 🙂
    das heißt das man die module zB auch getrennt von der main compelieren kann !
    zudem kann es fälle geben wo man bestimmte lösungen geheim halten will, also auch eine spezielle struktur !

    warum ich das feld mit der unbekannten struktur als über die main schiebe ?
    naja hab wohl zu lange MS VB6.0 geprogged *g*
    kanns nun mal net mehr anders 🙂

    und danke für die vielen antworten ! werd mich nach de feiertagen noch mal damit beschäftigen ! :xmas1: :xmas2: :xmas2: :xmas2:


Anmelden zum Antworten