Itérer int tableau de longueur inconnue

Je suis en train de parcourir un tableau qui contiendra jusqu'à un maximum de 4 éléments - aucune connaissance de la matrice de longueur existe.

Pseudo-Code

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

Appelant Exemple (Pseudo-Code)

/*
 * 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

Comment puis-je accomplir?

Dans un tableau de caractères, C ajoutera automatiquement '\0' à la fin du tableau, mais cela ne semble pas être le cas pour un tableau d'entiers. Si j'étais en quelque sorte en mesure de déterminer la longueur de match_num et value (voir if déclaration) au moment de l'exécution à l'origine, puis qui me permettrait de créer un for boucle.

Modifier

Depuis que je sais qu'il y aura un maximum de 4 éléments, je n'ai pas pu faire quelque chose de similaire à la suivante?

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
        }
    }
}
  • .........de la magie?
  • S'il vous plaît montrer le code appelant.
  • Désolé les gars - là vous allez.
  • Cet appel code compile pour vous?
  • Non, ce n'est qu'une pseudo-code. J'aurais probablement pour déclarer le tableau à l'extérieur de l'appel de la fonction, non?
  • Désolé, je ne comprends pas votre intention. Je ne comprends pas votre pseudo soit. Pourriez-vous préciser? BTW: qu'est-ce que data_exists ?
  • pour le registre des affectations, je vous recommande d'utiliser des macros et ##. BTW, les macros ne sont pas mauvaises en C.
  • Merci pour l'astuce - j'apprends que je vais, c'est génial.
  • La caisse de la modifier gars - tout ce que je cherche, c'est un moyen d'affecter des données à certains registres, et étant donné que je vais avoir un init fonction qui va utiliser cette fonction, ce sera au moment de la compilation.
  • bonne chance pour votre voyage. Si vous êtes en apprentissage, puis de macros ## ne peut pas réellement être une bonne suggestion pour vous de mettre en œuvre. Si vous êtes vraiment faire embarqués, alors je vous recommande de regarder à travers votre compilateur vendeurs de code pour manipuler des registres et de le faire comme ça. (ils ont probablement des fonctions d'aide/macros pour mettre en place certains des périphériques)

InformationsquelleAutor Biff | 2013-02-22