将 short * 传递给 short *(*)[ ] 的不兼容指针类型
incompatible pointer types passing short * to short *(*)[ ]
当然,我在这里做错了什么,但是看着这个我无法弄清楚为什么我会收到这些警告:
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;
}
我想继续使用指向数组的中间指针。
这些变量
__int16_t *ptr0 = &src0[0][0];
__int16_t *ptr1 = &src1[0][0];
被明确声明为 __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 );
函数期待:
__int16_t *src0[N][N]
它的类型(如编译器建议的那样)__int16_t *(*)[4]
,或者用英语表示:指向 [指向 [array of 4 __int16_t
]] 的指针(注意我使用的方括号重点)。
你这里有:
__int16_t src0[N][N] = { { 1, 1, 1, 1},
{ 2, 2, 2, 2},
{ 3, 3, 3, 3},
{ 4, 4, 4, 4} };
属于__int16_t (*)[4]
类型,即:指向[数组4__int16_t
]的指针。
您可能打算声明:
hammingDistance2d(__int16_t src0[N][N], __int16_t src1[N][N]) {
// ...
}
与以下相同:
hammingDistance2d(__int16_t (*src0)[N], __int16_t (*src1)[N]) {
// ...
}
请注意,在这种情况下,您 不必 使用 *
运算符取消引用 src0[i][j]
。
您正在传递 __int16
的二维数组,但您的函数需要一个指向 __int16_t
.
的指针
修复函数定义以处理您发送的内容。
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);
当然,我在这里做错了什么,但是看着这个我无法弄清楚为什么我会收到这些警告:
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;
}
我想继续使用指向数组的中间指针。
这些变量
__int16_t *ptr0 = &src0[0][0];
__int16_t *ptr1 = &src1[0][0];
被明确声明为 __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 );
函数期待:
__int16_t *src0[N][N]
它的类型(如编译器建议的那样)__int16_t *(*)[4]
,或者用英语表示:指向 [指向 [array of 4 __int16_t
]] 的指针(注意我使用的方括号重点)。
你这里有:
__int16_t src0[N][N] = { { 1, 1, 1, 1},
{ 2, 2, 2, 2},
{ 3, 3, 3, 3},
{ 4, 4, 4, 4} };
属于__int16_t (*)[4]
类型,即:指向[数组4__int16_t
]的指针。
您可能打算声明:
hammingDistance2d(__int16_t src0[N][N], __int16_t src1[N][N]) {
// ...
}
与以下相同:
hammingDistance2d(__int16_t (*src0)[N], __int16_t (*src1)[N]) {
// ...
}
请注意,在这种情况下,您 不必 使用 *
运算符取消引用 src0[i][j]
。
您正在传递 __int16
的二维数组,但您的函数需要一个指向 __int16_t
.
修复函数定义以处理您发送的内容。
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);