Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » extern struct oder typedef

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.02.2006, 18:01 Uhr
~the-norwegian
Gast


Falls irgendwo eine leicht zugängliche Lösung existiert, entschuldige ich mich. Ich habe jedoch nichts gefunden (SuFu, Google, andere Foren, eBook).

Das Problem entsteht dadurch, dass ich drei structs benötige, welche durch einen enthaltenen Zeiger auf sich selbst verweisen (A->B->C->A etc). Dabei entsteht das Problem, dass ohne Verwendung von "extern" o.ä. eine der struct-Definitionen am Anfang einen Pointer auf einen noch nicht definierten Datentyp enthält. Die für mich naheliegende Lösung, einen Datentyp mit

C++:
extern struct

zunächst nur zu deklarieren und später zu deklarieren, wird von DevCPP/Mingw mit "`extern' can only be specified for objects and functions" bedacht.

Die Sachen die ich dazu gefunden habe, sind widersprüchlich: zum Teil gibt es Beispiele, in denen von einer zweiten Datei aus mit
C++:
extern struct structname
auf die structdefinition zurückgegriffen wird (www.inf.fu-berlin.de/lehre/kurse/cplusplus/Lektion2-3.html), andererseits wird ebendas an anderer Stelle für unmöglich erklärt (und über header-Dateien mit der Definition und Objekterzeugung gelöst).
Dies stellt meines Wissens für mein Problem keinen Lösungsansatz dar (ganz abgesehen von mir fehlenden Kenntnissen über Objekte).

Ich nehme an, dass es möglich wäre, einen weiteren Zeiger dazwischenzuschalten, bei dem man typechecking umgeht - allerdings wäre das eine Lösung, die weder schön noch im weiteren Gebrauch einfach ist.

Falls dies möglich ist, wäre ich sehr an einer Lösung interessiert, bei der man mit einer Datei auskommt, keine weiteren Pointer benötigt und idealerweise die structs weiterhin mit typedef definieren kann.

Hier einmal der relevante Ausschnitt aus dem bisherigen Code:

C++:
extern struct erffachp;

typedef struct {
        erffachp* einbringung;
        } structhalbj;

typedef struct {
        structhalbj halbj[5];
        } fachstr;
        
typedef struct {
        fachstr* fa;
        } erffachp;



Falls noch irgendwelche wichtigen Informationen fehlen, meldet euch bitte.
Vielen Dank im Voraus für alle Antworten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.02.2006, 19:53 Uhr
Pler
Einer von Vielen
(Operator)


Also eigentlich sollte das schon funktionieren.
Wahrscheinlich liegt das Problem darin, dass du typedefs verwendst.
Warum weiß ich auch nicht.

Nachtrag:

So funktioniert es auf jeden Fall:

c:

struct eins{
        struct zwei* zeiger;
};

struct zwei{
        struct eins* zeiger;
};


Dieser Post wurde am 05.02.2006 um 19:58 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.02.2006, 19:56 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
da du da oben auf nen C++ Kurs verlinkst gehe ich mal davon aus dass es mit C++ gelöst werden soll.
Dein Problem löst man dann im allgemeinen mit ner Vorwärtsdeklaration.


C++:
//structures.h
#ifndef __STRUCTURES_H
#define __STRUCTURES_H

//Vorwärtsdeklaration
struct erffachp;

struct structhalbj
{    
    erffachp* einbringung;
};

struct fachstr
{
    structhalbj halbj[5];
};

#endif

//erffachp.h
#ifndef __ERFFACHP_H
#define __ERFFACHP_H

#include "structures.h"

struct erffachp
{
    fachstr* fa;
} ;

#endif

//structures.cpp
#include "structures.h"
#include "erffachp.h"


//main.cpp
#include "structures.h"
#include "erffachp.h"

int main()
{
    erffachp e;

    return 0;
}



MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.02.2006, 20:32 Uhr
~the-norwegian
Gast


Danke,
ich werde es dann wohl ohne typedefs machen.

Ich war davon ausgegangen, dass das ebenso nicht funktioniert, weil es auf noch nicht definierte Typen (?) verweist - ich hatte nur einige andere Sachen und halt extern struct (ohne typedef) ausprobiert.

@Spacelord: Tut mir leid, ich dachte, dass die Codetags als Sprachangabe ausreichen. Den Link hatte ich auch nur über Google gefunden - ist nichts was ich verwende, gab aber ein Beispiel für "extern struct" (was bei mir halt eben nicht funktioniert).

mfg the-norwegian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.02.2006, 20:42 Uhr
Spacelord
Hoffnungsloser Fall


Da braucht dir doch nichts leid zu tun .
Wenn jeder sein Problem so ausfürlich beschreiben würde wäre die Forenwelt in Ordnung .
Das Beispiel oben sollte auf jeden Fall funktionieren.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.02.2006, 21:10 Uhr
Pler
Einer von Vielen
(Operator)


Mich würde nun aber auch gern mal interessieren was dahintersteckt, warum es so wie ich geschrieben hab funktioniert. Obwohl es ja eigentlich schon das gleiche ist wie von ~the-norwegian, nur eben ohne diese typedefs.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.02.2006, 09:08 Uhr
stephanw
localhorst


@Pler:

Das wird funktionieren, weil der Comp. für die Definition von "eins" die Info von "zwei" nicht dringend braucht, da Du ja nur per Zeiger darauf verweist.

Ich hätte zwar auch erwartet, dass man bei Deinem Beispiel eine Vorwärtsdekl. nötig wäre, habe mit VC aber gleiche Sachen ebenfalls fehlerfrei kompiliert. Ob das so dem Std entspricht, weiß ich nicht.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.02.2006, 22:23 Uhr
Spacelord
Hoffnungsloser Fall


Also,ich hatte das auch mal getestet.
Sobald man bei der Zeigerdeklaration das struct vor zwei wegnimmt kommt wie erwartet die Fehlermeldung das zwei ein unbekannter Datentyp ist.
Eventuell ist das mit dem struct vor dem Datentyp ja so ne Art implizite Vorwärtsdeklaration?
Hab aber auch keinen Plan wie genau diese Verhalten begründet ist.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: