c - CS50 [通用 - 但与 PSET4 Recover 相关] 为什么 clang 说我的标识符未针对函数声明?
问题描述
我创建了一个名为 write 的函数(位于 main 之后的底部),它调用了几个变量。写入被调用(初始化? - 对不起,我仍然不确定这个术语)这些变量都是在主函数中调用之前声明的。尽管如此,当我为函数运行 clang 时,它表示函数 write 中的所有变量都未声明。
我可以通过从 main 复制所有声明的变量并将其移动到 main 上方以使程序运行来修复它,但我很好奇为什么原始代码一直说变量没有被识别。从概念上讲,我并不完全明白。有没有办法让我保留在 main 函数中声明的变量,而不是将它们移到 main 之上以使其仍然工作?
这些是在 main 中不断被标记为未声明的变量
int file_count = 0;
char filename[8];
bool first_jpg = false;
BYTE buffer[512];
FILE *photos = NULL;
下面是在将这些变量移到 main 之上之前代码的外观
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: ./recover image\n");
return 1;
}
//Open Memory Card
FILE *card = fopen(argv[1], "r");
int file_count = 0;
char filename[8];
bool first_jpg = false;
BYTE buffer[512];
FILE *photos = NULL;
void write(void);
//Read 512 into a buffer
//Repeat until end of memory card
while (fread(buffer, sizeof(BYTE), 512, card) == 512)
{
//If start of new jpg
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
//if first jpeg
if (!first_jpg)
{
//mark as first jpeg found
first_jpg = true;
write();
}
//not first jpg, meaning it is a new jpg
else
{
//close old jpg file
fclose(photos);
//open and start writing new jpg
write();
}
}
else
{
//if already found jpeg
if (first_jpg)
{
fwrite(buffer, sizeof(BYTE), 512, photos);
}
else
//if no jpeg
//continue reading into file until we find jpg file
{
continue;
}
}
}
}
void write(void)
{
sprintf(filename, "%03i.jpg", file_count);
file_count++;
photos = fopen(filename, "w");
fwrite(buffer, sizeof(BYTE), 512, photos);
}
解决方案
您的变量在main中声明,因此它们不可用于write()。您需要将它们作为参数传递给write()或在main之外声明它们以使它们全局化(即使这通常不是一个好习惯)。
您可能应该更多地了解范围。
推荐阅读
- xcode - 在iOS ionic中条纹不完整的付款
- python - 尝试从 Python 执行 SQL 查询时出现 KeyError
- visual-c++ - 代码分析和 constexpr 函数 - 这个函数是一个很好的候选者吗?
- r - 为闪亮的仪表板创建登录页面
- amazon-web-services - 如何从 AWS Athena 访问成本分配标签数据
- excel - 如何使用 VBA 在 Excel 宏中删除具有两列的重复项?
- neo4j - Neo4j 关系
- bootstrap-4 - 输入“中心”在 Bootstrap 4 中不起作用
- java - 休息断言问题 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory java gradle
- c - 线程 1:从链表中删除时的 EXC_BAD_ACCESS