2013-04-28 175 views
1

嗨我是C編程的新手,我只是試圖用函數調用替換部分代碼,但我不知道如何正確執行,請幫助。如何編寫此函數C

我只想線d = ...等同於行e = ...

#include <stdio.h> 
#include <math.h> 

double dist(int i, int j, double v[100][2]) 
{ 
    return sqrt(pow((v[j][0] - v[i][0]),2) + pow((v[j][1] - v[i][1]), 2)) 
} 

main() 
{ 
    double v[100][2], d, e; 

    v[1][0] = 0; 
    v[1][1] = 1; 

    v[2][0] = 1; 
    v[2][1] = 1; 

    d = sqrt(pow((v[1][0] - v[2][0]),2) + pow((v[1][1] - v[2][1]), 2)); 

    e = dist(1,2,v); 

    printf("\n%f\n",d); 
    printf("\n%f\n",e); 
} 
+0

你對你寫的代碼有什麼問題?請注意'main'是一個函數,所以在某種程度上你已經知道函數的語法。如果您正在學習C語言的基本語法,請通過書籍,教程,課程等來完成,而不是一點一點地要求SO。 – 2013-04-28 22:35:23

+2

注意:正確地聲明'main()'返回一個'int'(不要依賴隱式返回decl類型)並正確返回一個實際值。 – WhozCraig 2013-04-28 22:35:57

+0

好的,謝謝大家。 – 2013-04-28 22:45:58

回答

10
double dist(int i, int j, double (*v)[2]) 
{ 
    return sqrt(pow((v[j][0] - v[i][0]),2) + pow((v[j][1] - v[i][1]), 2)); 
} 
0

d = DIST(0,1,V)

或測距(1,0,V)

點0和點1之間的距離...順序無關緊要。

編輯:我上面有一個函數CALL,根據要求。 d =相當於e = ...寫另一個函數相當浪費代碼,更重要的是,並不是實現函數的用途。我堅持我的答案。

0

如果你想同樣的事,不同的類型,你可以使用宏(不建議在此情況下,由於一個像樣的編譯器將內聯函數調用卡託的功能),但只是爲了教育目的

#define dist(i,j,v) sqrt(pow((v[j][0]-v[i][0]),2)+pow((v[j][1]-v[i][1]),2)) 

請記住,sqrt返回一個double,所以如果你想浮動或長雙重返回,你需要sqrtf或sqrtl。

將宏用於數學「函數」的好處是,它們在編譯之前被擴展到代碼中,以便可以將常量計算到計算中,並且有時可以將整個計算減少到更簡單的計算或有時即使是不變的價值。

邁克在數學屬性上是正確的,雖然精度可能會導致2值略有不同(通常這種差異是不需要的)。

+0

內聯不能跨模塊工作。 – LtWorf 2013-04-29 07:23:46

+0

,這取決於你如何構建你的程序,你根本不需要構建模塊:'gcc -O3 -pipe -combine -fwhole-program * .c -o myapp' ...但是最複雜的代碼最初會失敗使用-fwhole-program,除非頭文件被修改 – technosaurus 2013-04-29 17:29:23

+0

頭文件_normally_有一個#ifndef blabla #define blabla以避免雙重包含,無論如何編譯整個程序作爲一個整體(參見-lto,而且你仍然可以編譯單獨的模塊)相當多的內存,反正它沒有默認完成。 – LtWorf 2013-04-29 23:45:13