2017-06-28 16 views
-1

私は、異なるサイズで同じデータ型を持つ複数の配列で動作し、配列番号だけを引数として取ることができる汎用関数を用意したいと考えています。 3つの配列を考えてみましょうarr1[10]arr2[15]arr3[20]一般的な機能は次のようにすべきである:ここcで同じデータ型の複数配列の汎用関数?

void func(int array_number) 
{ 
    for(int i=0; i<y; i++) 
    { 
    arrz[i] = i; 
    } 
} 

アレイサイズyarray_number(引数)に基づいて選択され、func各アレイにデータを置くようarrz[i]zarray_numberfuncの引数)であるべきです。それはC言語で可能ですか? 私は1つの解決策は、配列の相違のための関数呼び出し中に引数としていくつかの番号を送信することです知っていますが、実際にfuncのif-elseを使いたくありません。

+2

の長鎖の無使用は2つの引数を持っている:一つは、(最初​​の要素へのポインタ)配列自体であり、第二は、大きさ(要素の数)のあります配列。 –

+0

あなたは貧しいデザインを持っているように思えますし、悪化させる方法を模索しています...あなたが解決しようとしている実際の問題は何ですか?なぜあなたは 'name1、name2、name3'のようなひどい名前の変数を持っていますか?代わりに、配列の配列または構造体の配列を作成します。そして、これらの変数、グローバルは何ですか?非常に魚のようなにおいがする。 – Lundin

答えて

1

あなたの関数は各配列について知り、その数に基づいて関数を選択する必要があります。あなたの例のように世界的な配列の小さな固定数を持っている場合は、あなたがいずれかを選択するswitchを使用することができます。もちろん

void func(int array_number) 
{ 
    int *arr; 
    int len, i; 

    switch (array_number) { 
    case 1: 
     arr = arr1; 
     len = sizeof(arr1)/sizeof(arr1[0]); 
     break; 
    case 2: 
     arr = arr2; 
     len = sizeof(arr2)/sizeof(arr2[0]); 
     break; 
    case 3: 
     arr = arr3; 
     len = sizeof(arr3)/sizeof(arr3[0]); 
     break; 
    default: 
     return; 
    } 

    for(int i=0; i<len; i++) 
    { 
     arr[i] = i; 
    } 
} 

を行うには、最も柔軟な事は、配列(Aを取るために機能を変更することです技術的に最初の要素へのポインタ)と長さ。

void func(int *arr, int len) 
{ 
    for(int i=0; i<len; i++) 
    { 
     arr[i] = i; 
    } 
} 
0

は、増分割り当てを行うためにint *size_tを受け入れるヘルパー関数を考えてみましょう。

void func_helper(int *arr, size_t length) { 
    for (size_t i = 0; i < length; i++) { 
    arr[i] = (int) i; 
    } 
} 

...インデックスを配列ポインタと長さに変換する別の関数です。

if-else

int arr1[10], arr2[15], arr3[20]; 

void func(int array_index) { 
    const struct xx { 
    int *ptr; 
    size_t length; 
    } arrays[] = { // 
     { arr1, sizeof arr1/sizeof arr1[0] }, // 
     { arr2, sizeof arr2/sizeof arr2[0] }, // 
     { arr3, sizeof arr3/sizeof arr3[0] } }; 
    const size_t n = sizeof arrays/sizeof arrays[0]; 

    // Test array_index validity 
    if (array_index > 0 && array_index <= n) { 
    array_index--; 
    func_helper(arrays[array_index].ptr, arrays[array_index].length); 
    } 
} 
関連する問題