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
-
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 NamenObjectType_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 signednessIst 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.