我是C语言的新手。我用C语言编写了一个函数,并将参数传递给它,但我得到了不同的答案,正如我所料。
功能是

void GridDim(float long1, float long2, float dx,
             float lat1, float lat2, float dy,
             float depth1, float depth2, float dh,
             int *m, int *n, int *k)
{
    *m = (int) ((long2-long1)/dx+1);
    *n = (int) ((lat2-lat1)/dy+1);
    *k = (int) ((depth2-depth1)/dh+1);
}

我用gcc编译它:
gcc-c网格尺寸c
然后我将对象文件用作主文件并编译该文件
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
 int m,n,k;
 GridDim(20.0,30.0,0.1,10.0,15.0,0.1,5.0,20.0,5.0,&m,&n,&k);
 printf("m= %d\nn= %d\nk= %d\n", m, n, k);
 return 1;
}

gcc测试.c-o测试griddim.o
但我没有得到正确的答案。
有人知道为什么吗?
答案应该是
m=101
N=51个
K=4
但我得到m=1 n=1 k=-12

最佳答案

您需要为griddim函数声明一个函数原型,并将其包含在包含main方法的文件中。
原因是,除非编译器有一个声明参数类型的函数原型,否则它将把所有浮点数提升为双倍。在运行时,您的float被提升为doubles,然后传递给griddim,griddim读取double的前半部分并将其解释为float。如果在griddim中打印值,您将看到浮动作为损坏的值传入。
如果在头文件中声明方法,例如griddim.h:

#ifndef __GRID_DIM_DOT_H__
#define __GRID_DIM_DOT_H__

extern void GridDim(float long1, float long2, float dx, float lat1, float lat2, float dy, float depth1, float depth2, float dh, int* m, int* n, int* k);

#endif/*__GRID_DIM_DOT_H__*/

…并将其包含在griddim.c中(以确保定义与声明匹配):
#include <stdio.h>
#include "GridDim.h"

void GridDim(float long1, float long2, float dx,
             float lat1, float lat2, float dy,
             float depth1, float depth2, float dh,
             int *m, int *n, int *k)
{
    printf("long1 =  %10.6f\n", long1);
    printf("long2 =  %10.6f\n", long2);
    printf("dx =     %10.6f\n", dx);
    printf("lat1 =   %10.6f\n", lat1);
    printf("lat2 =   %10.6f\n", lat2);
    printf("long1 =  %10.6f\n", dy);
    printf("depth1 = %10.6f\n", depth1);
    printf("depth2 = %10.6f\n", depth2);
    printf("dh =     %10.6f\n", dh);

    *m = (int) ((long2-long1)/dx+1);
    *n = (int) ((lat2-lat1)/dy+1);
    *k = (int) ((depth2-depth1)/dh+1);
}

…并将其包含在main.c中,以确保调用与声明匹配:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "GridDim.h"

int main()
{
 int m,n,k;
 GridDim(20.0f,30.0f,0.1f,10.0f,15.0f,0.1f,5.0f,20.0f,5.0f,&m,&n,&k);
 printf("m= %d\nn= %d\nk= %d\n", m, n, k);
 return 1;
}

…然后参数将正确传递给gridDim函数。我添加了一些printf语句以便您可以看到这一点。
如果注释掉main.c中的“include”griddim.h,那么您将看到当前版本的代码中发生了什么:
long1 =    0.000000
long2 =    0.000000
dx =      -0.000000
lat1 =     0.000000
lat2 =     0.000000
long1 =   -0.000000
depth1 =   0.000000
depth2 =   0.000000
dh =       0.000000
m= 1
n= 1
k= -2147483648

使用“include”,输出如下所示:
long1 =   20.000000
long2 =   30.000000
dx =       0.100000
lat1 =    10.000000
lat2 =    15.000000
long1 =    0.100000
depth1 =   5.000000
depth2 =  20.000000
dh =       5.000000
m= 101
n= 51
k= 4

关于c - 在C函数中传递参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19065003/

10-09 08:03