我有這個程式來計算給定兩點的中點。它接受兩點的坐標并回傳它們的中點坐標。
在此程序中,我的程式開始輸出錯誤的答案。我檢查了它,發現故障部分與功能有關。我不知道為什么會這樣。
附上我的代碼:
#include <stdio.h>
#include <math.h>
struct line{
struct point{
float x;
float y;
}point1, point2, midpoint;
};
struct line solveMidpoint(struct line line1){
printf("%f\n", line1.point1.x);
line1.midpoint.x = (line1.point1.x line1.point2.x)/2;
line1.midpoint.y = (line1.point1.y line1.point2.y)/2;
return line1;
}
int main(void){
struct line liner;
printf("Enter x and y for point1: ");
scanf("%f %f", &(liner.point1.x), &(liner.point1.y));
printf("Enter x and y for point2: ");
scanf("%f %f", &(liner.point2.x), &(liner.point2.x));
printf("Midpoint: %f, %f", solveMidpoint(liner).midpoint.x, solveMidpoint(liner).midpoint.y);
}
當我輸入兩個點時,結果如下:
Enter x and y for point1: 1 1
Enter x and y for point2: 0 1
1.000000
1.000000
Midpoint: 1.000000, 0.500000
[Program finished]
該程式只列印了兩次浮點數。我做了一個類似的程式,但問題沒有出現。我究竟做錯了什么?
編輯:我注意到有關陣列未定義行為的回復并修復了它。但是,我的主要問題是 printf 陳述句列印值的兩個實體而不是一個。
我仍然不知道為什么呼叫 line1.point1.x 會導致其值被列印兩次。在主函式中呼叫它只會列印一次。
uj5u.com熱心網友回復:
line1.midpoint = &arr[0];
當該函式結束時,您正在從函式中取出一個指向區域變數的指標,該陣列不再可用。歡迎來到未定義的行為領域。
uj5u.com熱心網友回復:
在函式solveMidpoint中輸出相同的值
printf("%f\n", line1.point1.x);
但是在退出函式后回傳一個指向本地陣列的指標會呼叫未定義的行為
float *solveMidpoint(struct line line1){
float arr[2];
//...
line1.midpoint = &arr[0];
return line1.midpoint;
}
而且似乎在這個宣告中
printf("Midpoint: %f, %f", *solveMidpoint(liner), *solveMidpoint(liner) 1);
你的意思是以下論點
printf("Midpoint: %f, %f", *solveMidpoint(liner), *( solveMidpoint(liner) 1 ));
但是,沒有理由在結構中宣告指標并從函式回傳指標。您可以只回傳浮點型別的物件或包含兩個浮點型別資料成員的結構型別的物件。
uj5u.com熱心網友回復:
關于:
printf("Enter x and y for point2: ");
scanf("%f %f", &(liner.point2.x), &(liner.point2.x));
point2 的 x 和 y 將沒有.x兩個輸入的欄位。建議:
printf("Enter x and y for point2: ");
scanf("%f %f", &(liner.point2.x), &(liner.point2.y));
^
^
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487550.html
