C 将传递指针视为参数

C 将传递指针视为参数,c,pointers,C,Pointers,我试图编写一个基本的零阈值函数。这样,如果数组元素的值大于零,则必须保持不变,否则必须为零。但我的问题是使用指针将数组值从main传递给函数。这是片段。im是输入数组,im2是存储结果的数组。t是阈值,为0,m是顺序。将输入数组从main传递到thresh函数时。我刚刚在thresh函数中检查了im的值,但是所有的值都显示为0,正如下面代码中的注释,而不是原始值。我哪里做错了 int thresh(double *im[], double *im2[], int t, int m) {

我试图编写一个基本的零阈值函数。这样,如果数组元素的值大于零,则必须保持不变,否则必须为零。但我的问题是使用指针将数组值从main传递给函数。这是片段。im是输入数组,im2是存储结果的数组。t是阈值,为0,m是顺序。将输入数组从main传递到thresh函数时。我刚刚在thresh函数中检查了im的值,但是所有的值都显示为0,正如下面代码中的注释,而不是原始值。我哪里做错了

int thresh(double *im[], double *im2[], int t, int m)
{
    int i, j;
    printf("im:%f", im[0]); //here i am getting output as zero instead of 1
    for (i = 0; i < m; i++)
    {
        if (im[i] > t)
            im2[i] = im[i];
        else
            im2[i] = 0;
    }
    return 0;
}

int main()
{
    float im[4] = { 1,-2,3,-4 };
    float im2[4];
    int th = 0;
    thresh((float*)im, (float*)im2, th, 2);

    getch();
    return 0;
}

打开编译器警告并读取它们。他们是来帮忙的。这是我在编译中得到的:

$ gcc main.c 
main.c: In function ‘thresh’:
main.c:10:23: warning: comparison between pointer and integer
             if (im[i] > t)
                       ^
main.c: In function ‘main’:
main.c:24:12: warning: passing argument 1 of ‘thresh’ from incompatible pointer type [-Wincompatible-pointer-types]
     thresh((float*)im, (float*)im2, th, 2);
            ^
main.c:4:5: note: expected ‘double **’ but argument is of type ‘float *’
 int thresh(double *im[], double *im2[], int t, int m)
     ^~~~~~
main.c:24:24: warning: passing argument 2 of ‘thresh’ from incompatible pointer type [-Wincompatible-pointer-types]
     thresh((float*)im, (float*)im2, th, 2);
                        ^
main.c:4:5: note: expected ‘double **’ but argument is of type ‘float *’
 int thresh(double *im[], double *im2[], int t, int m)
     ^~~~~~
所以有一些事情需要解决

首先,thresh的原型应该是int thresh double*im,double*im2,int t,int m或者更好的int thresh const double*im,double*im2,int t,int m


第二,为什么要混合浮动和双浮动?坚持使用1,除非你有很好的理由,否则坚持使用double。

如果im[i]>t你在这里比较一个指针和一个int。哦,好的。谢谢,我注意到了。但是为什么我没有像我在代码中打印的那样得到初始数组值呢。我的分数是零。有什么想法吗??谢谢编译器警告!上面的代码有很多明显的问题,如果你允许的话,大部分问题都会被编译器发现。你为什么要混合使用float和double呢?除非由于系统或库约束而必须使用,否则不要使用float。这不是1984年。谢谢你的宝贵建议。我将尝试一下。打开警告绝对是此时能给你的最有价值的建议。澄清一下:您需要在命令行中添加启用警告的开关。一个典型的建议是-Wall-Wextra-Wpedantic。