在c中取消引用指针时遇到问题
我是一个比较擅长运动的人,我发现自己在很多体育书籍上都可以找到,用手工计算货币线赔率中的小数赔率。我正试图编写一个程序,至少可以消除一遍又一遍地计算的负担 我的程序将接受输入“一队资金线团队一队二队资金线团队二”,并输出团队名称以及背面和下注的十进制赔率,如下所示: 输入:Rams+230 Bucs-280 我尝试过去引用的所有排列,但似乎无法阻止它产生分段错误在c中取消引用指针时遇到问题,c,pointers,C,Pointers,我是一个比较擅长运动的人,我发现自己在很多体育书籍上都可以找到,用手工计算货币线赔率中的小数赔率。我正试图编写一个程序,至少可以消除一遍又一遍地计算的负担 我的程序将接受输入“一队资金线团队一队二队资金线团队二”,并输出团队名称以及背面和下注的十进制赔率,如下所示: 输入:Rams+230 Bucs-280 我尝试过去引用的所有排列,但似乎无法阻止它产生分段错误 #include <stdio.h> #include <stdlib.h> void calcML(int
#include <stdio.h>
#include <stdlib.h>
void calcML(int a, float *b, float *c);
int main (int argc, char* argv[])
{
int oneML, twoML;
float oneDF, oneDA, twoDF, twoDA;
oneML = atoi(argv[2]);
twoML = atoi(argv[4]);
printf("Team one is %s with a ML of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);
calcML(oneML, &oneDF, &oneDA);
calcML(twoML, &twoDF, &twoDA);
printf("%s %f %f\n", argv[1], oneDF, twoDA);
printf("%s %f %f\n", argv[3], twoDF, oneDA);
}
void calcML (int a, float *b, float *c)
{
if (a < 0){
int tmp = -a;
*b = 1 + tmp/100;
*c = 100/tmp;
}
else {
*b = 1 + a/100;
*c = 100/a;
}
}
现在的输出是:
Team one is Rams with a ML of +230.
Team two is Bucs with a ML of -280.
Segmentation fault
正如我所说,我知道这是一个指针算术问题,但我尝试了一百万种不同的排列方式,却无法解决。感谢所有不介意指出我愚蠢错误的人 我无法重现segfault,但正如其他人所提到的,您似乎无意中截断了任何浮点值。在
calcML
中,当您执行1+tmp/100时代码>编译器通过将tmp
强制为整数来“帮助您”。这是在MacBook上使用的Clang10.0.1
。我可以想象,将1
更改为1.0
和100
更改为100.0
将有助于澄清一些数学问题。据我所知,您的指针至少看起来都是正确的。这是修复浮点和一些算术后完成的代码
#include <stdio.h>
#include <stdlib.h>
void calcML(int a, float *b, float *c);
int main (int argc, char* argv[])
{
int oneML, twoML;
float oneDF, oneDA, twoDF, twoDA;
oneML = atoi(argv[2]);
twoML = atoi(argv[4]);
printf("Team one is %s with a moneyline of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);
calcML(oneML, &oneDF, &twoDA);
calcML(twoML, &twoDF, &oneDA);
printf("%s %f %f\n", argv[1], oneDF, oneDA);
printf("%s %f %f\n", argv[3], twoDF, twoDA);
}
void calcML (int a, float *b, float *c)
{
if (a < 100){
float tmp = -a;
*b = 1.0 + 100.0/tmp;
*c = tmp/100.0 + 1;
}
else {
*b = 1.0 + a/100.0;
*c = 100.0/a + 1;
}
}
#包括
#包括
无效计算cml(整数a、浮点*b、浮点*c);
int main(int argc,char*argv[])
{
int-oneML,twoML;
浮动oneDF,oneDA,twoDF,twoDA;
oneML=atoi(argv[2]);
twoML=atoi(argv[4]);
printf(“第一组是%s,资金额度为%i.\n第二组是%s,资金额度为%i.\n”,argv[1],oneML,argv[3],twoML);
calcML(oneML、oneDF和twoDA);
calcML(twoML、twoDF和oneDA);
printf(“%s%f%f\n”,argv[1],oneDF,oneDA);
printf(“%s%f%f\n”,argv[3],twoDF,twoDA);
}
无效计算cml(整数a、浮点*b、浮点*c)
{
如果(a<100){
浮动tmp=-a;
*b=1.0+100.0/tmp;
*c=tmp/100.0+1;
}
否则{
*b=1.0+a/100.0;
*c=100.0/a+1;
}
}
无法复制。我建议您下一步应该将main()
中的第一行添加为if(argc<5){/*handle error*/}
与SEGFAULT不相关,但是当您分配给b
和c
时,您将丢弃小数部分。我运行了您的代码,没有得到seg错误。我得到了这个输出:Team one是一个ML为230的Rams。第二队是比克斯队,比分是-280。Rams 3.0000000.000000 Bucs 3.0000000.000000
无seg故障。也许您更改了代码,然后在再次运行之前忘记了编译?最大的线索是您的输出在输出的第二行显示ML
,而问题中给出的代码则输出moneyline
。旁白:tmp/100
执行整数除法。谢谢!是的,我想我发布这个版本时并不知道我已经修复了它哈哈。我认为这是错误的,因为它给了我随机数,但实际上只是因为浮点数错误。谢谢
#include <stdio.h>
#include <stdlib.h>
void calcML(int a, float *b, float *c);
int main (int argc, char* argv[])
{
int oneML, twoML;
float oneDF, oneDA, twoDF, twoDA;
oneML = atoi(argv[2]);
twoML = atoi(argv[4]);
printf("Team one is %s with a moneyline of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);
calcML(oneML, &oneDF, &twoDA);
calcML(twoML, &twoDF, &oneDA);
printf("%s %f %f\n", argv[1], oneDF, oneDA);
printf("%s %f %f\n", argv[3], twoDF, twoDA);
}
void calcML (int a, float *b, float *c)
{
if (a < 100){
float tmp = -a;
*b = 1.0 + 100.0/tmp;
*c = tmp/100.0 + 1;
}
else {
*b = 1.0 + a/100.0;
*c = 100.0/a + 1;
}
}