[C] Auf struct-Elemente zugreifen

mc_gulasch

Erfahrenes Mitglied
Hi 4um :P

Ich hab leider noch keinerlei Erfahrung mit structs in C, allerdings bin ich gerade auf eine vorgefertigte angewiesen, die ich zwar Fehlerfrei initialisieren kann, aber nicht darauf zugreifen kann :confused:

Die (verkürzte) Struktur in hash.c
C:
#include "hash.h"
struct hash_{
            int iGroesse;
            int iRest;
    } ;

...

hash *hashInit
(
    int iSize    
)
{
    hash *pHash = NULL;

    pHash =(hash*)calloc(sizeof(hash),1u,ALLOC_MODNAME,"hash");
    
    if(pHash != NULL)
    {        
        pHash->iGroesse = iSize;
    }
    return pHash;
}
hash.h
C:
typedef struct hash_ hash;
hash *hashInit(int iSize);
(um an dieser Stelle mein völliges Unwissen von C preiszugeben: was soll der "_" nach hash?)
Und dann schließlich in der main.c
C:
#include "hash.h"
int main (void)
{	
	hash *pHash;
	pHash = hashInit(35);
         printf("%i",pHash->iGroesse);
         return 0;

}
Wenn ich jetzt diesen print-Befehl ausführe, dann krieg ich zwar zum einen in meiner Entwicklungsumgebung ab "pHash->" die Möglichkeiten der Struktur angezeigt, allerdings beim Ausführen dann die Meldung:
Code:
left of 'iGroesse' specifies undefined struct/union 'hash_'
Ich hab jetzt leider keine Ahnung, was das heisst oder woran es liegt. Hilfe?

Danke sagt das Gulasch
 
Hi.

Also erstmal ist die Struktur nur in der hash.c Datei bekannt - deswegen kannst du sie natürlich auch nur dort benutzen. Es wird zwar in der hash.h ein neuer Name für "struct hash_" vereinbart, das nützt allerdings nicht viel denn um die Struktur bzw. den Alias benutzen zu können muß die komplette Struktur - inklusive der Namen und Typen - bekannt sein. Du mußt also die Deklaration der Struktur in die Header-Datei schreiben.

Eine Struktur wird in C mit dem Schlüsselwort "struct" deklariert und kann dann in C auch nur mit dem Schlüsselwort "struct" zur Definition einer Variablen verwendet werden:
C:
struct x { int a; char b; };

struct x z; /* OK. z ist ein "struct x"  */
x y; /* Fehler: x ist kein bekannter Typ */

Um das Schlüsselwort "struct" nicht immer schreiben zu müssen ist es üblich gleich noch einen neuen Namen für den Struktur-Typ zu vereinbaren. Damit es nicht zu einem Namenskonflikt kommt, benutzt man nicht den gleichen Namen, sondern hängt z.B. noch einen Unterstrich an:
C:
struct x_ { int a; char b; };

typedef struct x_ x;

x z; /* OK. z ist vom Typ "x", was ein anderer Name für "struct x_" ist. */

Gruß
 
Zurück