2011-10-03 68 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它。事實上,這樣做會很危險。