• 締切済み

ベクターの中のベクターの呼び出し

お世話になります。 下記のように a.h に書いた他のクラスで宣言したベクターのベクター の変数を参照すると一部がうまく取り出せません。 うまく取り出せないとは、値が変わっています。0になっていたり 桁数が増えて違う数字になっていたりします。 具体的には、 vector<vector<RECT_TABLE>> vv = setteiDlg->m_rectlist; for(int i=0 ; i < ninList ; ++i) { suu = vv.at(i).at(0).suu; (1) range.left = vv.at(i).at(0).left;  (2) range.right = vv.at(i).at(0).right; (3) range.top = vv.at(i).at(0).top;   (4) range.bottom = vv.at(i).at(0).bottom (5) : で、(1)と(2)が0であったり、7,8ケタの数字(実際は2ケタ)に代わって取り出されます。後は、OKです。 取り出されるとは、setteiDlg->m_rectlist の中を見ると正しい数字です。 vv = setteiDlg->m_rectlist; として転記した後、vv が正しくないようです。 vv は、別のビューヘッダーに下記のように書いてます。 class CYomiView : public CScrollView { protected: // シリアル化からのみ作成します。 CYomiView(); vector<vector<RECT_TABLE>> vv;        : a.h というヘッダーに記述 class RECT_TABLE { public:   int  left, top, right, bottom, suu; RECT_TABLE(int ............. : } class Settei : public CDialog {    :   vector<vector<RECT_TABLE>> m_rectlist; a.h はここまで 教えてください。お願いします。 Windows 7/Vista VS2005 VC++ MFC

みんなの回答

回答No.2

#1です。 >> 他のソースでバッファオーバランでもしてるんじゃないかと思いますが・ > とは、どういう意味でしょうか? バッファオーバーラン、そのままの意味ですが、 要するに、わけがわからない状態なので、 他のソースコードでバッファオーバーランを起こしていて わけのわからない状態になっているのでは?ということです。 わけのわからない状態になったときに疑うのが、バッファオーバーランです。 int a[10] と宣言しているのに a[10]=1 したときの状態がバッファオーバーランです。 何が起こるかわかりません。 あと考えられるのはRECT_TABLEのコピーコンストラクタが変とかかな?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

質問者さんの問題の部分を簡単に書くと vector<vector<RECT_TABLE>> v; vを適当に初期化 vector<vector<RECT_TABLE>> vv=v; でこのときvvとvの中身が違いますってことですか? 普通に考えると、他のソースでバッファオーバランでもしてるんじゃないかと思いますが・・・。

esueru_201
質問者

補足

お世話になります > vector<vector<RECT_TABLE>> vv=v; > でこのときvvとvの中身が違いますってことですか? そうです。 > 他のソースでバッファオーバランでもしてるんじゃないかと思いますが・ とは、どういう意味でしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Clmage上の画像ファイルを表示する(C++)

    myRgnCreateRectRgn(rect.left,rect.top,rect.right,rect.bottom); は何をしているのか教えてください

  • C# PanelのRegion設定について

    ボタンクリックにてPanelのRegion領域を変更したいのですが、勝手にリサイズされて困っております。 panel1の初期Location.X=0,Location.Y=0 のときはうまくいくのですが、初期Locationに値が入ると、矩形領域自体がリサイズされてしまいます。 (矩形領域が小さくなります。) なお、下記コードはテスト様に作成したもので、panel1のサイズを取得して、GraphicsPath からRegionを設定しています。 同じサイズなので、変化はないハズなのですが、初期Locationに値を設定すると、リサイズされてしまいます。 panel1のプロパティは panelのAutoSize=False Dock=None Margin=0,0,0,0 です。 private void button1_Click(object sender, EventArgs e) { Rectangle rect = new Rectangle(panel1.Location.X,panel1.Location.Y, panel1.Width,panel1.Height); GraphicsPath path = GetRoundRect(rect, 10); Graphics g = CreateGraphics(); g.SmoothingMode = SmoothingMode.AntiAlias; panel1.Region = new Region(path); } public GraphicsPath GetRoundRect(Rectangle rect, int radius) {   path.StartFigure();   path.AddLine(rect.Left, rect.Top, rect.Right, rect.Top);   path.AddLine(rect.Right, rect.Top,rect.Right, rect.Bottom);   path.AddLine(rect.Right, rect.Bottom,rect.Left, rect.Bottom);   path.AddLine(rect.Left, rect.Bottom,rect.Left, rect.Top);   path.CloseFigure();   return path; } アドバイスよろしくお願いいたします。

  • classの中の配列の初期化

    以下のようにclassの中で定義されている配列xを、 x[0]=x0,x[1]=x1,x[2]=x2 となるように初期化するコントラクタを作成したいのですが、 int test[3]={1,2,3}; vector<int> x(1,4,1);//--------1 vector<int> y(test);//---------2 1の場合でも2の場合でもエラーがでます。 どの様にすればいいのでしょうか? template<class TT> class vector{ private:  TT x[3]; public:  vector(TT* vv):x[0](vv[0]),x[1](vv[1]),x[2](vv[2]){}  vector(TT x0,TT x1,TT x2):x[0](x0),x[1](x1),x[2](x2){} };

  • c言語 クラスの中でvectorをクラスに使う

    C++の質問です。クラスの中でクラスをベクターで使うことはできますでしょうか? 画像にペイントしたものをラインごとに保存するプログラムを作っています。 わからないことは 1、ベクターで宣言したクラスの中身を個別にアクセスしたい。 たとえば linesのpointにはA lineにはBといようにアクセスしたいです。 説明がうまくできませんがアドバイスいただけたら助かります。 以下がソースになります。 =line.h========================================================= class paintedline{ public: //左上座標 Tvector2<int> point; //上下左右の保存 int top,botton,left,right; //線の格納 vector<Tvector3<int>> line; paintedline(); }; =linegroup.h========================================================= #include "icg.h" #include"line.h" class line_group{ float choosing_line; public: vector<paintedline> lines; line_group(); //線を保存--------------クリックしてから離すまで void saveline(Tvector2<int>point, vector<Tvector3<int>> line); //線を決定--------------クリックして線を決定 int return_line(Tcolor4<float> color); //線を移動 void move_line(Tvector2<int>pa, Tvector2<int>pb); //線を削除 void delete_line(); //すべての線をpaintedに合成 void synthesizing_lines(); }; =linegroup.cpp========================================================= #include"linegroup.h" #include"line.h" line_group::line_group(){ } //線を保存--------------クリックしてから離すまで void line_group::saveline(Tvector2<int>point, vector<Tvector3<int>> line){ //線の四隅を保存 for(int i=0; i<(int)line.size(); i++){ if(top>line.y) top = line.y; if(botton<line.y) botton = line.y; if(left>line.x) left = line.x; if(right<line.x) right = line.x; } //書かれた線を保存 lines.push_back(line) } //線を決定----------------クリックして線を決定 int line_group::return_line(Tcolor4<float> color){ choosing_line = color.r// rに格納したばんごうを決定 return choosing_line } //線を移動 void line_group::move_line(Tvector2<int>pa, Tvector2<int>pb,){ int x = abs(pa.x - pb.x); int y = abs(pa.y - pb.y); lines.at(n).point = (x,y); synthesizing_lines(); } //線を削除 void line_group::delete_line(){ cout<<"deleteするならdを押してください。"<<endl; lines.erace(choosing_line); }

  • コンパイルエラー: LNK2001

    今、ベクトル計算を簡単にするクラスを作ってみようとしています。 //vector3.h template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   void set(const TT *vv)void set(const TT *vv){     int i;     for(i=0;i<NUM;i++){       x[i]=vv[i];     }   } }; のように、set関数をクラスの中に書いていると問題無いのですが、以下のように、 //vector3.h template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   void set(const TT *vv); }; //test.cpp #include"vector3.h" template<class TT> void vector3<TT>::set(const TT *vv){   int i;   for(i=0;i<NUM;i++){     x[i]=vv[i];   } } と、cppファイルの中に書き換えると以下のようにエラーが出るようになります。 error LNK2001: 外部シンボル ""public: void __thiscall vector3<double>::set(double const *)" (?set@?$vector3@N@@QAEXPBN@Z)" は未解決です。 fatal error LNK1120: 外部参照 1 が未解決です。 これはいったい何故なのでしょうか? 使用しているのはVisualC++2008ExpressEditionです 宜しくお願いします。

  • RAW画像高速表示について

    画像処理ソフトの研究をc言語で行っています。 GUIの導入を目指してVC++の勉強を始めたのですが、RAW画像をうまく表示できず困っています。 現在練習と言うことで、スクロールバーの値によって画像を二値化して表示する処理を行っています。 表示部分を以下のように書いた(ほとんど本を丸写したので意味もちゃんとわかっていませんが)のですが、動作が遅すぎて困っています。 (IMG:unsigned char型の二次元配列にRAWデータを格納したもの) 高速で表示することはできないのでしょうか? アドバイス等、よろしくお願いします。 void Cimage_binView::writeImg(void) {  CClientDC myDC(this);  CDC *pDC = m_pict.GetDC();  int col,row;  int I;  CRgn myRgn;  RECT rect;  m_pict.GetClientRect(&rect);  myRgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);  pDC->SelectObject(&myRgn); //画像出力  for(col=0;col<256;col++)   for(row=0;row<256;row++)   {    I=IMG[col][row];        if(I<m_sbar1.GetScrollPos())I=0;//スクロールバーの値より小さければ黒    else I=255;//大きければ白にする }    pDC->SetPixel(row,col,RGB(I,I,I));  } }

  • コントロールのフォントの変更

    コントロールに任意のフォントを指定できなくて困っています。 class CFrame : public CFrame { private: CFont m_cFont; CStatic m_cStatic; public: CFrame(); afx_msg void OnCreate(LPCREATESTRUCT); }; CFrame::CFrame() { Create( // 省略 ); m_cFont.CreateFont( // 省略 ); } axf_msg void CFrame::OnCreate(LPCREATESTRUCT lp) { RECT rect; DWORD dw; rect.top = 10; rect.left = 10; rect.right = 100; rect.bottom = 60; dw = WS_CHILD | WS_VISIBLE; m_cStatic.Create("AAAAAA", dw, rect, this, ID); m_cStatic.SetFont(&m_cFont, TRUE); } 文字は表示されるのですが、フォントがおそらくデフォルトのままだと思われるのですが、どうしてかわかりません。 ダイアログベースでは、OnInitDialogで実行していたと思いますが、以上のコードではだめなんでしょうか? よろしくお願いします。

  • CSSのcaption-side:・・・

    続けて質問すみません。 CSSのcaption-side:なのですが、 right / left / bottom はテーブルのどこに配置されるのが正しい配置ですか?        TOP   ┏━━━━━━━━━━━┓   ┃              ┃   ┃              ┃ left┃              ┃right   ┃              ┃   ┃              ┃   ┗━━━━━━━━━━━┛        bottom ですか?  left   TOP  right ┏━━━━━━━━━━━┓ ┃              ┃ ┃              ┃ ┃              ┃ ┃              ┃ ┃              ┃ ┗━━━━━━━━━━━┛      bottom ですか?

  • 2次元のvectorにオブジェクトのポインタを格納

    VC++6.0です。 まず、ポインタでなく、int型の格納なら分かったんです。 ・・・ #include <vector> using namespace std; main(){ vector <vector<int > > a(10); ←←← for(int i=0;i<10;i++){ a[i].resize(10); } ・・・ for(int j=0;j<10;j++){ for(int i=0;i<10;i++){ a[i][j]=i+j; } } ・・・ } という感じで利用できることが。 しかし、やりたいのは、整数型でなく、 オブジェクトのポインタを格納したいんですが、 矢印部分を例えば、vector <vector<class *> > a(10); などどしてもエラーになってしまいます。 どのように実装したらよいのでしょうか?

  • SetWindowPosで指定したサイズにしたい

    イメージを描画する際に、イメージのサイズ分とウインドウを構成する要素のサイズを足して、SetWindowPos でサイズを変更していますが、サイズが不足しています。 難しいです。 教えてください。お願いします。 ///////////////////////////////////////////// void CImageRectView::OnLButtonDown(UINT nFlags, CPoint point) { CImage image; image.Load("000.jpg"); CDC *imageDC=CDC::FromHandle(image.GetDC()); CDC *pDC=GetDC(); int mnuh=GetSystemMetrics(SM_CYMENU); int titleh=GetSystemMetrics(SM_CYCAPTION); CRect FrameRect,ClientRect; GetWindowRect(&FrameRect); GetClientRect(&ClientRect); int FrameWidth=(FrameRect.right-FrameRect.left)-(ClientRect.right-ClientRect.left); int FrameHeight=(FrameRect.bottom-FrameRect.top)-(ClientRect.bottom-ClientRect.top); GetParentFrame()->SetWindowPos(&wndTop,rect.left,rect.top,image.GetWidth()+FrameWidth,image.GetHeight()+FrameHeight+mnuh+titleh,SWP_NOMOVE); pDC->BitBlt(0,0,image.GetWidth(),image.GetHeight(),imageDC,0,0,SRCCOPY); ReleaseDC(pDC); ReleaseDC(imageDC); CView::OnLButtonDown(nFlags, point); } /////////////////////////////////////////////