在c中未定义长度的数组上循环



所以我试图迭代c中的一个char数组。数组是在这样的头文件中定义的。

char const SEQUENCE[] PROGMEM = "MdTqZWYzVf5E661OAd4r7ylINBLNEAzO...该数组的长度远远超过1000个字符。

接下来,我被告知使用extern关键字将数组放入我的主.c文件中。我就是这样做的。不确定这是否完全正确。

extern char const SEQUENCE[];

我试着在数组上循环,并像这样对每个单独的值进行处理。

for (uint8_t I = 0; I < 64; I++) { printf("%c ", SEQUENCE[I]); }

但我把它作为输出。

␏ ␀ ␀ ␀ ␀ ␀ ␀ ..

我期待着这样的事情。M d T q。。。

有人能告诉我这里出了什么问题吗?

正如评论中所提到的,您所展示的内容存在一些明显的问题。。。

  • 类型的uint8_t显然是一个字节宽的,在其值开始重复回零之前,最多产生256次迭代(0-255(,从而一次又一次地打印出前256个字符,。。。。这将不能满足您所述的〃的缓冲区大小;远远超过1000个字符">
  • 声明extern char const SEQUENCE[];(我认为是在头文件中。(虽然合法,但在所述目标中不可用于任何明显的方式。它是一个空数组,必须保持这种状态,直到程序退出时它的生命周期结束

很难确切知道什么安排满足要求,因为要求没有明确说明,只提到了使用externconst创建缓冲区的头文件声明,然后应该将缓冲区带出来用于main()函数。以下解释,尽管基于一些假设,但可以做这些事情,并允许输出缓冲区:

在某个地方。h

const char buf[] = "MdTqZWYzVf5E661OAd4r7ylINBLNEAzO...";//smaller for illustration
#define PROGMEM sizeof(buf) //to be used when indexing through array
extern const char SEQUENCE[] = "MdTqZWYzVf5E661OAd4r7ylINBLNEAzO..."; 

主要.c

#include "something.h"
int main(void)
{
for(int i = 0; i < PROGMEM; i++)//note use of int
{
//extern usage
printf("%c", SEQUENCE[i]);  
}
return 0;
}

注意:extern关键字用于影响范围和持续时间,使函数/变量在整个程序中可见。在本例中,除了声明的要求之外,没有任何令人信服的理由使用extern关键字。在没有extern作用域的头文件中创建的缓冲区SEQUENCE在这里是完全足够的。你可能会很感兴趣地回顾一下其他人对extern关键字应该如何以及何时应用的想法。

标题:

#ifndef INCLUDE_headername_H
#define INCLUDE_headername_H
...
extern const char* SEQUENCE;
...
#endif

c

#include "headername.h"
const char* SEQUENCE = "mystring..."
int main() {
for (int i = 0; SEQUENCE[i]; i++) {
...
}
}

这是有效的,因为SEQUENCE是一个字符串,并且在末尾(并且仅在末尾(将是一个null终止符。如果您自己放置一个(使用\0(,这将不起作用

相关内容

  • 没有找到相关文章

最新更新