首页 > 解决方案 > 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);
}

标签: cfunctioncs50recoverundeclared-identifier

解决方案


您的变量在main中声明,因此它们不可用于write()。您需要将它们作为参数传递给write()或在main之外声明它们以使它们全局化(即使这通常不是一个好习惯)。

您可能应该更多地了解范围


推荐阅读