我的程序解码被随机像素覆盖的图像,为了解码图像,我必须将每个像素的红色分量乘以10.绿色和蓝色分量与新的红色分量相同。我创建了多个辅助函数,使代码更容易在main中读取,但是当我尝试运行我的a.out时,我不断得到“Segmentation Fault”。我似乎无法找到我的错误!感谢帮助。
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);
}
答案 0 :(得分:0)
由于这应该是家庭作业,我会试着向您展示一些常见的错误来源以及如何找到它们。
在此之前必须(应该)分配使用的变量。这特别适用于指针,例如。 G。 FILE *
。
如果函数(例如fopen()
)失败,它通常会通过返回一个特殊值来指示这一点,在继续之前必须检查该值。
要检查变量的值,您可以使用printf()
进行显示。
这是为了查找诸如段错误之类的主要错误。
但逻辑错误也很难找到:如果你读取3个值并将它们存储到变量中,那么使用它们而不是只使用其中一个可能更有用。 (但也许这个还不是这个练习的目标。)
我在此之前编写了这些行,然后才知道在给定程序中搜索错误不是任务,而是自己编写程序,所以到现在为止我会更加具体。
FILE *
是fopen()
返回的内容。您可以将其返回,也可以将其写入由“更深层次”指针间接指向的变量或其他内存位置。
所以你应该重写你的open_files()
(BTW:为什么文件* 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
。
答案 1 :(得分:0)
调用open_files(input, in);
后,您将无法在input
中使用文件句柄。