【发布时间】:2023-03-20 05:09:01
【问题描述】:
我在处理来自 PHP 背景的 C 中的多维数组时遇到问题。
我有一个数组 msg,我现在将其用作输入。数组的第一个元素存储“node_id”,第二个元素存储“实际消息”,第三个元素保存“controller_id”。
任务由函数handleSlotMessage() 处理:该函数应该为每个controller_id 接收3 条输入消息(等到它接收到所有3 条消息),在接收到所有3 条消息后将其进一步传递以进行处理。
为了存储消息,我正在尝试使用“多维数组”(可以在 PHP 中简单地实现):resultFromNodes 但强调我对“C”的了解有限,我无法完成这项工作。
对于 handleSlotMessage 函数中 resultFromNodes 变量的所有用法,我收到错误 Subscribed value is not an array, pointer, or vector.
如何在 'C' 中实现?我尝试从this 回答来检查是否设置了数组。
#define UNINITIALIZED 0xcdcdcdcd
void handleSlotMessage();
int main(int argc, const char * argv[]) {
int resultFromNodes[99][3] = {UNINITIALIZED};
int i, j;
int msg[10];
// test data only
for ( i = 1; i < 4; i++ ) {
for ( j = 1; j < 4; j++ ) {
msg[0] = j; // sender's id (node id)
msg[1] = i*j; // message
msg[2] = i; // controller's id (requester's id)
handleSlotMessage(msg, *resultFromNodes);
}
}
return 0;
}
void handleSlotMessage(int msg[], int resultsFromNodes[]) {
// get controller id
int controller_id = msg[2];
int node_id = msg[0];
int message = msg[1];
int slot_count = 3;
// check if the resultFromNodes already has controller_id set
if (resultsFromNodes[controller_id] == UNINITIALIZED) {
resultsFromNodes[controller_id][0] = slot_count;
}
if(resultsFromNodes[controller_id][0] == 0) {
printf("Message Handled and result from Nodes sent for further processing! \n");
} else {
resultsFromNodes[controller_id][node_id] = message;
printf("on node: %i msg: %i controller: %i \n\r", node_id, message, controller_id);
resultsFromNodes[controller_id][0]--;
}
return;
}
EDIT: If this gives any one better idea, 'controller_id' ranges from 1-99 so instead of checking it is set or not it is feasible to check if it is within that range. I don't know if it helps in any way.
【问题讨论】:
-
这个
int resultFromNodes[99][3] = {UNINITIALIZED};很可能不符合您的预期。它用0xcdcdcdcd初始化resultFromNodes[0][0],用0初始化所有其他元素。 -
@alk 所有其他元素都被赋值为 0,因为我也可以检查它是否为 0。但问题是,我无法为 resultsFromNodes[controller_id][0], [1] 或任何其他数组赋值,简单的赋值会显示错误。
-
在 C 中读取未初始化的变量会调用未定义的行为。不要那样做。
-
谢谢,明白了。我可以将所有数组初始化为 0 并继续,看来问题出在我的函数定义上,我在 resultFromNodes 中使用了一维数组
-
您在
handleSlotMessage中处理resultsFromNodes,它是int[]类型的声明参数,就好像它与main()中的声明 相同。
标签: c arrays pointers multidimensional-array microcontroller