c-用memcpy对2D阵列的块进行分区



我在memcpy上看到了几个问题,但似乎没有一个能回答我的问题我想复制数组的一个块(左上,然后右上,然后左下,右下(我试过左上,但没能起作用。。。

(*编辑删除的旧代码*(

initial matrix:
{{1,2,39,4},
{4,5,6,4},
{7,8,9,4},
{10,12,30,40}
};

我想在这个例子中检索一个2x2矩阵,其中包含:

|1|2|
|4|5|

有什么办法做到这一点吗?

编辑:感谢@Adrian Mole的评论,我现在知道一个单独的memcpy无法处理这个问题。关于如何以通用的方式处理这个问题(这取决于n的大小(,有什么想法吗?我修改了我的代码如下:

void partition2 (int ** mat, int ** A, int sub_mtrx_size){
int i,j, ioff, joff;
// A TOP-lEFT only for now, worry about other blocks B,C,D later
ioff= 0 * sub_mtrx_size;
joff= 0 * sub_mtrx_size;
printf( "%d %dn" ,ioff,joff);
for (i = 0; i < sub_mtrx_size; i++) {
memcpy( A[i] , mat[i+ioff],sub_mtrx_size );
for (j = 0; j < sub_mtrx_size; j++) {
// A[i][j] =mat[i+ioff][j+joff];  // this works, but not with 1 single memcpy
printf("%3d ", mat[i+ioff][j+joff]);
}
printf("n");
}
int main() {
const int n = 4;
int ** mat =  malloc(sizeof(int*) * n);
int ** C11 =  malloc(sizeof(int*) * n/2);
for (int k = 0; k < n; k++) {
mat[k] =  malloc(sizeof(int) * n);
if ( k < n/2){
C11[k] =  malloc(sizeof(int) * (n/2));
}

}
printf("aaaaaaaaaaaaaan");
init(mat,n,n);
// init puts {{1,2,39,4},{4,5,6,4},{7,8,9,4},{10,12,30,40}};
int sub_mtrx_size= n/2;
partition2(mat,C11,sub_mtrx_size );
for (int i = 0; i < n; i++)
{
// int* currentIntPtr = mat[i];
free(mat[i]);
if ( i < n/2){
free(C11[i]);
}
}
free (mat);
free (C11);
return 0;
}

这里有memcpy,我只得到第一列。。。

感谢

我解决了它:

这里有一个从初始矩阵mat中提取4个块(a,B,C,D(的分块函数。它只被测试并被认为适用于2次方的大小。

void partition2 (int ** mat, int ** A,int ** B,int ** C,int ** D, int sub_mtrx_size){
int i,j, ioff, joff;
// A TOP-lEFT
ioff= 0 * sub_mtrx_size;
joff= 0 * sub_mtrx_size;
for (i = 0; i < sub_mtrx_size; i++) {
memcpy( A[i] , mat[i+ioff], sub_mtrx_size* sizeof(**A) );
}


// B Bottom-left
ioff= 1 * sub_mtrx_size;
joff= 0 * sub_mtrx_size;
for (i = 0; i < sub_mtrx_size; i++) {
memcpy( B[i] , mat[i+ioff], sub_mtrx_size* sizeof(**A) );
}

// C TOP-right
ioff= 0 * sub_mtrx_size;
joff= 1 * sub_mtrx_size;
for (i = 0; i < sub_mtrx_size; i++) {
for (j=0; j<sub_mtrx_size ; j++){
C[i][j] = mat[i+ioff][j+joff];
}
}

// D BOTTOM-RIGHT
ioff= 1 * sub_mtrx_size;
joff= 1 * sub_mtrx_size;
for (i = 0; i < sub_mtrx_size; i++) {
for (j=0; j<sub_mtrx_size ; j++){
D[i][j] = mat[i+ioff][j+joff];
}

}

}

最新更新