我创建了一个名为write的函数(放置在main的底部),该函数调用多个变量。写被称为(已初始化?-抱歉,我对此尚不确定)这些变量都在主函数中的调用之前声明。尽管如此,当我为函数运行clang时,它说未声明函数写入中的所有变量。
我能够通过从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);
}
答案 0 :(得分:1)
您的变量在 main 中声明,因此 write()无法使用它们。您需要将它们作为 write()的参数传递,或在 main 外部声明它们以使其成为 global (即使通常不是好的做法)。
您可能应该了解有关范围的更多信息。