【解決方法】適切な構造でプログラミング ルーチンを呼び出しています…


皆さんにとって迷惑かもしれないし、同時に当惑するかもしれない質問がありますが、これで終わります。

最初に作業するプログラミングの例をいくつか挙げてみましょう。

「C」ルーチンの宣言
int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat);

実際の単純な「C」ルーチンを宣言します。
int RetIntDayNum(char * datestrg, int * intdaynum, int * iostat) {
////



戻り値(1);
}

「C」呼び出しの宣言: ルーチン 1.
iretv = RetIntDayNum(cdatestring, &idaynum, &iostat);

「C」呼び出しの宣言: ルーチン 2。
iretv = RetIntDayNum(cdatestring, &idaynum);

さて、質問です…
「C」ルーチンを呼び出す場合は、「ルーチン 1」を使用する必要があります。 しかし、プログラミング プロジェクトをまとめるときに、後で気づきました。
このプログラムをコンパイルするたびに、私は「ルーチン 2」アプローチを使用していることに気づきました。
コンパイルも問題なく実行されました。

現在、Windows 10 プラットフォームで Enterprise MSVC 2019 環境を使用しています。

「ルーチン 1」を使用するのが正しい方法であることはわかっていますが、「ルーチン 2」を使用するとプログラムが実行されないのはなぜですか
爆発する? なぜ。 それとも、爆発が起こる準備ができているのでしょうか?
現在、この大きなプログラムに戻って、プログラムの間違いをすべて修正する必要があります。 でもそれは面倒です
なぜ「ルーチン 2」アプローチではプログラムが爆発 (または異常終了) しないのですか。

それとも、この待ちに待った爆発が起こるでしょうか?
プログラムはまったく異なる Windows プラットフォームで実行されますか??

私の好奇心旺盛な心は知りたいと思っています…
そしてもう一度、ありがとう!

私が試したこと:

質問エリアと私のプログラミング プロジェクトに表示されている内容。

解決策 1

それはコンパイラによって異なります。ほとんどの場合、2 つのパラメータを指定して呼び出そうとすると、「機能するには引数が少なすぎます」というエラーが表示されます。

それ以外に、関数内で iostat を使用しようとすると、その値が未定義で、メモリの任意の部分に対して読み取りまたは書き込みが行われる可能性があるため、おそらく爆発するでしょう。

あなたが使用しているものを確認したいと思います。MSVC は MicroSoft Visual C で、約 20 年前に Visual Studio の一部となったスタンドアロン製品で、2019 バージョンはありませんでした。
そして、VS 2019 は、C プログラムのパラメーターが少なすぎるとエラーをスローするだろうと確信しています (C では、可変数の引数を持つ関数 (可変個引数関数と呼ばれます) を定義できますが、これは特別な構文を必要とし、使い方が違います)。

コメント

タイトルとURLをコピーしました