Forum: PC-Programmierung Hilfe zu Strukturtyp


von Jens (Gast)


Lesenswert?

Hi, ich habe bei dieser Art von Struktur Probleme. Ich versteh nicht 
ganz was das soll bzw. wie das funktioniert?
1
typedef struct
2
{
3
 char *fnamep;   
4
5
 void *ptr;    
6
7
 char *linknamep;
8
} PAGE_ENT; 
9
10
11
PAGE_ENT Table[] ={
12
13
"seite1.htm",   (void *)Function1,  NULL,
14
"seite2.htm",  (void *)Function2,  NULL,
15
16
#ifdef PASSWORT
17
"x.htm",     (void *)xyz,       NULL,
18
#endif
19
NULL};

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Table[] ist ein Array aus Elementen des selbstgemachten Typs PAGE_ENT.

Der selbstgemachte Typ PAGE_ENT ist mit typedef definiert.

Der Typ PAGE_ENT besteht aus einer Struktur, die drei Strukturelemente 
hat - einen char* Zeiger, einen void* Zeiger und noch einen char* Zeiger

Das Array wird Table[] beim Anlegen mit Werten vorgefüllt.

Für jedes gewünschte Element vom Typ PAGE_ENT müssen die Daten der 
Struktur eingetragen werden.

Die Daten der Struktur trägt man ein, in dem man die einzelnen 
Strukturelemente einträgt, drei Stück pro Struktur.

Beim 3. bzw. 4. Element hat der Autor geschludert und nur ein 
Strukturelement eingetragen. Die anderen werden vom Startupcode 
automatisch auf 0 gesetzt.

Mit ein paar Klammern würde es sauberer aussehen ;-)

typedef struct
{
  char *fnamep;
  void *ptr;
  char *linknamep;
} PAGE_ENT;

PAGE_ENT Table[] ={
  { "seite1.htm", (void *) Function1,  NULL },
  { "seite2.htm", (void *) Function2,  NULL },
#ifdef PASSWORT
  { "x.htm",      (void *) xyz,        NULL },
#endif
  NULL
};

von Jens (Gast)


Lesenswert?

Hi Stefan B,

was meinst du damit?

>>Beim 3. bzw. 4. Element hat der Autor geschludert und nur ein
>>Strukturelement eingetragen. Die anderen werden vom Startupcode
>>automatisch auf 0 gesetzt.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

In solchen Fällen lohnt ein Blick in das Assemblerlisting.

Hier der kompilierfähige Testfall "jens.c"
1
typedef struct
2
{
3
  char *fnamep;
4
  void *ptr;
5
  char *linknamep;
6
} PAGE_ENT;
7
8
#ifndef NULL
9
#define NULL ((void *)0)
10
#endif
11
12
static void Function1(void);
13
static void Function2(void);
14
15
PAGE_ENT Table[] ={
16
  { "seite1.htm", (void *) Function1,  NULL },
17
  { "seite2.htm", (void *) Function2,  NULL },
18
#ifdef PASSWORT
19
  { "x.htm",      (void *) xyz,        NULL },
20
#endif
21
  (char *)1,(void *)2
22
};
23
24
static void Function1(void)
25
{
26
}
27
28
static void Function2(void)
29
{
30
}
31
32
int main(void)
33
{
34
   return 0;
35
}

Statt der letzten NULL habe ich zwei von drei Werten der letzten 
Struktur eingetragen {1,2,nix}. Was macht der Compiler aus nix?

Mit dem GCC wird das so "gcc -S jens.c -o jens.s" zu einem 
Assemblerlisting übersetzt (hier für ein Target PC)
1
  .file  "jens.c"
2
  .section .rdata,"dr"
3
4
// Speicherplatz für die festen Texte, 
5
// deren Zeiger (LC0 und LC1) später benötigt werden
6
LC0:
7
  .ascii "seite1.htm\0"
8
LC1:
9
  .ascii "seite2.htm\0"
10
11
// Start des Table-Arrays
12
.globl _Table
13
  .data
14
  .align 32
15
_Table:
16
  .long  LC0
17
  .long  _Function1
18
  .long  0
19
  .long  LC1
20
  .long  _Function2
21
  .long  0
22
  .long  1
23
  .long  2
24
  .space 4                 <==== hier ist das nix!
25
26
// Start des 
27
  .text
28
  .def  _Function1;  .scl  3;  .type  32;  .endef
29
_Function1:
30
  pushl  %ebp
31
        ...

D.h. Der GCC lässt bei der <==== markierten Stelle eine 4 Bytes grosse 
Lücke im Code.

Was in der Lücke steht, kann das GNU Assembler Manual klären
http://www.gnu.org/software/binutils/manual/gas-2.9.1/html_node/as_124.html#SEC126

D.h. die Lücke wird, da kein anderes Füllbyte angegeben ist, mit 0 
gefüllt.

Ich habe mich geirrt - kein anderer Programmcode (insbesondere auch kein 
Startupcode) ist nötig, um die unvollständig angegebene Strukturelemente 
in Table[] auf 0 zu setzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.