【发布时间】:2021-09-29 05:23:07
【问题描述】:
首先,这是我较大项目中的一个 sn-p 代码,因此请原谅缺少错误检查和其他小细节。为了便于阅读,我排除了这些细节。
这个 sn-p 应该读取 .raw 文件并将数据存储到 uint16_t * 中,然后将其转换为需要使用 fwrite() 作为相同文件写回的二维数组。
我知道写入image_ptr 的数据是正确的。我相信当我尝试将变量 image_ptr 保存到 main 函数中名为 image 的二维数组中,或者它发生在我的 save_image 函数中的 fwrite() 语句中时,我的问题就出现了。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define MAX_ROW 2560
#define MAX_COL 2160
uint16_t image[MAX_ROW][MAX_COL];
uint16_t* get_image_data(uint32_t image_index)
{
int result;
char filename[32];
sprintf(filename, "image%d.raw", image_index);
FILE *image_raw = fopen(filename, "rb");
fseek(image_raw, 0, SEEK_END);
long filesize = ftell(image_raw);
rewind(image_raw);
long num_samples = filesize / sizeof(uint16_t);
/*READ IMAGE DATA*/
uint16_t *image_data_ptr = (uint16_t*) malloc(filesize);
size_t num_read = fread(image_data_ptr, sizeof(uint16_t), num_samples, image_raw);
fclose(image_raw);
return image_data_ptr;
}
int save_image()
{
int row, col, pixel_index = 0;
int data_size = MAX_ROW * MAX_COL;
uint16_t * image_data = malloc((sizeof *image_data)*data_size);
image_data = image[0];
FILE *ptr_image_file;
ptr_image_file = fopen("image21.raw", "wb");
for(col = 0; col < MAX_COL; col++)
{
if(**(image + col) != 0)
{
if (fwrite(*(image + col), sizeof(uint16_t), MAX_ROW, ptr_image_file) != MAX_ROW)
{
fprintf(stderr, "Can't write to output file\n");
fclose(ptr_image_file);
return -1;
}
}
}
fclose(ptr_image_file);
return 0;
}
int main()
{
uint16_t * image_ptr = malloc((sizeof *image_ptr)*MAX_ROW*MAX_COL);
//Get Image Data
image_ptr = get_image_data(1);
int row, col, pixel_index = 0;
for(col = 0; col < MAX_COL; col++)
{
for(row = 0; row < MAX_ROW; row++)
{
*(*(image + col) + row) = *(image_ptr + pixel_index);
pixel_index++;
}
}
save_image();
return 0;
}
【问题讨论】:
-
整个序列中应该只有一个
malloc(即get_image_data)。分配空间,以便您可以将文件数据读入内存,然后将该指针传递给需要该数据的任何其他函数,包括将数据写回文件的函数。 -
,你有一个内存泄漏 uint16_t * image_ptr = malloc(...); image_ptr = get_image_data(1);malloc返回的指针被get_image_data返回的指针覆盖,所以原来的内存块被保留但不能被引用。与您的question yesterday 一样,您为什么使用uint16_t*?在我看来,您只需要原始字节,您可能会遇到将 2 个字节对写回文件的字节序问题。 -
@yano 如果我在函数调用之前不使用 malloc ,那么我会遇到分段错误。我正在使用 uint16_t 因为二维数组
image就是这种类型。image应该通过通讯接收 16 位数据。 -
@SergeyA 我不确定你所说的二维数组在 C 中不存在是什么意思。网上有很多资源在讨论,我可以轻松地在我的代码中存储和操作数据。跨度>
-
@RMarms 这是一个流行的误解。 C 没有多维数组。相反,它具有您喜欢的任何类型的一维数组。例如,您可以有一个数组数组——为简单起见,它通常表示为一个多维数组,但就 C 类型系统而言,它不是,尽管在许多情况下表现得好像它是一个多维数组。昏暗的数组,在其他情况下没有。
标签: c pointers multidimensional-array fwrite