0

我的程序解码由随机像素覆盖的图像,要解码图像,我必须将每个像素的红色分量乘以 10。绿色和蓝色分量与新的红色分量具有相同的值。我创建了多个辅助函数,以使代码在 main 中更易于阅读,但是当我尝试运行我的 a.out 时,我不断收到“分段错误”。我似乎找不到我的错误!帮助表示赞赏。

void check_argument(int arg_list)
{
   if (arg_list < 2)
   {
      perror("usage: a.out <input file>\n");
   }
}

void print_pixel(int a, FILE *out)
{
   int r, g, b;

   r = a * 10;

   if (r > 255)
   {
      r = 255;
   }

   g = r;
   b = r;

   fprintf(out, "%d\n", r);
   fprintf(out, "%d\n", g);
   fprintf(out, "%d\n", b);
}

void read_header(FILE *in)
{
   char str[20];

   for (int i = 0; i < 3; i++)
   {
      fgets(str, 20, in);
   }
}

FILE*  open_files(FILE *infile, char *input[])
{
   infile = fopen(input[1], "r");

   if (infile == NULL)
   {
      perror("Error: Cannot read file.\n");
   }

   return infile;
}

void decode(int arg_list, char *in[])
{
   FILE *input, *output;

   int check, red, green, blue;

   open_files(input, in);
   output = fopen("hidden.ppm", "w");

   fprintf(output, "P3\n");
   fprintf(output, "%d %d\n", 500, 375);
   fprintf(output, "255\n");

   read_header(input);
   check = fscanf(input, "%d %d %d", &red, &green, &blue);

   while (check != EOF)
   {
      print_pixel(red, output);
      check = fscanf(input, "%d %d %d", &red, &green, &blue);
   }

   fclose(input);
   fclose(output);
}

int main(int argc, char *argv[])
{
   check_argument(argc);
   decode(argc, argv);
}
4

2 回答 2

0

由于这应该是家庭作业,我将尝试向您展示一些常见的错误来源以及如何找到它们。

  1. 在此之前必须(应该)分配使用的变量。这尤其适用于指针,例如FILE *.

  2. 如果一个函数(例如fopen())失败,它通常会通过返回一个特殊值来表明这一点,在继续之前必须对其进行检查。

  3. 要检查变量具有哪个值,可以使用printf()来显示它。

这是为了查找主要错误,例如段错误。

但是逻辑错误也很难找到:如果您读取 3 个值并将它们存储到变量中,那么将它们全部使用而不是仅使用其中一个可能更有用。(但也许这还不是本练习的目标。)


我之前写了几行,然后才知道在给定程序中搜索错误不是任务,而是自己编写程序,所以现在我会更具体一点。

AFILE *是返回的东西fopen()。您可以将其返回,也可以将其写入变量或由“更深一层”的指针间接指向的另一个内存位置。

所以你应该重写你的open_files()(顺便说一句:为什么 file* s *?它目前只有一个......):

要么返回值(首选):

FILE* open_files(char *input[])
{
   FILE *infile = fopen(input[1], "r");

   if (infile == NULL)
   {
      perror("Error: Cannot read file.\n");
   }

   return infile;
}

并调用它

input = open_files(input);

或使用“通过引用”:

void open_files(FILE **infile, char *input[])
{
   *infile = fopen(input[1], "r");

   if (*infile == NULL)
   {
      perror("Error: Cannot read file.\n");
   }

   return *infile;
}

并调用它

open_files(&input, in);

只有这样做,您才能input真正写入调用者站点上的变量。

于 2013-06-03T23:16:29.140 回答
0

调用后,open_files(input, in);您将没有文件句柄input

于 2013-06-03T23:21:27.847 回答