0

関数呼び出しに問題がなく、関数への引数が正しく並んでいない場合、関数が何をすべきかについて質問があります。その文はあまり意味をなさないので、私は現在の問題を提供します. 簡単にするために、これが私が持っている最も関連性のある基本的な機能です。

float getYValueAt(float x, PHYS_Line line, unsigned short* error)

    *error = 0;    

    if(x < line.start.x || x > line.end.x){
        *error = 1;
        return -1;
    }

    if(line.slope.value != 0){
        //line's equation: y - line.start.y = line.slope.value(x - line.start.x)
        return line.slope.value * (x - line.start.x) + line.start.y;
    }

    else if(line.slope.denom == 0){
        if(line.start.x == x)
            return line.start.y;
        else{
            *error = 1;
            return -1;
        }
    }

    else if(line.slope.num == 0){
        return line.start.y;
    }
}

この関数は、特定の x 値を指定して、線上の点を見つけようとします。ただし、状況によっては、これができない場合があります。たとえば、x = 3 の行で、値として 5 を渡すと問題が発生します。選択された x の値がラインがオンになっている間隔内にない場合、別の問題が発生します。このために、エラー ポインターを含めました。この形式を考えると、関数呼び出しは次のように機能します。

void foo(PHYS_Line some_line){
    unsigned short error = 0;
    float y = getYValueAt(5, some_line, &error);
    if(error)
        fooey();
    else
        do_something_with_y(y);
}

私の質問はエラーに関するものです。返される値が負の値になることに注意してください。-1 を返しても、エラーが発生したことは保証されません。エラーを追跡するには、次の方法を使用することが望ましい場合があることを知っています。

float* getYValueAt(float x, PHYS_Line line);

エラーが発生した場合は NULL を返しますが、これには動的メモリ割り当てが必要だと思います。これは、私が使用していたソリューションよりも見栄えが悪いようです。では、エラーが発生した場合の標準的な方法は何ですか?

4

2 に答える 2