2011-10-03 67 views
0

有问题,这个公式的输出:C语言结构式

typedef struct 
{ 
    float t, Vx, Vy, Px, Py; 
} datapoint; 

datapoint *data; 
data = malloc(steps * sizeof(datapoint)); 

data[0].Vx = (20*cos(30));   //30 is changed to radians 
data[0].Vy = (20*sin(30)); 
data[0].Px = 0; 
data[0].Py = 0; 

steps=100; 
i=1; 

do 
{ 
    printf("Time: %.2f\t",i*q5); 

    // X 
    data[i].Vx = data[i-1].Vx ;//- CalculateDrag(data[i-1].Vx, q4); 
    data[i].Px = ((data[i-1].Px) + ((data[i].Vx) * i)); 

    printf("X = %.2f\t",data[i].Px); 

    // Y 
    data[i].Vy= data[i-1].Vy - (9.81)*i; //- CalculateDrag(data[i-1].Vy,q4); 
    data[i].Py= data[i-1].Py + (data[i].Vy * i); 

    printf("Y = %.2f\t", data[i].Py); 

    printf("\n"); 
    i++; 
} while(((data[i].Py) >0) && (i<=steps)); 

输出应该是这样的:

Time 0.10s: X = 1.73m Y = 1.00m 
Time 0.20s: X = 3.46m Y = 1.90m 
Time 0.30s: X = 5.20m Y = 2.71m 
.... 
.... 
Time 2.00s: X = 34.64m Y = 1.36m 
Time 2.10s: X = 36.37m Y = 0.40m 
Time 2.20s: X = 38.11m Y = -0.66m 
Landed at X = 38.11 at time 2.20s 

而是将其打印出的其他值。试过我可以但认为有可能是错误的公式代码。

+0

你会得到什么样的价值?并解释公式是什么,它看起来像牛顿的运动公式之一。 – Skizz

+0

花一些时间正确地格式化代码。它可以帮助你和其他人阅读代码。如果你不知道如何,那么阅读其他人的源代码,看看他们如何缩进,评论和格式化。 –

+0

@Skizz:yess是他的一个公式......但是'X'值比我应该得到的要大得多,'Y'值跳到负值。 – Hopla

回答

1

它看起来像你试图增量更新值,但使用的是绝对时间值:

data[i].Px = ((data[i-1].Px) + ((data[i].Vx) * i)); 

,因为你按照上面的步骤值来计算新的值(+ LHS),但加入目前的速度乘以目前为止的总时间(RHS为+)。

你要么需要使用绝对值:

data[i].Px = ((data[0].Px) + ((data[i].Vx) * i)); 

或增量值:

data[i].Px = ((data[0].Px) + ((data[i].Vx) * t)); // where t is the time step 

该工程确定与Px的,因为没有加速度分量。 Py组件有一个加速度组件,所以增量版本会引入一个错误,因为在整个时间步长间隔内速度不是恒定的。您正在用一系列线性部分近似曲线。

我想你想实现以下:

S = UT +在/2

,并试图找到的地步SY为零(命中地面)。而不是使用一个数组,并逐步计算S,这样使用上面的公式:

t = 0; 
u = initial vector; 
a = gravity; 

do 
{ 
    t += time step; 
    s = u * t + a * t * t/2; 
} while (s.x >= 0); 

也将使用一个矢量库中受益(不std::vector,但数学向量),那么你可以只写公式就像上面的代码一样,不要单独计算x和y部分。迁移到3D系统也更容易。

2

从你的代码已经发布:

datapoint *data; 
data[0].Vx = (20*cos(30));  

您使用此uninitalised数据。它可能指向任何地方,这是未定义的行为,所以任何事情都可能发生。

认为从阅读你的代码,你想要做这样的事情:

data = malloc(sizeof(datapoint) * steps); 
+0

是的,谢谢,如果实施,但我的问题是公式计算do-while部分的值。 – Hopla

+0

我认为这只是写问题时的复制/粘贴错误。 – Skizz

1

datapoint变量没有被初始化,它指向某处中的数据,它可以是非常危险的。你应该通过为你的结构分配内存来初始化它。我建议你使用malloccalloc函数来做到这一点。例如:

datapoint *data = calloc(sizeof(datapoint), 20); 

现在你已经分配的结构的数组,你应该释放它到底,你读完后/写它:

free(data); 

编辑: 我不“吨甚至认为你需要动态内存,如果你宣布你的阵列如下就足够:

datapoint data[20]; 

你做不是必须现在free它。事实上,这样做会很危险。