CS50 [一般-但与PSET4恢复有关]为什么c称未为函数声明我的标识符?

时间:2020-10-18 18:00:12

标签: c function cs50 recover undeclared-identifier

我创建了一个名为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);
}

1 个答案:

答案 0 :(得分:1)

您的变量在 main 中声明,因此 write()无法使用它们。您需要将它们作为 write()的参数传递,或在 main 外部声明它们以使其成为 global (即使通常不是好的做法)。

您可能应该了解有关范围的更多信息。