c-为什么我得到两个不同的结果?(布尔值问题)



我大部分时间都是Python开发人员,但最近我需要使用C解决一些问题,老实说,这让我很痛苦。

函数c

#define _CRT_SECURE_NO_WARNINGS
#define M_PI 3.1415926535897932384626433832795028841971693993751058209
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
#include "Point.h"
bool point_on_line(struct Point p1, struct Point p2, struct Point point) {
double min_x = min(p1.x, p2.x);
double max_x = max(p1.x, p2.x);
double min_y = min(p1.y, p2.y);
double max_y = max(p1.y, p2.y);
if (p2.y - p1.y == 0) {
return point.y == p2.y && point.x >= min_x && point.x <= max_x && point.y >= min_y && point.y <= max_y;
}
if (p2.x - p1.x == 0) {
return point.x == p2.x && point.x <= max_x && point.x >= min_x && point.y >= min_y && point.y <= max_y;
}
double k = (p2.y - p1.y) / (p2.x - p1.x);
double b = (p2.x * p1.y - p1.x * p2.y) / (p2.x - p1.x);
return point.y == (k * point.x + b) && point.x >= min_x && point.x <= max_x && point.y >= min_y && point.y <= max_y;
}
double calculate_angle(struct Point p1, struct Point p2) {
double dot_product = p1.x * p2.x + p1.y * p2.y;
double lenp1 = sqrt(p1.x * p1.x + p1.y * p1.y);
double lenp2 = sqrt(p2.x * p2.x + p2.y * p2.y);
double orientation = p1.x * p2.y - p1.y * p2.x;
int sign;
if (orientation > 0) {
sign = 1;
}
else {
sign = -1;
}
return sign * acos(dot_product / (lenp1 * lenp2));
}
bool check_border(struct Point p, struct Point points[], int size) {
for (int i = 0; i < size - 1; i++) {
if (point_on_line(points[i], points[i + 1], p)) {
return true;
}
}
return false;
}
bool calc_angle_sum(struct Point p1, struct Point points[], int size) {
struct Point* vectors = malloc(size * sizeof(struct Point));
for (int i = 0; i < size; i++) {
struct Point temp = { points[i].x - p1.x,points[i].y - p1.y };
vectors[i] = temp;
}
double total_sum = 0;
for (int i = 0; i < size - 1; i++) {
total_sum += calculate_angle(vectors[i], vectors[i + 1]);
}
bool res = (fabs(total_sum - 2 * M_PI)) < 0.00005;
printf("TOTAL SUM %.100fn", total_sum);
printf("DIFFERENCE SMALL %dn", fabs(total_sum - 2 * M_PI) < 0.00005);
return fabs(total_sum - 2 * M_PI) < 0.00005;
//return res;
}

源.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Point.h"
int main() {
int length = 5;
struct Point p1 = { 1,2 };
struct Point p2 = { 5,0 };
struct Point p3 = { 7,4 };
struct Point p4 = { 5,6 };
struct Point p5 = { 2,5 };
struct Point p6 = { 1,2 };
struct Point points_test[6] = {p1,p2,p3,p4,p5,p6};
struct Point point_test = {7,3};
//bool result = calc_angle_sum(point, points, length + 1);
//printf("%s", result ? "truen" : "falsen");
if (check_border(point_test, points_test, length + 1)) {
printf("BORDER");
return 0;
}
else if (calc_angle_sum(point_test, points_test, length + 1)) {
printf("INSIDE");
return 0;
}
else {
printf("OUTSIDE");
return 0;
}
}

点.h


#pragma once
struct Point {
double x, y;
};

坐标.txt

1 2 5 0 7 4 5 6 2 5

lap.txt(第一个数字是矩形顶点的数量,第二个和第三个数字是点的坐标。

5 7 3

该算法使用缠绕数方法确定一个点是否在给定多边形的边内/外/上。

(7,3)(lap.txt内的第二个和第三个数字(位于多边形外部,因此正确答案为"outside/FALSE"。尽管如此,输出的不同取决于Debug/Release和我从calc_angle_sum函数返回的方式。

当我以这种方式返回时:

return fabs(total_sum - 2 * M_PI) < 0.00005;

根据调试/发布模式,我会得到不一致的结果。

然而,以下方式似乎很有效:

bool res = (fabs(total_sum - 2 * M_PI)) < 0.00005
return res

下面是Source.c内部调用方法的部分:

else if (calc_angle_sum(point, points, length + 1)) {
printf("INSIDE");
return 0;
}

关于C.中如何评估表达式,有一点我无法理解

在Python中,我习惯于像return <some_expression>一样返回,并期望它被转换为True/False。然而,在C中,这似乎不是真的,或者还有其他一些错误。

一个明显的问题是隐式函数声明。

两个

bool calc_angle_sum(struct Point p1, struct Point points[], int size)

bool check_border(struct Point p, struct Point points[], int size)

不在翻译单元CCD_ 8中声明。因此,编译器假定这些函数属于类型

int calc_angle_sum()
int check_border()

如果函数的返回类型为int,则可以通过这种方式兼容地调用它们——使用这些参数。但由于函数的实际返回类型是bool,因此函数调用的行为是未定义的。

C99删除了隐式函数定义。一个兼容的C99、C11、C17编译器必须抱怨source.c中的这些函数调用。但不合格的MSVC编译器几乎无法满足长期过时的C89规范。。。

因此,请尝试声明

bool calc_angle_sum(struct Point p1, struct Point points[], int size);
bool check_border(struct Point p, struct Point points[], int size);

在点.h.

最新更新