所以我试图迭代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[];
(我认为是在头文件中。(虽然合法,但在所述目标中不可用于任何明显的方式。它是一个空数组,必须保持这种状态,直到程序退出时它的生命周期结束
很难确切知道什么安排满足要求,因为要求没有明确说明,只提到了使用extern
和const
创建缓冲区的头文件声明,然后应该将缓冲区带出来用于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(,这将不起作用