Definition von Struct-Elementen



  • Hallöchen,

    ich übe mich zwar schon einige Zeit in C, komme aber jetzt bei ersten Versuchen mit 'struct' nicht so wirklich weiter.
    Ich möchte ein struct erzeugen und dann einzeln ein Element definieren. Den Aufbau dazu habe ich aus meinen C-Referenzen, aber ich bekomme stets Fehlermeldungen ausgegeben.

    -.h-Datei

    // Deklaration des Objektverzeichnisses
    struct sObjectType_Identity		// Basisinformationen des Bus-Knotens
    {
    	u16 NodeID;					// Knoten-Identifikationsnummer
    } ObjectType_Identity;
    

    -.c-Datei

    ObjectType_Identity.NodeID = 100;
    

    Könnt' mir event. jemand von euch ein wenig auf die Sprünge helfen?

    Viele Grüße,

    Marcel


  • Mod

    marcel_at_work schrieb:

    Ich möchte ein struct erzeugen und dann einzeln ein Element definieren.

    Das macht keinen Sinn. Vermutlich benutzt du die Worte falsch. Beschreib mal ohne Fachworte, was du erreichen möchtest.

    marcel_at_work schrieb:

    -.h-Datei

    // Deklaration des Objektverzeichnisses
    struct sObjectType_Identity		// Basisinformationen des Bus-Knotens
    {
    	u16 NodeID;					// Knoten-Identifikationsnummer
    } ObjectType_Identity;
    

    Wenn das in deiner Referenz als etwas steht, was in eine .h-Datei gehört, dann schmeiß sie weg. Du definierst(! in der richtigen Bedeutung des Wortes) da eine Variable vom Typ struct sObjectType_Identity mit dem Namen ObjectType_Identity . Das heißt, du wirst jetzt in jeder Übersetzungseinheit mit diesem Header ein Objekt mit diesem Namen haben, was sicherlich nicht gewünscht ist und beim Linken nicht funktionieren wird.

    Könnt' mir event. jemand von euch ein wenig auf die Sprünge helfen?

    Was genau ist das Problem?



  • HI,

    ich möchte eine Struktur anlegen und später direkt auf die einzelnen Elemente zugreifen. Und zwecks der Übersicht in einer ausgelagerten Datei.

    In den Referenzen ist keine Datei angegeben. Ich dachte nur, dass es so gemeint ist.

    Wie soll ich das denn nun am Besten machen???

    Viele Grüße



  • Keiner mehr einen Rat?

    Viele Grüße



  • hi marcel,
    wie du das am besten machen kannst kann man eventuell erst dann sagen, wenn
    man weiß was du vor hast.
    wenn du modular programmieren möchtest, machst du das so:

    // xyz.h
    #ifndef XYZ_H
    #define XYZ_H
    
    enum Namelen {namelen=31};
    
    struct my_xyz_struct
    {
    	int i;
    	double d;
    	char name [namelen+1];
    };
    
    void init_my_xyz_struct ( struct my_xyz_struct* var, int i, double d, char* name );
    void view_struct  ( struct my_xyz_struct* var );
    
    #endif // XYZ_H
    
    // xyz.c
    #include "xyz.h"
    #include <string.h>
    #include <stdio.h>
    
    void init_my_xyz_struct ( struct my_xyz_struct* var, int i, double d, char* name )
    {
    	var->i = i;
    	var->d = d;
    	strncpy (var->name, name, namelen);
    }
    
    void view_struct  ( struct my_xyz_struct* var )
    {
    	printf ("%d %f %s\n", var->i, var->d, var->name);
    }
    
    //main.h
    #include "xyz.h"
    
    int main(void)
    {
    	struct my_xyz_struct var = {0};
    	init_my_xyz_struct (&var, 88, 1.23, "Herbert Bert");
    	view_struct(&var);
    	return 0;
    
    }
    


  • edit:

    b.b schrieb:

    //main.h
    

    sollte

    // main.c
    

    werden.

    mit

    #include "xyz.h"
    

    kannst du in einer c datei die struktur und
    die funktionen, die auf die struktur-variablen zugreifen sollen,
    bekannt machen.



  • Hi,

    sorry, hab' erst jetzt wieder mal Zeit gefunden, mich an mein Projekt zu setzen - momentan hab' ich leider ne 7-Tage-Woche. Danke für das Feedback!

    So hab' ich's jetzt umgesetzt...

    objects.h

    // Deklaration des Objektverzeichnisses
    struct sObjectType_Identity		// Basisinformationen des Bus-Knotens
    {
    	u16 NodeID;					// Knoten-Identifikationsnummer
    	u08 ObjectCode;				// Geräteschlüssel im Objektmodell
    	u08 Description[20];		// Beschreibung
    };
    void setObjectDirectory(void);
    

    objects.c

    struct sObjectType_Identity ObjectType_Identity;
    
    void setObjectDirectory(void)
    {
    	ObjectType_Identity.NodeID = 1;			// Knoten-Identifikationsnummer
    	ObjectType_Identity.ObjectCode = 0x00;			// Geräteschlüssel im Objektmodell
    	strcpy(ObjectType_Identity.Description,"Knoteninformationen");	// Beschreibung
    }
    

    main.c

    int main(void)
    {
    	setObjectDirectory();
    	while(1)
    	{
    
    	}
    	return 0;
    }
    

    Folgende Meldung bekomme ich nun beim Kompilieren:
    ../objects.c:33: warning: pointer targets in passing argument 1 of 'strcpy' differ in signedness

    Ist der Aufbau der Struktur jetzt korrekt? Und WAS hat es mit der Meldung auf sich?

    Bin über jede Hilfe dankbar.

    EDIT:

    Hab' gerad' den Fehler für die Meldung ausfindig gemacht. Der Typ von ObjectType_Identity.Description war wie folgt deklariert:

    typedef signed char			u08; // signed 8bit
    

    Mit 'char' geht es.
    Ich nahm eigentlich an, dass 'signed char' äquivalent zu 'char' ist???

    Viele Grüße



  • Der Compiler hat über das Vorzeichen gemeckert.
    Laut Standard gibt es 3 verschiedene char Typen: char, signed char und unsigned char.
    Ein char kann signed oder unsigned sein, das kann man in den Compileroptionen einstellen.



  • Danke. Werd' ich gleich mal schauen.

    Viele Grüße



  • marcel_at_work schrieb:

    typedef signed char			u08; // signed 8bit
    

    Wer einen vorzeichenbehafteten Integertypen u08 nennt, gehört doch geprügelt. Echt jetzt.


Anmelden zum Antworten