gpt4 book ai didi

c - 在 C 函数中传递参数

转载 作者:太空狗 更新时间:2023-10-29 15:58:31 26 4
gpt4 key购买 nike

我是 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 GridDim.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 test.c -o 测试 GridDim.o

但我没有得到正确答案。有人知道为什么吗?

答案应该是 米=101 n=51 k=4但我得到了 m=1 n=1 k=-12

最佳答案

您需要为您的 GridDim 函数声明一个函数原型(prototype),并将其包含在包含您的 main 方法的文件中。

原因是除非编译器有一个声明参数类型的函数原型(prototype),否则它将把所有 float 提升为 double 。在运行时,您的 float 被提升为 double ,然后传递给 GridDim,后者读取 double 的前半部分并将其解释为 float 。如果您打印 GridDim 中的值,您会看到 float 作为损坏的值出现。

如果您在头文件中声明您的方法,例如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__*/

...并将其#include 到 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);
}

... 并将其#include 到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com