首页 > 解决方案 > 将短 * 传递给短 *(*)[ ] 的不兼容指针类型

问题描述

当然,我在这里做错了,但是看着这个我不知道为什么我会收到这些警告:

warning: incompatible pointer types passing '__int16_t *' (aka 'short *') to parameter of type '__int16_t *(*)[4]' [-Wincompatible-pointer-types]
        hammingDistance2d(ptr0, ptr1);

在我的小代码段中:

void hammingDistance2d(__int16_t *src0[N][N],
                       __int16_t *src1[N][N]){
    int i, j;
    __uint16_t Hdis[N][N] = {0};

    for (i=0 ; i<N; i++){
        for (j=0; j<N; j++){
            __uint16_t z = *src0[i][j] ^ *src1[i][j];
            while (z > 0)
            {
                Hdis[i][j] += z & 1;
                z >>= 1;
            }
        }
    }
int main(){

    __int16_t src0[N][N] = {  { 1, 1, 1, 1},
                              { 2, 2, 2, 2},
                              { 3, 3, 3, 3},
                              { 4, 4, 4, 4} };
    __int16_t src1[N][N] = {  { 1, 1, 1, 1},
                              { 2, 2, 2, 2},
                              { 5, 5, 5, 5}, // different row
                              { 4, 4, 4, 4} };
    __int16_t *ptr0 =  &src0[0][0];
    __int16_t *ptr1 =  &src1[0][0];

    hammingDistance2d(ptr0, ptr1);
    return 0;
}

我想继续使用指向数组的中间指针。

标签: carrayspointersimplicit-conversion

解决方案


这些变量

__int16_t *ptr0 =  &src0[0][0];
__int16_t *ptr1 =  &src1[0][0];

被显式声明为具有 type __int16_t *

但是对应的函数参数

void hammingDistance2d(__int16_t *src0[N][N],
                       __int16_t *src1[N][N]){

其实有类型__int16_t * ( * )[N]

没有从第一种类型到第二种类型的隐式转换。所以编译器发出错误。

看来你的意思是以下

void hammingDistance2d(__int16_t src0[N][N],
                       __int16_t src1[N][N]){
    int i, j;
    __uint16_t Hdis[N][N] = {0};

    for (i=0 ; i<N; i++){
        for (j=0; j<N; j++){
            __uint16_t z = src0[i][j] ^ src1[i][j];
            while (z > 0)
            {
                Hdis[i][j] += z & 1;
                z >>= 1;
            }
        }
    }
}

函数调用看起来像

hammingDistance2d( src0, src1 );

如果要声明用作函数参数的中间指针,则应编写

__int16_t ( *ptr0 )[N] =  src0;
__int16_t ( *ptr1 )[N] =  src1;

并调用函数

hammingDistance2d( ptr0, ptr1 );

推荐阅读