c中的多维数组
Multi-dimensional array in c
我在使用来自 PHP 背景的 C 中处理多维数组时遇到问题。
我有一个数组 msg,我现在将其用作输入。数组的第一个元素存储 'node_id',第二个元素存储 'actual message',第三个元素存储 'controller_id'。
任务由函数 handleSlotMessage() 处理:此函数应为每个 controller_id 接收 3 个输入消息(等待直到它接收到所有 3 个消息),在接收到所有 3 个消息后将其进一步处理。
为了存储消息,我正在尝试使用 'Multi-dimensional array'(可以在 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.
resultsFromNodes[controller_id][0] = slot_count;
resultsFromNodes
声明为一维数组,但你给它第二个下标 [0]
.
您可能希望将函数定义为:
void handleSlotMessage(int msg[], int (*resultsFromNodes)[3]) { ... }
并将其命名为:
handleSlotMessage(msg, resultFromNodes);
或同等学历:
handleSlotMessage(msg, &resultFromNodes[0]);
问题不止一个我指出其中的一些
在函数 handleSlotMessage
中,参数 resultsFromNodes
应该像 int *resultsFromNodes[4]
一样声明,以便能够发送 [= 类型的多维数组19=] 到它。
声明如下:
void handleSlotMessage(int msg[], int resultsFromNodes[][4]){...}
调用 handleSlotMessage
你调用它而不取消引用就像:
handleSlotMessage(msg, resultFromNodes);
在函数内部使用resultFromNodes
就像PHP:
resultFromNodes[i][j] = 0;
printf("%i", resultFromNodes[i][j]);
您不能将子集数组与数字进行比较,也不能使用符号 {1,2,3}
,例如:
resultFromNodes[n] == 0xCDCDCDCD; // INVALID
resultFromNodes[n] == {0xCDCDCDCD,0xCDCDCDCD,0xCDCDCDCD}; // INVALID
相反,您必须单独比较每个元素,例如:
resultFromNodes[n][0] == 0xCDCDCDCD && resultFromNodes[n][1] == 0xCDCDCDCD &&
resultFromNodes[n][2] == 0xCDCDCDCD && resultFromNodes[n][3] == 0xCDCDCDCD;
最后一件事是你的代码在访问变量的子集数组时发生了溢出resultFromNodes
您正在 slot_count 存储在 resultFromNodes[controller_id][0]
并且计数器 j
表示 node_id
将具有值 1,2,3
因此总共 4
个元素你只有 3 个元素:
resultFromNodes[controller_id][0] = slot_count;
resultFromNodes[controller_id][1] = node_id; // j=1
resultFromNodes[controller_id][2] = node_id; // j=2
resultFromNodes[controller_id][3] = node_id; // j=3
我在使用来自 PHP 背景的 C 中处理多维数组时遇到问题。
我有一个数组 msg,我现在将其用作输入。数组的第一个元素存储 'node_id',第二个元素存储 'actual message',第三个元素存储 'controller_id'。
任务由函数 handleSlotMessage() 处理:此函数应为每个 controller_id 接收 3 个输入消息(等待直到它接收到所有 3 个消息),在接收到所有 3 个消息后将其进一步处理。
为了存储消息,我正在尝试使用 'Multi-dimensional array'(可以在 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.
resultsFromNodes[controller_id][0] = slot_count;
resultsFromNodes
声明为一维数组,但你给它第二个下标 [0]
.
您可能希望将函数定义为:
void handleSlotMessage(int msg[], int (*resultsFromNodes)[3]) { ... }
并将其命名为:
handleSlotMessage(msg, resultFromNodes);
或同等学历:
handleSlotMessage(msg, &resultFromNodes[0]);
问题不止一个我指出其中的一些
在函数
handleSlotMessage
中,参数resultsFromNodes
应该像int *resultsFromNodes[4]
一样声明,以便能够发送 [= 类型的多维数组19=] 到它。 声明如下:void handleSlotMessage(int msg[], int resultsFromNodes[][4]){...}
调用
handleSlotMessage
你调用它而不取消引用就像:handleSlotMessage(msg, resultFromNodes);
在函数内部使用
resultFromNodes
就像PHP:resultFromNodes[i][j] = 0; printf("%i", resultFromNodes[i][j]);
您不能将子集数组与数字进行比较,也不能使用符号
{1,2,3}
,例如:resultFromNodes[n] == 0xCDCDCDCD; // INVALID resultFromNodes[n] == {0xCDCDCDCD,0xCDCDCDCD,0xCDCDCDCD}; // INVALID
相反,您必须单独比较每个元素,例如:
resultFromNodes[n][0] == 0xCDCDCDCD && resultFromNodes[n][1] == 0xCDCDCDCD && resultFromNodes[n][2] == 0xCDCDCDCD && resultFromNodes[n][3] == 0xCDCDCDCD;
最后一件事是你的代码在访问变量的子集数组时发生了溢出resultFromNodes
您正在 slot_count 存储在 resultFromNodes[controller_id][0]
并且计数器 j
表示 node_id
将具有值 1,2,3
因此总共 4
个元素你只有 3 个元素:
resultFromNodes[controller_id][0] = slot_count;
resultFromNodes[controller_id][1] = node_id; // j=1
resultFromNodes[controller_id][2] = node_id; // j=2
resultFromNodes[controller_id][3] = node_id; // j=3