プログラムの改正点のアドバイスをおねがいします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takuma

プログラムの改正点のアドバイスをおねがいします

#1

投稿記事 by takuma » 10年前

コード:

#include <iostream>
#include<fstream>
#include <string>
#include "dumbbell.h"
#include <cstdlib>
using namespace std;


Dumbbell::Dumbbell()
{
    gp = new SoSeparator;
    cp = new SoCylinder;
    rgb = new RGBColor;
//    tr = new Trans;
//    ro = new Rotate;
}

SoSeparator *Dumbbell::makeDumbbell()
{
    int seg[1000][7];
    SoSeparator *segment[1000];
    SoSeparator *buf[1000];
    SoCylinder *cyl;
    Trans *trn;
    Rotate *rot;

 ifstream input_file("data4d.out");
    int n, s=0;
    for(int k=1;k<=22; k++){
//cout << "k=" << k <<endl; 
        for(int j=1;j<=5; j++){
            input_file >> n;
            for(int i=0; i<n; i++){
                seg[s][0]=n;
                seg[s][5]=j;
                seg[s][6]=k; 
                for(int l=1; l<5; l++){
                    input_file >> seg[s][l];
                }
                 s++;
            }
         }
    }
    int smax =s-1;

/*    for(int i=0; i<s; i++){
        cout << endl;
        for(int j=0;j<=6; j++){
            cout << "seg[" << i << "][" << j << "]=" << seg[i][j] << endl;
        }
    }

*/
 ifstream input_file2("data6d.out");
    int bufa[1000][6], o=0;
    for(int p=1;p<=17; p++){
//cout << "p=" << p <<endl; 
        for(int q=0;q<6; q++){
            for(int r=0; r<4; r++){
                bufa[o][4]=p;
//cout << bufa[o][4]<<endl;
                bufa[o][5]=q;
                bufa[o][6]=r;
//              input_file2 >> bufa[o][q];
//cout << r<< endl;    
            }
                o++;
         }
    }
    int omax = o - 1;
/*cout << omax<<endl;
    for(int i=0; i<o; i++){
        cout << endl;
        for(int j=0;j<=6; j++){
            cout << "bufa[" << i << "][" << j << "]=" << bufa[i][j] << endl;
        }
    }
*/

    int g;
    printf("net number(1-22)->");
    scanf("%d",&g);
    for(int s=0; s<=smax; s++){
cout << "here s=" << s << endl;
        double w=seg[s][3]-seg[s][1];
        double h=seg[s][4]-seg[s][2];
        double d=seg[s][5]; 

        segment[s] = new SoSeparator;

        trn = new Trans;
        rot = new Rotate;
        cyl = new SoCylinder;
 
        if(seg[s][1] == seg[s][3]){
           double a= seg[s][1]*2;
           double b=(seg[s][2] + seg[s][4]);
           double c= seg[s][5]*2;
           if(g == seg[s][6])
               segment[s]->addChild(rgb->ycolor());
           else
               segment[s]->addChild(rgb->rcolor());
           segment[s]  ->addChild(trn->trans(a,b,c));
           segment[s]->addChild(rot->roty_m());
           cyl->radius=0.2*2;
           cyl->height =h*2;
        }
        if(seg[s][2] == seg[s][4]){
           double d=(seg[s][1] + seg[s][3]);
           double e =seg[s][2]*2;
           double f= seg[s][5]*2;
           if(g == seg[s][6])
               segment[s]->addChild(rgb->ycolor());
           else
               segment[s]->addChild(rgb->bcolor());
           segment[s]->addChild(trn->trans(d,e,f));
           segment[s]->addChild(rot->rotx_p());
           cyl->radius=0.2*2;
           cyl->height =w*2;
        }
        segment[s]->addChild(cyl);
        gp->addChild(segment[s]);
    }
    for(int o=0; o<=omax; o++){
        buf[o] = new SoSeparator;
        trn = new Trans;
        rot = new Rotate;
//        cyl = new SoCylinder;
        if (buf!=0){
            double x=bufa[o][4]*2;
            double y=-(bufa[o][5]*2);
            double z=r*2;
cout<<"Z=" << z<<endl;
        buf[o]->addChild(rgb->wcolor());
        buf[o]->addChild(trn->trans(x,y,z));        
        buf[o]->addChild(rot->rotz_p());
        cyl = new SoCylinder;
        cyl->radius=0.4;
        cyl->height=1;
        buf[o]->addChild(cyl);
        gp->addChild(buf[o]);
        }
    }
    return (gp);
}
 

Dumbbell::~Dumbbell()
{
}
このようなプログラムを作成しました。
読み込みを行った時のbufa[o][6]と
表示させる時のbufa[o][6]の値が変わってしまっています。
どこかおかしなところはありますか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#2

投稿記事 by みけCAT » 10年前

とりあえず適当に補完してコンパイルが通るようにしてみました。
-g3オプションをつけてコンパイルしたものは落ちないのに、
-O2オプションをつけてコンパイルしたものは強制終了する厄介な状況です。
Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM)2Duo T8100 @2.10GHz 2.10GHz
RAM 4.00GB
GCC(MinGW) 4.8.1
添付ファイル
puroguramunokaiseiten.zip
ソース、バイナリ、入力
(519.78 KiB) ダウンロード数: 101 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#3

投稿記事 by takuma » 10年前

間違ったままうってしまっていました。
132行目のdouble z=r*2 のところが double z=bufa[o][6]
だとコンパイルは通るんですが、違う値がでてしまうんです。
ほんとすみません。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#4

投稿記事 by みけCAT » 10年前

申し訳ありません。-O2の時に落ちたのは解析ミスで入力の数が足りないのが原因だと思います。
入力データを修正しました。
takuma さんが書きました:読み込みを行った時のbufa[o][6]と
表示させる時のbufa[o][6]の値が変わってしまっています。
どこかおかしなところはありますか?
まず、何を表示させる時のことですか?
「表示させる時のbufa[o][6]の値」を調べている場所はどこですか?

回答ありがとうございます。
添付ファイル
puroguramunokaiseiten.zip
ソース、バイナリ、修正した入力
(520.29 KiB) ダウンロード数: 102 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#5

投稿記事 by みけCAT » 10年前

自分の環境でコンパイルすると、直感に合った3が出力されました。
「読み込みを行った時のbufa[o][6]」はどのように確認しましたか?
ちなみにbufa[o][6]は確保された領域の範囲外なので、動作は未定義になるかもしれません。
添付ファイル
puroguramunokaiseiten_rev2.zip
ソースコード、バイナリ、仮入力
(1.01 MiB) ダウンロード数: 102 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#6

投稿記事 by takuma » 10年前

僕のパソコンでも3が表示されました。

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#7

投稿記事 by takuma » 10年前

僕のパソコンでも3が表示されました。
zをcoutで表示させました。

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#8

投稿記事 by takuma » 10年前

確認したところ4,5,6、すべて値がおかしかったです。

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#9

投稿記事 by takuma » 10年前

ということは値がきちんと渡せてないということですね。

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#10

投稿記事 by takuma » 10年前

1,2,3でさえ入れたい値を入れれていませんでした。
全然できていませんでした。
すみません。

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#11

投稿記事 by takuma » 10年前

なぜsegではできbufaではできてないのですか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#12

投稿記事 by みけCAT » 10年前

takuma さんが書きました:なぜsegではできbufaではできてないのですか?
  • bufaへの入力のルーチンはコメントアウトされている。
  • bufa[o][6]は確保されていないので、アクセスしてはいけない。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#13

投稿記事 by takuma » 10年前

22行目のsegと同じように
そこで定義したらいけるのかとおもいましたがちがうのでしょうか・・・。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#14

投稿記事 by みけCAT » 10年前

takuma さんが書きました:22行目のsegと同じように
そこで定義したらいけるのかとおもいましたがちがうのでしょうか・・・。
何をどこで定義するのでしょうか?
とりあえず、配列は必要な要素数以上確保してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#15

投稿記事 by takuma » 10年前

20行目でした。
int seg[1000][7];
のように
int bufa[1000][6];
と20行目の場所に定義する場所を変えるということです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#16

投稿記事 by みけCAT » 10年前

takuma さんが書きました:20行目でした。
int seg[1000][7];
のように
int bufa[1000][6];
と20行目の場所に定義する場所を変えるということです。
場所だけ変えても意味ありません。
必要な要素数を確保してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#17

投稿記事 by みけCAT » 10年前

takuma さんが書きました:22行目のsegと同じように
そこで定義したらいけるのかとおもいましたがちがうのでしょうか・・・。
ちがいます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

takuma

Re: プログラムの改正点のアドバイスをおねがいします

#18

投稿記事 by takuma » 10年前

コメントアウトされているからbufaはできないというのは
64行目のコメントアウトをはずせば可能ということっでしょうか?
理解力が乏しくてごめんなさい。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#19

投稿記事 by みけCAT » 10年前

takuma さんが書きました:コメントアウトされているからbufaはできないというのは
64行目のコメントアウトをはずせば可能ということっでしょうか?
理解力が乏しくてごめんなさい。
実験してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: プログラムの改正点のアドバイスをおねがいします

#21

投稿記事 by みけCAT » 10年前

現状のソースコードを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る