1

最大4 つの要素を含む配列を反復しようとしています - 配列の長さに関する他の知識はありません。

疑似コード

void insert_vals(uint8_t num, uint8_t *match_num, uint8_t *value)
{
    uint8_t i;

    while(data_exists)  // how do I determine if data exists in 'value'?
    {
        switch(num)
        {
            case 0:
            {
                switch(match_num[i])
                {
                    case 0:
                        hw0reg0 = value[i];
                    case 1:
                        hw0reg1 = value[i];
                    case 2:
                        hw0reg2 = value[i];
                    case 3:
                        hw0reg3 = value[i];
                }
            }
            case 1:
            {
                switch(match_num[i])
                {
                    case 0:
                        hw1reg0 = value[i];
                    case 1:
                        hw1reg1 = value[i];
                    case 2:
                        hw1reg2 = value[i];
                    case 3:
                        hw1reg3 = value[i];                 
                }
            }
            // etc. 2 other cases
        }
        i++;
    }
}

呼び出し例 (疑似コード)

/*
 * num: hardware device select from 1 - 4
 * match_num: 4 possible matches for each hardware device
 * value: 32-bit values to be assigned to 4 possible matches
 * NOTE: This function assumes hardware devices are selected
 * in a consecutive order; I will change this later.
 */

 // example calling code - we could have configured 4 hardware devices
 insert_vals(0, [0, 1], [0x00000001, 0x000000FF]);  // arg2 and arg3 equal in length

どうすればこれを達成できますか?

文字配列では、C は自動的に'\0'配列の末尾に追加しますが、これは整数配列には当てはまらないようです。match_numもともと実行時にand value(ifステートメントを参照)の長さを何らかの方法で特定できた場合は、forループを作成できます。

編集

要素が最大4つになることがわかっているので、次のようなことはできないでしょうか?

void insert_vals(uint8_t num, uint8_t *match_num, uint32_t *value)
{
    int i;

    for(i = 0; i < 4; i++)
    {
        if(value[i] == -1)
            break;
        else
        {
            // Assign data
        }
    }
}
4

2 に答える 2

3

ポインターだけが指定された場合、指している配列の長さを取得することはできません。長さを渡す必要があるか、未使用の要素にいくつかのセンチネル値を含む定数 (常に 4) である必要があります。これは、計算には無効な値です (NUL が文字列の場合のように)。

于 2013-02-22T00:28:47.910 に答える
1

「使用可能な」データにないことを保証できる値はありますか? (たとえば、0 は文字列の有効な文字ではないため、Kernighan 氏と Ritchie 氏は「配列の終わり」マーカーとしてこれを選択することにしました。任意の値で同じことができます。

整数値が 0 から 512 の間であることがわかっているとします。そのため、配列全体を 1024 などに初期化し、それを埋めて、512 を超える数値が発生するまで繰り返すことができます (これは配列マーカーの末尾でなければなりません)。

もう 1 つの可能性は、配列と共に配列内の要素の数を渡すことです。

于 2013-02-22T00:31:04.563 に答える