1

我在传递浮点数组时遇到了一些麻烦。我将一些浮点数组放入 ActivationFunc,然后从那里我将这些相同的数组放入 sgnFunction,由于某种原因最终会产生不同的值。

#include <stdio.h>
void sgnFunction(float *input[], float *weight[])
{
    printf("VALUES: %.2f %.2f %2.f, WEIGHTS: %.2f, %.2f, %.2f\n", *input[0], *input[1], *input[2], *weight[0], *weight[1], *weight[2]);
}

void ActivationFunc(float *x, float *w, float *n, int *d)
{
    printf("VALUES: %.2f %.2f %2.f, WEIGHTS: %.2f, %.2f, %.2f\n", x[0], x[1], x[2], w[0], w[1], w[2]);
    sgnFunction(&x, &w);
}

int main()
{
    float x1[3] = {1, 0, 1};
    float x2[3] = {0, -1, -1};
    float x3[3] = {-1, -0.5, -1};
    int d[3] = {0, 1, 1};
    float w[3] = {1, -1, 0};
    float n = 0.1;

    ActivationFunc(x1, w, &n, &d[0]);
}

如果我从“sgnFunction(&x, &w);”中删除“&”,我会收到以下编译器错误:

test.c: In function 'ActivationFunc':
test.c:10:9: warning: passing argument 1 of 'sgnFunction' from incompatible pointer type
test.c:2:14: note: expected 'float **' but argument is of type 'float *'

我不明白修复它意味着什么。我知道我可能只是在使用指针搞砸了一些事情。一个很好的解释出了什么问题,我的指针做错了什么,以及如何解决这个问题将不胜感激。

4

4 回答 4

2

如果你这样调用函数

 sgnFunction(x, w);  

你的定义应该是

void sgnFunction(float *input, float *weight) // you just need to change array of pointers to single pointer 
{
    printf("VALUES: %.2f %.2f %2.f, WEIGHTS: %.2f, %.2f, %.2f\n", input[0], input[1], input[2], weight[0], weight[1], weight[2]); // here also
}
于 2013-10-03T04:14:33.990 回答
0
sgnFunction(&x, &w);

问题是您正在传递类型为 的指针的地址float **。做就是了 -

sgnFunction(x, w);

x是类型float *。因此,doing&x将产生类型为 的指针的地址float **

此外,传递一个数组将衰减到指向数组中第一个元素的指针。所以将函数签名更改为 -

void sgnFunction(float *input, float *weight);
于 2013-10-03T04:11:44.597 回答
0

void sgnFunction(float *input[], float *weight[])

你不是说: void sgnFunction(float *input, float *weight)

float *a[] 实际上是一个 float **a

于 2013-10-03T04:14:36.080 回答
0

关键是,在 c 中,数组下标运算符的优先级高于取消引用运算符。因此,表达式 *input[0] 将被评估为 *(input[0])。

考虑声明,

int a[3][4] = { {1, 2 ,3}, {4, 5, 6} };

这里'a'是一个二维数组,'&a[0][0]'投影第一个元素的地址,'a[0]'投影第一行的地址,'a'投影基地址数组。如果您在上述所有三种情况下都打印地址,您将得到相同的值,但地址的性质不同。第一种情况,地址指向一个元素,第二种情况,地址指向一行元素,第3种情况,地址指向整个数组。

在您的函数 sgnFunction 中,

在评估 *input[0] 时,它被评估为 *(input[0]) 这指的是“输入”的第一行,即“x”,因此您的值符合预期。但是在评估input[1] ( (input[1])) 时,这是指“输入”的第二行。但是没有第二排。因此垃圾价值。要解决此问题,请将 *input[1] 更改为 (*input)[1]。

附带说明一下,在调用函数 sgnFunction 时,使用按值调用而不是按引用调用就足够了。

于 2013-10-03T04:38:40.410 回答