2017-07-11 6 views
0

Ich habe 5 Strukturen mit Muster "struct_ID_name" alle teilen die gleiche Anzahl und Art der Felder. z Zugriff auf Struktur basierend auf dem Teil des Strukturnamens übergeben

struct struct_01 
{ 
    char field1[25]; 
    int field2; 
} 
struct struct_01 struct_01_name; 

struct struct_02 
{ 
    char field1[25]; 
    int field2; 
} 
struct struct_02 struct_02_name; 

Gibt es Art und Weise eine Funktion zu schreiben, wenn ich die char ID[2] passieren, ich die Variable dieser bestimmten Struktur zugreifen kann? z.B.

Um einen Zusammenhang zu geben, habe ich verschiedene Datensätze, die erste 2 Felder gemeinsam hat. Diese 2 Felder sagen mir die Größe des Datensatzes, den Namen des Datensatzes .... Die Anzahl der Felder in jedem Datensatztyp ist unterschiedlich. Der Strukturname jedes Datensatzes hat das Muster struct__name, wobei ID eine beliebige zweistellige Zahl sein kann. Ich möchte die allgemeinen Felder abrufen.

Einige weitere Informationen: Es gibt ein Programm, das die Datensätze in einer Datei analysiert.

Eine Datei kann 50 Arten von Datensätzen enthalten. Jeder Datensatz enthält unterschiedliche Anzahl von Feldern.

In all diesen 50 Datensätzen gibt es einige allgemeine Felder. Das erste Feld in jedem Datensatz sagt mir die Größe des Datensatzes, das zweite Feld sagt mir einige Uniq-Taste für den Datensatz das dritte Feld sagt mir etwas anderes.

Ich muss die gemeinsamen Felder aus den Strukturen/Datensätze analysieren.

Also dachte ich an etwas Generisches, um dies zu erreichen, sobald ich die ID übergeben, sollte ich in der Lage sein, die Größe aus dem Datensatz wiederzuerlangen.

+2

Warum nicht verwenden Sie eine Struktur statt 5 identische:

Die Linien: geben

X(01) X(02) 

wird durch den Pre-Prozessor ersetzt werden? –

+3

Sie können das nicht tun. Aber sag uns bitte * warum * willst du das machen? Was ist das * tatsächliche * Problem, das du lösen willst? Vielleicht kann es anders gelöst werden? –

+1

Um Ihnen zu helfen, brauchen wir den Kontext, hier stellen Sie eine komische Frage. – Stargateur

Antwort

1

Ihre Anforderung ist ziemlich seltsam, könnten Sie dies tun:

void foo(char * ID) 
{ 
    if (strcmp(ID, "01")) 
    { 
    int i = struct_01_name.field2; 
    printf("%d", i); 
    } 
    if (strcmp(ID, "02")) 
    { 
    int i = struct_02_name.field2; 
    printf("%d", i); 
    } 
    else if (strcmp(ID, "03")) 
    { 
    int i = struct_03_name.field2; 
    printf("%d", i); 
    } 

    ... 

} 

Aber ich glaube, Ihre Frage ist eher ein XY Problem. Sie sollten uns viel mehr über Ihren Anwendungsfall erzählen.

+0

Ich denke, dies sollte eine Problemumgehung sein, aber Sie können nicht direkt auf die Struktur ohne ihre Variable zugreifen. 'struct_01_name' ist der Name von struct, nicht seine Variable. Diese Anforderung ist vage und ich denke, OP vermisst diesen Fehler –

+0

@VidorVistrom Sie haben Recht, eigentlich ist die Frage ziemlich unklar. –

+0

Dank Michael, nehmen wir Objekte wie struct_01_name und struct_02_name; Wenn ich 50 Datensätze habe, gibt es einen generischen Weg, dies zu erreichen, anstatt die 50 Fallanweisungen zu schreiben? – CppLearner

1

Sie könnten ein Makro und den Operator ## verwenden.

Der Operator ## wird für die Verkettung verwendet.

#include<stdio.h> 



//The macro 
#define X(num) \ 
    i=struct_##num##_name.field2; \ 
    printf("\nstruct_%s_name.field2 = %d", #num, i); 



//The structures 
struct struct_01 
{ 
    char field1[25]; 
    int field2; 
}; 
struct struct_01 struct_01_name; 

struct struct_02 
{ 
    char field1[25]; 
    int field2; 
}; 
struct struct_02 struct_02_name; 

//main() function 
int main() 
{ 
    int i; 

    struct_01_name.field2=10; 
    struct_02_name.field2=20; 

    X(01) 

    X(02) 
} 


Was ## in i=struct_##num##_name.field2; tut, ist, dass das Argument num den Makro angegeben wird zwischen 'struct_' zu kommen und '_name'.

## verkettet Token und 'is known as the "Token Pasting operator"' darüber in der Wikipedia-Seite über C preprocessor lesen.

Dies würde erzeugen die folgende Ausgabe:

struct_01_name.field2 = 10 
struct_02_name.field2 = 20 

Sie können dies nutzen, auch wenn Sie 50 Strukturen haben dieser Art, wie Sie kommentiert.

i=struct_01_name.field2; \ 
printf("\nstruct_%s_name.field2 = %d", "01", i); 

i=struct_02_name.field2; \ 
printf("\nstruct_%s_name.field2 = %d", "02", i); 
+1

danke für Ihre Eingabe und nehmen Sie sich Zeit zu reagieren. Entschuldigung für eine verzögerte Antwort, ich habe mich eine Weile nicht auf der Seite eingeloggt, Makros werden vor dem Code verarbeitet und ich möchte den Wert an die Funktion übergeben, die ich während der Ausführung des Programms bekommen werde. Nochmals vielen Dank und Upvoted. – CppLearner

Verwandte Themen