【问题标题】:declare an array within a method call in c在 c 中的方法调用中声明一个数组
【发布时间】:2020-06-07 06:19:24
【问题描述】:

有没有办法在 C 中的方法调用中声明一个数组?

我目前有:

void printConcatLine(char chunks[][20]) {
  for(int x = 0; x < sizeof(chunks); ++x) {
    if(x < (sizeof(chunks) - 1)) {
      Serial.print(chunks[x]);  
    } else {
      Serial.println(chunks[x]);    
    }  
  }
}



 char chunks[][20] = {
    "{", 
    "255"
    "}"
  };

  printConcatLine(chunks);

有没有办法在方法调用中声明数组,而不是事先在变量中声明它?
类似于:

printConcatLine(["{", "255", "}"]);

【问题讨论】:

  • 请注意,sizeof (chunks) 无论您如何将其传递给函数都会评估指针的大小,即:chunks 是一个指针(void printConcatLine(char chunks[][20]) {...}void printConcatLine(char (*chunks)[20]) {...} 相同)。
  • @McWayWeb a method call in C? Serial.print 强烈建议您在 arduino 环境中使用 C++。您可能刚刚发现,C++ 和 C 是不同的语言,在 C 中工作的东西并不意味着在 C++ 中也能工作。例如,下面的答案是完全有效的 C 代码,同时在 C++ 中不起作用。如果您缩进询问 C++,我建议在这里接受答案并针对 C++ 提出一个单独的问题(甚至复制问题,只需用 C++ 而不是 C 标记它)。

标签: c arrays multidimensional-array


【解决方案1】:

可以使用compound literals:

printConcatLine((char [][20]){ "{", "255", "}" });

将字符串数组传递给函数。


请注意,复合文字是仅限 C 语言的东西,它在 C++ 中不起作用。如果在 Arduino 上工作,使用的语言 C++。

如果您使用 C++ 编程,则根本不可能不修改您调用的函数,以接受标准 C++ 容器或可能是 Arduino 特定容器。

【讨论】:

  • 原代码传递了一个数组数组。所以答案取决于函数是如何定义的
  • 我尝试使用它,但它给了我一个错误:“获取临时数组的地址”。这是否与方法调用中如何指定数组有关?
  • @McWayWeb 更新了复合文字的类型,使其与函数声明匹配。
  • @McWayWeb 确保您使用 C 编译器来编译代码。
【解决方案2】:
void printConcatLine(char chunks[][20]) {
  for(int x = 0; x < sizeof(chunks); ++x) {
    if(x < (sizeof(chunks) - 1)) {
      Serial.print(chunks[x]);  
    } else {
      Serial.println(chunks[x]);    
    }  
  }
}



 char chunks[][20] = {
    "{", 
    "255"
    "}"
  };

  printConcatLine((char*[]){ "{", "255", "}" });
````````````````````````

【讨论】:

  • 抱歉,不,这是无效的。无法使用指向 20 个字符的数组的指针访问指向 char 的指针数组。 IE。 char** 不是 char (*chunks)[20]
猜你喜欢
  • 2013-02-07
  • 2020-02-15
  • 1970-01-01
  • 2014-02-09
  • 2010-10-30
  • 2011-02-11
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多