2016-06-24 2 views
0

サンプルコード:C++でconst char **&のデータにアクセスするにはどうすればよいですか?

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機能:

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; 
    } 
} 

だから私は何をしようとしているのベースがあります。私はprocess_dataの署名を変更することはできません。私がどのようにsome_variable = *pattern[i];がE、T、またはRを返すかを知りません。リスト内の全要素に繰り返しアクセスする方法を理解できません。アンダースコアをチェックし、Eを解析するための "Elem_E"。

私はC++での背景がほとんどありませんが、Cを何度も使っています。私は困難な時間をchar ** &のビジュアル表現を見つけることができます。ここでは何が起きているのかを理解するのに役立ちます。

ご迷惑をおかけして申し訳ございません。

答えて

2

C++では、参照渡しされたパラメータ(&)の読み取りは、値渡しのパラメータ(&なし)の読み取りと同じです。この違いは、パラメータに割り当てたときに発生します。パラメータが値渡しの場合、代入は関数内でのみ表示されますが、参照渡しの場合は代入が外部に表示されます。

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 
} 

平野Cでこれに相当するが、ポインタにxパラメータを作成し、必要な* sおよび&秒を追加することです:

int mynumber = 0; 

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

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

が戻ってあなたのコードに来て、私は「ドンあなたの問題をすべて解決する方法を本当に知っています(定数Elem_Eは何を意味しますか?あなたのリストはNULLで終わっていますか、どこかに長さがありますか?)。内部のグローバル変数process_datachar **&char **と同じです。

1

some_variablemultiplierの使用方法はわかりませんが、これらの変更を加えてリストの各文字列について計算しました。このアプローチでは、変数sec_runは必須ではありません。一致するものが見つからない場合、some_variablemultiplierはデフォルト値の '\ 0'と-1に設定されます。

出力:

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 

コード:

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

私はこれを行うには、おそらく以上の複雑な方法を探しているなどstrtokは、find_first_of、のようなものを検討して一日を過ごしました。私はこれが動作するかどうか確認する必要があります。関数のsec_runは2回呼び出され、最初に各要素の最初の文字に基づいて処理され、次に「_」の後ろに文字が1つあります。実際のコードはコンパイルされ、数百行になります。 – Tom

+0

そして、私はstrtokが元のものを操作するのではなく、少なくとも私はそれがうまくいかないと思っていますが、strdupやstrcpをリスト内の個々の要素について理解することができませんでした。 – Tom

+0

はい、 'strtok()'は入力文字列を変更して 'char *'入力を必要とするため、コンパイラは 'const char *'を 'char *'に渡していると不満を持ちます。あなたは入力のコピーを使用することができます。'char * itemDup = strdup(pattern [i]);'あなたが変更できるコピーを作成します。 'strdup'が割り当てたヒープメモリを解放するには、処理後に' free(itemDup); 'を呼び出さなければなりません。私は 'sec_run'について疑問を抱いていました。最初の文字のチェックを' '_ ''のチェックと同じループに追加することは可能かもしれません。 –

関連する問題