2016-06-24 1 views
0

Beispielcode:Wie greifen Sie auf Daten in einer Const Char ** & in C++?

const char* list[] = {"Elem_E", "Elem_T", "Elem_R", "Turtle", "Rabbit"}; 
const char ** patterns=0; 
. 
. 
. 
bool sec_run = false; 
patterns = list; 
process_data(patterns, sec_run); 

process_data Funktion:

process_data(const char **& pattern, bool sec_run){ 
. 
. 
some_variable=0; 
    for(int i; i < num_patterns;++i){ 
    if(!sec_run){ 
     some_variable = *pattern[i]; 
    } 
    else{ 
     if(/* list element contains "_" */)continue; 
     some_variable= /*letter after "_" */ 
    } 
    if(some_variable == 'E') multiplier = 0; 
    else if(some_variable == 'T') multiplier = 1; 
    else if(some_variable == 'R') multiplier = 2; 
    } 
} 

So gibt es die Basis von dem, was ich versuche zu tun. Ich kann die Signatur für Prozessdaten nicht ändern. Zum Anfang bekomme ich nicht, wie some_variable = *pattern[i]; E, T oder R zurückgibt, und ich kann nicht herausfinden, wie man auf die vollen Elemente in der Liste iterativ zugreift. dh "Elem_E", um nach Unterstreichung zu suchen und die E. abzutasten.

Ich habe wenig Hintergrund in C++, habe aber C mehrmals benutzt. Ich habe eine schwierige Zeit, visuelle Darstellung für Char ** & zu finden, um mit based Verständnis zu helfen, was hier vor sich geht, wenn Sie in Richtung eines guten Tutoriums mit visuellem zeigen können, das auch genügen wird.

Sorry für Verwirrung, hat Zitate in der Liste vergessen.

Antwort

2

In C++ funktioniert das Lesen eines durch Referenz übergebenen Parameters (mit der &) genauso wie das Lesen eines Parameters, der als Wert übergeben wurde (ohne &). Der Unterschied tritt auf, wenn Sie dem Parameter zuweisen. Wenn der Parameter als Wert übergeben wurde, ist die Zuweisung nur innerhalb der Funktion sichtbar, aber wenn sie als Referenz übergeben wurde, ist die Zuweisung außerhalb sichtbar.

int mynumber = 0; 

void foo(int &x) 
{ 
    printf("%d\n", x); //prints 0; 
    x = 10; 
} 

int main() 
{ 
    foo(mynumber); 
    printf("%d\n", mynumber); // prints 10 
} 

Das entspricht dies im Klar C wäre der x Parameter in einen Zeiger zu machen und die erforderlichen * s und & s hinzufügen:

int mynumber = 0; 

void foo(int *x) 
{ 
    printf("%d\n", *x); 
    *x = 10; 
} 

int main() 
{ 
    foo(&mynumber); 
    printf("%d\n", mynumber); // prints 10 
} 

Kommen wir zurück zu Ihrem Code, I don‘ t weiß wirklich, wie man alle deine Probleme löst (was bedeutet die Konstante Elem_E? Ist deine Liste NULL beendet oder ist dort irgendwo eine Länge gespeichert?) aber was ich sagen kann ist, dass du nicht die patterns ändern willst globale Variable von innen process_data, mit einem char **& entspricht der Verwendung einer char **.

1

Ich weiß nicht, wie some_variable und multiplier verwendet werden, aber ich habe diese Änderungen vorgenommen, um sie für jede Zeichenfolge in der Liste zu berechnen. Die Variable sec_run ist in diesem Ansatz nicht erforderlich. Wenn keine Übereinstimmung gefunden wird, werden some_variable und multiplier auf die Standardwerte '\ 0' und -1 gesetzt.

Ausgang:

item=Elem_E some_variable=E multiplier=0 
item=Elem_T some_variable=T multiplier=1 
item=Elem_R some_variable=R multiplier=2 
item=Turtle some_variable= multiplier=-1 
item=Rabbit some_variable= multiplier=-1 

Code:

void process_data(const char **& pattern, int num_patterns) 
{ 
    const char * item; 

    for (int i = 0; i < num_patterns; ++i) 
    { 
     item = pattern[i]; 
     if (item == NULL) continue; 

     char some_variable = '\0'; // set to default for no match 
     int multiplier = -1; // set to default for no match 
     int len = strlen(item); 

     for (int j = 0; j < len; ++j) 
     { 
      if (item[j] == '_' && j + 1 < len) 
       some_variable = item[j + 1]; /*letter after "_" */ 
     } 
     if (some_variable == 'E') multiplier = 0; 
     else if (some_variable == 'T') multiplier = 1; 
     else if (some_variable == 'R') multiplier = 2; 
     cout << "item=" << item << " some_variable=" << some_variable << " multiplier=" << multiplier << endl; 
    } 
} 

void pattern_test() 
{ 
    const char* list[] = { "Elem_E", "Elem_T", "Elem_R", "Turtle", "Rabbit" }; 
    const char ** patterns = list; 
    // trick to calculate array length 
    // length of entire array divided by length of one element 
    int num_length = sizeof(list)/sizeof(list[0]); 
    process_data(patterns, num_length); 
} 
+0

ich den ganzen Tag verbrachte in Dinge wie strtok suchen, find_first_of, etc. für wahrscheinlich eine über komplizierte Weise suchen, dies zu tun. Ich werde prüfen müssen, ob das funktioniert. Der sec_run war für die Funktion würde zweimal aufgerufen werden, zuerst Dinge basierend auf dem ersten Zeichen jedes Elements zu tun, dann zweite basierend auf Zeichen nach "_", wenn es einen hatte. Der eigentliche Code ist gepackt und ein paar hundert Zeilen. – Tom

+0

Und ich bekomme STRTOK wird nicht arbeiten, becuae es manipuliert das Original, zumindest ich denke, es wird nicht funktionieren, aber ich war nicht in der Lage, herauszufinden, Stradd oder Strcp für die einzelnen Elemente in der Liste. – Tom

+0

Ja, 'strtok()' ändert den Eingabe-String, so dass er 'char *' input benötigt - dann würde sich der Compiler beschweren, dass Sie 'const char *' an 'char *' übergeben. Sie könnten jedoch eine Kopie der Eingabe verwenden.'char * itemDup = strdup (Muster [i]);' erstellt eine Kopie, die Sie ändern können. Sie müssen nach der Verarbeitung 'free (itemDup);' aufrufen, um den Heap-Speicher freizugeben, der 'straddup' zugewiesen hat. Ich habe mich über 'sec_run' gewundert ... es ist möglich, dass Sie Ihre Checks für das erste Zeichen in dieselbe Schleife einfügen wie die Checks für' _ _ '. –

Verwandte Themen