我获得了一个动态分配的维度宽度 x 高度元素矩阵。我需要" crop"由矩形定义的矩阵的一部分:(start_col,start_line)(end_col,end_line)
示例:
给定矩阵(3 * 3):
redis-benchmark
和弦:(1,1)(1,1)
结果矩阵是:
1 2 3
4 5 6
7 8 9
我该怎么做?
我的矩阵由如下结构元素组成:
5
所以我声明并分配了这样的矩阵:
typedef struct Pixel{
int R;
int G;
int B;
}Pixel;
现在我应该如何使用realloc来保留我需要的小子矩阵?
答案 0 :(得分:0)
你可以分配与列相同的行(所以它们只是像素的指针,而不是像素本身)然后你可以:
答案 1 :(得分:0)
现在我应该如何使用realloc来保留我需要的小子矩阵?
首先,您可以释放不被保留的行'数据。然后,在您移动剩余的行之后'数据和指向各自存储空间开头的指针,你可以realloc
空格,e。 G:
void crop(Pixel ***img, int start_col, int start_line,
int * end_col, int * end_line)
{
Pixel **imp = *img;
// free the memory space of the to-be-dropped row data
for (int i = 0; i < start_line; ++i) free(imp[i]);
for (int i = * end_line; ++i < height; ) free(imp[i]);
// move the to-be-kept row pointers to start at row 0
*end_line -= start_line; // resulting last row
size_t col_size = (*end_line+1) * sizeof *imp; // resulting pointers' size
memmove(imp, imp+start_line, col_size);
// move the to-be-kept column data to start at column 0
*end_col -= start_col; // resulting last column
size_t row_size = (*end_col+1) * sizeof **imp; // resulting row data size
for (int i = 0; i <= * end_line; ++i)
memmove(imp[i], imp[i]+start_col, row_size),
imp[i] = realloc(imp[i], row_size); // trim the memory space of the row
*img = realloc(imp, col_size); // trim the memory space of the row pointers
}
您可以将此功能称为:
int end_col = 1, end_line = 1;
crop(&img, 1, 1, &end_col, &end_line), // yields new matrix and new ends
height = end_line+1, width = end_col+1; // important: set new dimensions