-1

Ubuntu と Windows で実行される小さな振動運動プログラムを作成しています。プログラムの一部(大部分)を完了した後、Windowsでテストしようとしましたが、正常に動作しました(Pelles Cで作業)次に、仮想マシン(VMwareワークステーション)で実行されているUbunutuコンピューターにデータをコピーしました。GCC を使用してコンパイルすると、「セグメンテーション違反 (コア ダンプ)」エラーでクラッシュします。クラッシュする前の出力:

Simulation Starting...
Creating Containers.....
Done!
Initializing Containers.....
Initializing Container
Done!...
Initializing Container
Done!...
Initializing Container
Segmentation fault (core dumped)
--------------------------------

シミュレーションで使用する前にベクトルを初期化するために必要な関数 zDA.c の一部

int InitializeArray (DATA *item) {
    printf("\nInitializing Container");
    item->num_allocated = 0;
    item->num_elements = 0;
    item->the_array = NULL;
    printf("\nDone!...");
    if (!item->the_array) {
    return -1;
    }
    return 0;
}

関数の呼び出し中、zSim.c からのスニペット

int Simulate(SIMOPT so,PRINTOPT po) {
    printf("\nSimulation Starting...\nCreating Containers...");
    //Create Data Objects
        //vectors
    DATA Theta,Omega,T;
    DATA *pTheta = Θ
    DATA *pOmega = Ω
    DATA *pT = &T;

        //Initial Values
    int method = so.method;
    float g = so.g;
    float l = so.l;
    float itheta = so.theta;
    float iomega = so.omega;
    float dt = so.dt;
    float df = so.df;
    float dw = so.dw;
    float q = so.q;
    float maxtime = so.maxtime;

        //backend variables
    float i = 0; //Simulation Counter
    int k=0;     //Counter to Count array size;
    int kmax = 0;
    float th,thi,om,omi,t,ti; //Simulation variables

    int gt,go,pl,mat;
    printf("..");
    printf("\nDone!\nInitializing Containers...");
    printf("..");
    //Initialize Containers
    InitializeArray(pTheta);
    InitializeArray(pOmega);
    InitializeArray(pT);           //**FOR SOME REASON, it stops working here -_- 
    printf("DONE! NIT");           //It worked fine on windows, there are no dependencies.
    th = pTheta->the_array[0];     
    om = pOmega->the_array[0];
    t = pT->the_array[0];

なぜそれがWindowsで機能したのか、ubuntuでは機能しなかったのかわかりません。Pellesのコンパイラーが私のために何かを修正したか、仮想マシンが狂っています。つまり... 3つの配列のうち2つがすでに初期化されています。 3番目は間違っています:)」?

4

1 に答える 1

2

初期化はクラッシュしないようです。しかし、その直後のコードは疑わしいようです。配列は初期化されていません (まあ... 初期化されていますが、NULL に初期化されています) が、次のコードは配列にアクセスします。

th = pTheta->the_array[0];
于 2013-03-22T16:39:32.663 に答える