c语言中的多维数组

c语言中的多维数组,c,arrays,pointers,multidimensional-array,microcontroller,C,Arrays,Pointers,Multidimensional Array,Microcontroller,我在使用来自PHP背景的C语言中的多维数组时遇到了一个问题 我有一个数组msg,我现在正在使用它作为输入。数组的第一个元素存储“节点id”,第二个元素存储“实际消息”,第三个元素保存“控制器id” 任务由函数handleSlotMessage()处理:对于每个控制器id,该函数应接收3条输入消息(等待直到它接收到所有3条消息),在接收到所有3条消息后,将其进一步传递以进行处理 对于存储消息,我尝试使用“多维数组”(可以简单地用PHP实现):resultFromNodes,但由于我对“C”的知识有

我在使用来自PHP背景的C语言中的多维数组时遇到了一个问题

我有一个数组msg,我现在正在使用它作为输入。数组的第一个元素存储“节点id”,第二个元素存储“实际消息”,第三个元素保存“控制器id”

任务由函数handleSlotMessage()处理:对于每个控制器id,该函数应接收3条输入消息(等待直到它接收到所有3条消息),在接收到所有3条消息后,将其进一步传递以进行处理

对于存储消息,我尝试使用“多维数组”(可以简单地用PHP实现):
resultFromNodes
,但由于我对“C”的知识有限,我无法完成这项工作

对于handleSlotMessage函数中resultFromNodes变量的所有用法,我得到一个错误
订阅的值不是数组、指针或向量。

如何在“C”中实现这一点?我试着回答,以检查数组是否已设置

#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.
#定义未初始化的0xCDCD
void handleSlotMessage();
int main(int argc,const char*argv[]{
int resultFromNodes[99][3]={UNINITIALIZED};
int i,j;
int msg[10];
//仅测试数据
对于(i=1;i<4;i++){
对于(j=1;j<4;j++){
msg[0]=j;//发送方id(节点id)
msg[1]=i*j;//消息
msg[2]=i;//控制器的id(请求者的id)
handleSlotMessage(消息,*resultFromNodes);
}
}
返回0;
}
void handleSlotMessage(int msg[],int resultsFromNodes[]{
//获取控制器id
int controller_id=msg[2];
int node_id=msg[0];
int message=msg[1];
int插槽_计数=3;
//检查resultFromNodes是否已设置控制器\u id
if(resultsFromNodes[controller\u id]==未初始化){
resultsFromNodes[controller\u id][0]=插槽\u计数;
}
if(resultsFromNodes[controller\u id][0]==0){
printf(“已处理的消息和来自发送用于进一步处理的节点的结果!\n”);
}否则{
resultsFromNodes[controller\u id][node\u id]=消息;
printf(“在节点:%i消息:%i控制器:%i\n\r”,节点id,消息,控制器id);
resultsFromNodes[controller_id][0]--;
}
返回;
}
编辑:如果这提供了一个更好的想法,“controller_id”的范围为1-99,因此不检查它是否已设置,而是检查它是否在该范围内是可行的。我不知道这是否有任何帮助。
resultsFromNodes
声明为一维数组,但您给它第二个下标
[0]


resultsFromNodes
声明为一维数组,但您给它第二个下标
[0]

您可能希望将函数定义为:

void handleSlotMessage(int msg[], int (*resultsFromNodes)[3]) { ... }
并称之为:

handleSlotMessage(msg, resultFromNodes);
或同等产品:

handleSlotMessage(msg, &resultFromNodes[0]);

您可能希望将函数定义为:

void handleSlotMessage(int msg[], int (*resultsFromNodes)[3]) { ... }
并称之为:

handleSlotMessage(msg, resultFromNodes);
或同等产品:

handleSlotMessage(msg, &resultFromNodes[0]);

有不止一个问题,我指出其中一些问题

  • 在函数
    handleSlotMessage
    中,参数
    resultsFromNodes
    应该声明为
    int*resultsFromNodes[4]
    ,以便能够向其发送类型为
    int[任意数]
    的多维数组。 宣言内容如下:

    void handleSlotMessage(int msg[], int  resultsFromNodes[][4]){...}
    
  • 要调用
    handleSlotMessage
    ,您可以在不取消引用的情况下调用它,如下所示:

    handleSlotMessage(msg, resultFromNodes);
    
  • 要像PHP一样在函数中使用
    resultFromNodes

    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

    您正在将插槽计数存储在
    resultFromNodes[controller\u id][0]
    计数器
    j
    表示
    节点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
    

    有不止一个问题,我指出其中一些问题

  • 在函数
    handleSlotMessage
    中,参数
    resultsFromNodes
    应该声明为
    int*resultsFromNodes[4]
    ,以便能够向其发送类型为
    int[任意数]
    的多维数组。 宣言内容如下:

    void handleSlotMessage(int msg[], int  resultsFromNodes[][4]){...}
    
  • 要调用
    handleSlotMessage
    ,您可以在不取消引用的情况下调用它,如下所示:

    handleSlotMessage(msg, resultFromNodes);
    
  • 要像PHP一样在函数中使用
    resultFromNodes

    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

    您正在将插槽计数存储在
    resultFromNodes[controller\u id][0]
    计数器
    j
    表示
    节点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
    

    int resultFromNodes[99][3]={UNINITIALIZED}很可能没有达到您可能期望的效果。它使用
    0xcdcdcdcdcd
    从节点[0][0]
    初始化
    resultFromNodes[0]
    ,并使用
    0
    @alk将所有其他元素指定为0,因为我可以检查它是否为0。但问题是,我无法为resultsFromNodes[controller_id][0]、[1]或任何其他数组赋值,简单赋值会显示错误。在C中,读取未初始化的变量会调用未定义的行为。不要那样做。谢谢,我知道了。我可以将所有数组初始化为0,一个继承,似乎问题是用我的函数定义,在这里我使用了一个一维数组来表示结果。