0

非常に奇妙な問題で立ち往生しているため、この質問を投稿しました。いくつかの .cpp ファイルといくつかのヘッダーのプロジェクトがあります。特に、このコードは 3 つの異なる .cpp ファイルに含まれています。

void printGraph2d(std::vector < std::vector <plotData> > data, double dy, double dt, const unsigned int M, unsigned int intervalliTemporali);
void printGraph3d(std::vector < std::vector <plotData> > data, double dy, double dt, const unsigned int M, unsigned int intervalliTemporali);
double alpha = 0.000217f;
double hBarra = 0.04f;
double uWall = 100;
double dt = 0.0001f;
const unsigned int Y = 41;
const unsigned int M = 15000;
double dy = hBarra/(Y - 1);
double grid [M][Y];
std::vector <std::array <double, 4> > tridiagonal;
unsigned int intervalliTemporali;

各ファイルで異なる役割を果たします。コンパイラが「複数定義エラー」を取得するのはなぜだろうか。2 つの関数プロトタイプと変数は、(ヘッダーではなく) .cpp ファイルでのみ定義され、宣言されているファイルでのみ使用されます。

宣言の前に「静的」という単語を入れてこのエラーを解決しましたが、問題なく動作しましたが、デバッガーに問題がありました (変数の値が表示されません)。上記の変数と関数の名前を変更すると、デバッガーでのトラブルがなくなることがわかりました。変数の名前を変更する代わりに、グローバルではなく関数内で変数を宣言することにしました。関数の名前は変更していません。このようにすると、関数「cranknicolson1()」を呼び出すたびに、何かを実行する前に突然プログラムがクラッシュします。この非常に奇妙な動作は、関数プロトタイプの前の「静的」という言葉によって引き起こされていると思います。説明できないからです!!! これが私のコードです。http://qpwoei.altervista.org/Code.zip 何かを実行する前に、cranknicolson1() でコードがクラッシュするという事実を強調します。したがって、クランクニコルソン アルゴリズムには問題はありませんが、別の問題があります。誰かが私を助けてくれることを願っています、よろしくお願いします!!

4

2 に答える 2

1

外部から見える同じ名前の複数の定義があるため、「複数の定義エラー」が発生しています。それは違法です。「1つの定義ルール」に違反しています。

mike.did が提案するように、それらを名前のない名前空間に配置するか、それらを静的として修飾することができます。ただし、どちらのソリューションも本当の問題を回避しています。なぜこれほど多くのグローバル変数があるのでしょうか? あなたのコードはあまりオブジェクト指向ではありません。

関数に関する問題cranknicolson1は、この問題とは異なります。別の質問としてそれを尋ねます。

于 2014-02-23T17:16:15.763 に答える
0

匿名名前空間を使用して、これらの定義スコープを対応する .cpp ファイルに縮小する必要があります。それ以外の場合、記号は公開され、他の翻訳単位で使用できます。

名前のない名前空間が使用される理由とその利点についてもお読みください。、匿名の名前空間に構造体を配置するとどうなりますか? 名前のない/匿名の名前空間と静的関数、およびその他のサポートトピックはこちら (リンクをたどってください)。

于 2014-02-23T17:05:06.683 に答える