なぜ2つの異なる結果が得られるのですか?(ブール値の問題)

ドン・ドレイパー

私はほとんどの場合Python開発者ですが、最近Cを使用していくつかの問題を解決する必要があり、正直なところ、それは私を苦しめています。

func.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 %.100f\n", total_sum);

    printf("DIFFERENCE SMALL %d\n", fabs(total_sum - 2 * M_PI) < 0.00005);

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

    //return res;
}

Source.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 ? "true\n" : "false\n");

    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;
    }

}

Point.h


#pragma once

struct Point {
    double x, y;
};

Coordinates.txt

1 2 5 0 7 4 5 6 2 5

lap.txt(最初の数値は長方形の頂点の数、2番目と3番目はポイントの座標です。

5 7 3

このアルゴリズムは、回転数法を使用して、ポイントが特定のポリゴンのエッジの内側/外側/エッジ上にあるかどうかを判断します。

ポイント(7,3)(内側の2番目と3番目の数字lap.txt)はポリゴンの外側にあるため、正解は「OUTSIDE / FALSE」です。それでも、デバッグ/リリースや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では、likeを返すreturn <some_expression>ことに慣れており、に変換されることを期待していますTrue/Falseただし、Cでは、これは正しくないようです。そうでない場合は、他のエラーが発生します。

アンティハーパラ

明らかな問題の1つは、暗黙的な関数宣言の問題です。

どちらでもない

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

そして

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

翻訳ユニットでは宣言されていませんsource.cしたがって、コンパイラは関数が型であると想定します

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);

Point.hで。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

これらの2つのNodeJS / Typescriptインポートで異なる結果が得られるのはなぜですか?

分類Dev

ファイルのsha256sumをチェックすると、なぜ2つの異なる結果が得られるのですか?

分類Dev

なぜここで異なる結果が得られたのですか?

分類Dev

同じである必要があるのに、なぜ異なるブール結果が得られるのですか?

分類Dev

myHDLマニュアルのこの例で異なる結果が得られるのはなぜですか?

分類Dev

再帰的な問題でlist.pop()とlist = list [:-1]を使用すると、異なる結果が得られるのはなぜですか

分類Dev

MILP問題から整数以外の結果が得られるのはなぜですか?

分類Dev

3つの異なるテーブルから1つの値を取得すると、間違った結果が得られます-postgresql

分類Dev

これらの2つのコードが異なる結果をもたらすのはなぜですか

分類Dev

メソッドが同期されているのに、2つのスレッドで異なる結果が得られるのはなぜですか?

分類Dev

2つのソリューション間で異なる結果プロットが得られたのはなぜですか?

分類Dev

結合クエリで3つのテーブルに期待される結果が得られないのはなぜですか

分類Dev

これらの2つのGREPコマンドで異なる結果が得られるのはなぜですか?

分類Dev

D3jsで同じコードで異なる結果が得られるのはなぜですか?

分類Dev

なぜ空の結果が得られるのですか?

分類Dev

同じ数式[javascript]の2つの形式から異なる結果が得られるのはなぜですか?

分類Dev

MatLab:同じ関数で2つの異なる結果が得られます

分類Dev

Linq Selectなぜ結果が得られるのですか?

分類Dev

デバッグまたは実行すると、2つの異なる結果が得られるのはなぜですか?

分類Dev

1つのファイルを含むフォルダーと2つ以上のファイルを含むフォルダー間でGet-ChildItemを使用すると、異なる結果が得られるのはなぜですか

分類Dev

この単純なRループを「ベクトル化」すると異なる結果が得られるのはなぜですか?

分類Dev

配列を `printf`で結合すると、ターミナルとスクリプトで異なる結果が得られるのはなぜですか?

分類Dev

配列を `printf`で結合すると、ターミナルとスクリプトで異なる結果が得られるのはなぜですか?

分類Dev

PCA:なぜprincomp()とprcomp()からそれほど異なる結果が得られるのですか?

分類Dev

追加と連結で異なる結果が得られるのはなぜですか?

分類Dev

ターミナルからとJavaでcurlコマンドを実行すると、異なる結果が得られるのはなぜですか?

分類Dev

メモリ使用量のピークを見つけるために異なる結果が得られるのはなぜですか?

分類Dev

Seleniumの同じWebElementで異なる結果が得られるのはなぜですか?

分類Dev

git bash(msysgit)とcygwinのgitで異なる結果が得られるのはなぜですか?

Related 関連記事

  1. 1

    これらの2つのNodeJS / Typescriptインポートで異なる結果が得られるのはなぜですか?

  2. 2

    ファイルのsha256sumをチェックすると、なぜ2つの異なる結果が得られるのですか?

  3. 3

    なぜここで異なる結果が得られたのですか?

  4. 4

    同じである必要があるのに、なぜ異なるブール結果が得られるのですか?

  5. 5

    myHDLマニュアルのこの例で異なる結果が得られるのはなぜですか?

  6. 6

    再帰的な問題でlist.pop()とlist = list [:-1]を使用すると、異なる結果が得られるのはなぜですか

  7. 7

    MILP問題から整数以外の結果が得られるのはなぜですか?

  8. 8

    3つの異なるテーブルから1つの値を取得すると、間違った結果が得られます-postgresql

  9. 9

    これらの2つのコードが異なる結果をもたらすのはなぜですか

  10. 10

    メソッドが同期されているのに、2つのスレッドで異なる結果が得られるのはなぜですか?

  11. 11

    2つのソリューション間で異なる結果プロットが得られたのはなぜですか?

  12. 12

    結合クエリで3つのテーブルに期待される結果が得られないのはなぜですか

  13. 13

    これらの2つのGREPコマンドで異なる結果が得られるのはなぜですか?

  14. 14

    D3jsで同じコードで異なる結果が得られるのはなぜですか?

  15. 15

    なぜ空の結果が得られるのですか?

  16. 16

    同じ数式[javascript]の2つの形式から異なる結果が得られるのはなぜですか?

  17. 17

    MatLab:同じ関数で2つの異なる結果が得られます

  18. 18

    Linq Selectなぜ結果が得られるのですか?

  19. 19

    デバッグまたは実行すると、2つの異なる結果が得られるのはなぜですか?

  20. 20

    1つのファイルを含むフォルダーと2つ以上のファイルを含むフォルダー間でGet-ChildItemを使用すると、異なる結果が得られるのはなぜですか

  21. 21

    この単純なRループを「ベクトル化」すると異なる結果が得られるのはなぜですか?

  22. 22

    配列を `printf`で結合すると、ターミナルとスクリプトで異なる結果が得られるのはなぜですか?

  23. 23

    配列を `printf`で結合すると、ターミナルとスクリプトで異なる結果が得られるのはなぜですか?

  24. 24

    PCA:なぜprincomp()とprcomp()からそれほど異なる結果が得られるのですか?

  25. 25

    追加と連結で異なる結果が得られるのはなぜですか?

  26. 26

    ターミナルからとJavaでcurlコマンドを実行すると、異なる結果が得られるのはなぜですか?

  27. 27

    メモリ使用量のピークを見つけるために異なる結果が得られるのはなぜですか?

  28. 28

    Seleniumの同じWebElementで異なる結果が得られるのはなぜですか?

  29. 29

    git bash(msysgit)とcygwinのgitで異なる結果が得られるのはなぜですか?

ホットタグ

アーカイブ