www.mikrocontroller.net

Forum: PC-Programmierung Hilfe zu Strukturtyp


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich habe bei dieser Art von Struktur Probleme. Ich versteh nicht 
ganz was das soll bzw. wie das funktioniert?
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};

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
};

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In solchen Fällen lohnt ein Blick in das Assemblerlisting.

Hier der kompilierfähige Testfall "jens.c"
typedef struct
{
  char *fnamep;
  void *ptr;
  char *linknamep;
} PAGE_ENT;

#ifndef NULL
#define NULL ((void *)0)
#endif

static void Function1(void);
static void Function2(void);

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

static void Function1(void)
{
}

static void Function2(void)
{
}

int main(void)
{
   return 0;
}


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)
  .file  "jens.c"
  .section .rdata,"dr"

// Speicherplatz für die festen Texte, 
// deren Zeiger (LC0 und LC1) später benötigt werden
LC0:
  .ascii "seite1.htm\0"
LC1:
  .ascii "seite2.htm\0"

// Start des Table-Arrays
.globl _Table
  .data
  .align 32
_Table:
  .long  LC0
  .long  _Function1
  .long  0
  .long  LC1
  .long  _Function2
  .long  0
  .long  1
  .long  2
  .space 4                 <==== hier ist das nix!

// Start des 
  .text
  .def  _Function1;  .scl  3;  .type  32;  .endef
_Function1:
  pushl  %ebp
        ...

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

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.