Drucken Sie die Strukturfelder und Werte in C

Lesezeit: 5 Minuten

Benutzer-Avatar
Benutzer3555115

Ich interessiere mich für den Druck der Strukturfelder.

Typedef struct
{
   UINT32 thread_id;
   BOOL   is_valid;
}T_THREAD;

Gibt es in der Sprache “C” eine Möglichkeit, den Inhalt einer Struktur zu drucken, so etwas wie

ex: print (T_THREAD) und Ausgabe sollte wie sein

Contents of a structure T_THREAD are 
  thread_id
  is_valid

  • Möchten Sie die Werte einer bestimmten Instanz oder das Layout der allgemeinen Struktur drucken? (Obwohl die Antwort nein ist, müssen Sie es selbst tun)

    – Benutzer45891

    23. Dezember 2016 um 16:06 Uhr


  • Ich möchte das Layout der allgemeinen Struktur drucken. Wenn ich der Struktur weitere Felder hinzufüge, sollte mein printf auch das neu hinzugefügte Feld drucken können.

    – Benutzer3555115

    23. Dezember 2016 um 16:09 Uhr

Was Sie suchen, ist Reflexion. Java und andere virtuelle Sprachen haben Reflektion, sodass Sie die Variablennamen und Funktionsnamen für jede beliebige Klasse ausdrucken können. Weil der Compiler diese Reflection-Funktionen automatisch baut.

C hat keine Reflexion. Sie müssen alles manuell tun.

Benutzer-Avatar
Falke

Was Ihre Struktur betrifft, würde die Funktion ungefähr so ​​​​aussehen.

// st_name is the name of the struct
void print(T_THREAD *st, const char *st_name)
{
    printf("Contents of structure %s are %lu, %d\n", st_name, st->thread_id, st->is_valid);
}

  • struct *st ? Es sollte sein T_THREAD *st. Und wenn Sie das ändern, ist das offensichtlich st_name ist nicht nötig

    – Ingo Leonhardt

    23. Dezember 2016 um 17:07 Uhr


  • Wie sollen wir drucken, wenn wir die Elemente der Struktur nicht kennen?

    – vineeshvs

    10. August 2019 um 10:20 Uhr

Benutzer-Avatar
Sourav Ghosh

Nein, es gibt kein Standard/vordefiniert Weise zu erreichen, was Sie wollen.

Ja, aber Sie können Ihre eigene Funktion schreiben, die Kenntnisse über das Besondere hat Strukturelementwerte gedruckt werden, und dann können Sie mit einem einzigen Aufruf der Funktion mit einer bestimmten Instanz der Strukturvariablen alle Werte aller Elemente drucken lassen. Etwas wie

T_THREAD var;

my_print(var);  //my_print() is the function you'll roll out

sollte in der Lage sein, die Werte zu drucken.

Bitte beachten Sie dies jedoch nicht erlauben Ihnen, die Variable zu drucken Namen in keiner Weise nur “Werte”.

Benutzer-Avatar
RoadRunner

Es gibt keine Möglichkeit, alle Strukturelemente mit einem einzigen zu drucken printf Aussage. In C müssen Sie sie alle manuell ausdrucken. Hier ist ein Beispiel für das Erstellen von zwei Strukturmitgliedern und deren Ausdruck:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct {
    char *name;
    int thread_id;
    bool is_valid;
}T_THREAD;

int
main(void) {
    T_THREAD T1 = {"T1", 123, 1};
    T_THREAD T2 = {"T2", 456, 0};

    printf("\nContents of a structure %s are:\n", T1.name);
    printf("thread_id: %d\n",T1.thread_id);
    printf("is_valid: %d\n", T1.is_valid);

    printf("\nContents of a structure %s are:\n", T2.name);
    printf("thread_id: %d\n",T2.thread_id);
    printf("is_valid: %d\n", T2.is_valid);

    return 0;
}

Ausgabe:

Contents of a structure T1 are:
thread_id: 123
is_valid: 1

Contents of a structure T2 are:
thread_id: 456
is_valid: 0

Alternativ können Sie auch eine Funktion erstellen, um dies zu tun:

int
main(void) {
    T_THREAD T1 = {"T1", 123, 1};
    T_THREAD T2 = {"T2", 456, 0};

    print_struct_elements(&T1);
    print_struct_elements(&T2);

    return 0;
}

void
print_struct_elements(T_THREAD *T) {
    printf("\nContents of a structure %s are:\n", T->name);
    printf("thread_id: %d\n",T->thread_id);
    printf("is_valid: %d\n", T->is_valid);
}

Ich glaube, dass Debugger wie GDB die Arbeit erledigen können, aber es ist etwas mehr Arbeit als printf.

  1. Kompilieren Sie die C-Datei mit Debug-Symbolen. “gcc -o test -g test.c”
  2. Hängen Sie die ausführbare Datei an GDB an. “gdb-test”
  3. Führen Sie GDB bis zu der Zeile aus, in der Sie die Struktur drucken möchten. (z.B. https://visualgdb.com/gdbreference/commands/print)
  4. Druckstruktur. “p structA”

Angenommen, ich habe den folgenden Code,

78    typedef struct
79    {
80       int thread_id;
81       int is_valid;
82    }T_THREAD;
83
84    T_THREAD tThread = { 0 } ;

Das Drucken der Struktur in GDB sieht so aus.

gdb -o test -g test.c
gdb test
(gdb) break 85
(gdb) run
(gdb) p tThread
$1 = {thread_id = 0, is_valid = 0}

Es gibt viele GDB-Tutorials online. Hier ist eine, die Ihnen beim Einstieg helfen könnte.
https://condor.depaul.edu/glancast/373class/docs/gdb.html

Eine Möglichkeit, dies zu tun, wäre die Verwendung von x-Makros. Obwohl nicht so hübsch im Vergleich zu Reflexionen, die in eine Sprache eingebaut sind. Die Verwendung von Makros macht den Code etwas schwieriger zu lesen, aber es ist ziemlich einfach.

#include <stdio.h>
#include <stdint.h>

#define HDR_STRUCT_FIELDS       \
  FLD(0, Field_1, uint32_t, 3)  \
  FLD(1, Field_2, uint16_t, 4)  \
  FLD(2, Field_3, uint8_t,  5)

#define FLD(idx, fld, dt, initVal)   dt fld;
typedef struct 
{
    HDR_STRUCT_FIELDS
} HdrData_t;
#undef FLD

#define FLD(idx, fld, dt, initVal)   .fld = initVal,
HdrData_t HeaderData = 
{
   HDR_STRUCT_FIELDS
};
#undef FLD


#define QUOTE(field)     #field
#define FLD(idx, fld, dt, initVal)   [idx] = QUOTE(fld),
const char* HeaderDataName[] = 
{
   HDR_STRUCT_FIELDS
};
#undef FLD


int main()
{   
    #define FLD(idx, fld, dt, initVal)   printf("%s = %d\n", HeaderDataName[idx], HeaderData.fld);
    HDR_STRUCT_FIELDS
    #undef FLD

    return (0);
}

Eine andere Methode, bei der die Reihenfolge des Felds nicht so wichtig ist, wäre die folgende, die eine Struktur verwendet und die Struktur initialisiert.

#include <stdio.h>
#include <stdint.h>

#define HDR_STRUCT_FIELDS    \
  FLD(Field_1, uint32_t, 3)  \
  FLD(Field_2, uint16_t, 4)  \
  FLD(Field_3, uint8_t,  5)

#define FLD(fld, dt, initVal)   dt fld;
typedef struct
{
    HDR_STRUCT_FIELDS
} HdrData_t;
#undef FLD


#define FLD(fld, dt, initVal)   .fld = initVal,
HdrData_t HeaderData =
{
   HDR_STRUCT_FIELDS
};
#undef FLD


#define FLD(fld, dt, initVal)   const char *fld;
typedef struct
{
   HDR_STRUCT_FIELDS
} HdrDataFldString_t;
#undef FLD

#define STRINGIZE(field)        #field
#define FLD(fld, dt, initVal)   .fld = STRINGIZE(fld),
HdrDataFldString_t  HdrDataFldString =
{
   HDR_STRUCT_FIELDS
};
#undef FLD


int main()
{
    #define FLD(fld, dt, initVal)   printf("%s = %d\n", HdrDataFldString.fld, HeaderData.fld);
    HDR_STRUCT_FIELDS
    #undef FLD

    return (0);
}

1384850cookie-checkDrucken Sie die Strukturfelder und Werte in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy