【问题标题】:Multi-dimensional array in cc中的多维数组
【发布时间】: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


【解决方案1】:

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

void handleSlotMessage(int msg[], int (*resultsFromNodes)[3]) { ... }

并将其称为:

handleSlotMessage(msg, resultFromNodes);

或同等的:

handleSlotMessage(msg, &resultFromNodes[0]);

【讨论】:

    【解决方案2】:

    我指出的问题不止一个

    1. 在函数handleSlotMessage 内部,参数resultsFromNodes 应声明为int *resultsFromNodes[4],以便能够向其发送int [any number][4] 类型的多维数组。 声明如下:

      void handleSlotMessage(int msg[], int  resultsFromNodes[][4]){...}
      
    2. 要调用handleSlotMessage,您无需取消引用即可调用它,就像:

      handleSlotMessage(msg, resultFromNodes);
      
    3. 在函数内部使用resultFromNodes,就像 PHP 一样:

      resultFromNodes[i][j] = 0;
      printf("%i", resultFromNodes[i][j]);
      
    4. 您不能将子集数组与数字或使用符号 {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
    

    【讨论】:

    • 谢谢,我意识到了所有错误并修复了它,因为我是c新手,我真的很草率。好的,再次感谢您。
    • 关于你的函数声明,我不知道为什么,但似乎 *resultsFromNodes 需要在 () int (*resultsFromNodes) [4]){...}
    【解决方案3】:
            resultsFromNodes[controller_id][0] = slot_count;
    

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

    【讨论】:

    • 谢谢,看来我有这个错误,函数定义上的 resultFromNodes 声明为一维数组,以及我从其他答案和评论中意识到的其他一些错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 2014-06-20
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多