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)
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas obtenir la longueur d'un tableau pointé donné seulement le pointeur. Soit vous avez à passer la longueur, ou elle doit être constante (toujours 4) avec quelques sentinelles de la valeur dans les éléments non utilisés, une valeur qui est en quelque sorte invalide pour vos calculs (comme NUL est pour les chaînes).
sizeof(my_array)/sizeof(int)
serait de travailler au moment de la compilation si en dehors de la fonction, comme vous dites?my_array
est en fait un tableau (pas un pointeur).match_num[]
etvalue[]
, respectivement. - Il Correct?Est-il une valeur que vous pouvez garantir, il n'est pas dans le "utilisable" de données? (par exemple, 0 est pas un caractère valide pour les chaînes de caractères, donc M. Kernighan et M. Ritchie a décidé de le prendre comme une "fin du tableau" marqueur. On pourrait faire la même avec n'importe quelle valeur.
Dire que vous connaissez vos valeurs entières entre 0 à 512, donc vous pouvez initialiser l'ensemble de la baie par exemple à 1024, puis de le remplir et itérer jusqu'à ce qu'un nombre >512 se produit (ce qui doit être votre fin de tableau marqueur).
Une autre possibilité est de faire passer le nombre d'éléments dans le tableau avec le tableau.