2012-03-04 26 views
0

(可以跳過這部分只是對下面的代碼的解釋,我的問題在代碼塊下)加/減浮動/ ints linux C

嗨。我試圖根據linux計算機使用多少帶寬來限制循環週期。我正在讀取/ proc/net/dev一次,並跟蹤2個變量中傳輸的字節。一次是最近一次檢查,另一次是最近一次。從那裏減去最近的一個來計算在1秒內發送了多少個字節。

從那裏我有變量max_throttle,throttle,max_speed和sleepp。

這個想法是根據使用的帶寬增加或減少sleepp。帶寬越少,延遲越低,時間越長。我現在不得不面對浮點數和整數的問題如果我將所有變量設置爲整數,max_throttle變爲0總是不管我設置其他人爲何,即使我初始化它們。

即使我的if語句中顯示「如果sleepp小於0則返回0」,它會持續更深入更深入的底片,然後在使用0帶寬的情況下在-540之間進行平衡。

和if(ii & 0x40)用於速度和使用控制。在我的應用程序中將不會有1秒的睡眠時間,所以這段代碼允許我限制每20-30次迭代一次就改變一次睡眠。雖然即時通訊也有一個問題,在2X迭代之後,當它觸發它時,它會繼續觸發每次迭代,而不是隻有一次爲真,然後在20-30次迭代後再次爲真。

編輯::簡單的測試投我的變量問題。

#include <stdio.h> 

int main() 
{ 
int max_t, max_s, throttle; 

     max_s = 400; 
     throttle = 90; 
     max_t = max_s * (throttle/100); 
     printf("max throttle:%d\n", max_t); 


return 0; 
} 
+4

請創建一個更簡單的測試用例,最好不超過10行。所有與'fopen'和'sleep'等有關的東西都可能是不相關的,應該刪除。 – 2012-03-04 18:05:29

+0

完成。添加了一個更簡單的測試用例。 – 2012-03-04 18:16:23

+0

你爲什麼分配'\ 0'? – 2012-03-04 18:16:27

回答

4

在C中,operator /是整數除法,僅用於整數。因此,90/100 = 0.爲了使用整數進行浮點除法,首先將它們轉換爲浮點數(或double或其他fp類型)。

max_t = max_s * (int)(((float)throttle/100.0)+0.5); 

+0.5在轉換爲int之前舍入。你可能想考慮一些標準的地板功能,我不知道你的用例。

另請注意,100.0是一個浮點數字,而100將是一個整數字面量。所以,雖然它們看起來相同,但它們不是。

+0

實際上,如果兩個操作數中只有一個是'double' /'float'就足夠了,所以如果你已經寫了'100.',你就可以避免'(float)'cast。 – 2012-03-04 18:24:14

+0

我試過使用它,但它不返回正確的值。我想要做的是獲得max_s的90%。 (例如:400會返回360,但在此代碼中它返回400)。儘管我認爲我找到了一種方法讓花車對我有好處。 – 2012-03-04 18:31:12

+0

@MatteoItalia是的,沒錯,雖然它只是一個符號事物,左邊的int仍然會被鑄造出來。 – kralyk 2012-03-04 18:32:10

1

正如kralyk指出的,C的整數除法90/1000。但是,而不是使用花車你可以用整數工作...只要做到分工乘法(注意括號中的遺漏):

max_t = max_s * throttle/100; 

這給你的總體思路。例如,如果你想要的那種舍入kralyk提到,加50之前做了分工:

max_t = (max_s * throttle + 50)/100;