• ベストアンサー

C++BuilderでVector

普段、vectorコンテナの可変長サイズ指定の特徴を利用していますが、一塊のコンテナの関数間でのやり取りについて、アドバイスを御願いいたします。 1)関数の引数としては、ポインタ渡しになるのですか?どんな記述になるのでしょう? 2)アクセス制限のpublic:欄に追加することで、他のクラスから参照することは可能になりますか?どんな記述になるのでしょう? 3)他の方法はありますか? よろしく御願いいたします。

  • teo98
  • お礼率27% (68/244)

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.1

> 1)関数の引数としては、ポインタ渡しになるのですか?どんな記述になるのでしょう? ポインタか参照渡しでしょう。 関数宣言はこんな感じです。 (例1) ポインタ渡し void Func1(vector<int>* Data); (例2) 参照渡し void Func2(vector<int>& Data); (例3) const参照渡し(Func内でDataを変更しないことを明示したい場合) void Func3(const vector<int>& Data); 呼び出し側はこんな感じです。 vector<int> Data; Func1(&Data); Func2(Data); Func3(Data); 2)アクセス制限のpublic:欄に追加することで、他のクラスから参照することは可能になりますか?どんな記述になるのでしょう? 可能になります。 普通のメンバ変数と同じ扱いです。 クラス定義はこんな感じでしょう。 class Hoge { public:  // その他色々関数  vector<int> Data; }; 操作するときはこのような感じになります。 Hoge hoge; // ここでhogeに対して色々操作 for (int i = 0; i < hoge.Data.size(); ++i) {  printf("%d\n", hoge.Data[i]); } 3)他の方法はありますか? 恐らく様々な方法があるでしょう。 「一塊のコンテナの関数間でのやり取り」というのをもうちょっと具体的に書いて頂ければ例も書けます。 例えば、コンテナを受け取り、コンテナの各要素に対してなんらかの処理を行う関数の例 template <class ITER> void Func(ITER Begin, ITER End) {  for (ITER i = Begin; i != End; ++i) {   // *iを処理する  } } 呼び出し側 vector<int> Data; Func(Data.begin(), Data.end()); 普通の配列も処理できます。 int Array[10]; Func(&Array[0], &Array[10]);

teo98
質問者

お礼

お加減様でプログラムが完成しました。

その他の回答 (1)

回答No.2

表題のC++ Builderにはなにか意味があるのでしょうか? 1,2) 訊くまでもない。やってみればいい。

関連するQ&A

  • C++ Builderでのpublic変数の扱いについて

    class TForm1 { ・・・ public: int i;   ・・・ } のように宣言した変数iは他の関数から どのように参照したらいいのでしょうか?

  • DLLの作り方

    DLLでは、ポインタのアドレス渡しのように、可変長サイズのVectorコンテナを引数にすることは可能ですか? DLLのソースコ-ド extern "C" __declspec(dllexport) void __stdcall matinv(vector<vector<complex<double> > >,vector<vector<complex<double> > >&); void __stdcall matinv(vector<vector<complex<double> > > a,vector<vector<complex<double> > > &a_inv) {   コード  } 呼び出し側の関数宣言 #include <vector> #include <math.h> #pragma hdrstop #include <complex.h> using namespace std; extern "C" __declspec(dllimport) void __stdcall matinv(vector<vector<complex<double> > > a,vector<vector<complex<double> > > &a_inv); よろしく御願いいたします。

  • 参照型を格納できるコンテナについてなど

    ちょっと長文です。下のほうに質問があります。 STLのvectorコンテナを使用しているのですが、 困った事態が発生しています。 自分は、参照型を要素として、持たしたいのですが、 持たすことができません。 なにやら調べてみたところ、STLのコンテナクラスというのは 基本的に「値ベースのコンテナ」らしく、「参照ベースのコンテナ?」 としてコンテナを使うには、ポインタ型を格納して下さい。との ことでした。 ただし、この方法は2重deleteが発生する危険性を孕んでいるので、 Boostのなんかのポインタークラス?のようなものを使えば、 そのような問題に悩まされることないですよー。とありました。 ここで問題なのは、 ・Boostを扱えるだけの知識がない。 ・そもそもBoostを使えるまで環境設定できる自信がない。 ということです。 そのため、普通のポインタを使って実装しようと思うのですが、 そして上記のような問題が出てくるにつれ自分の中では 次のような疑問点が出てきました。 ●質問(1) ・なんで参照型を格納できるコンテナがないのよ!  本当はあったりするんだけども、自分が知らないだけ? ●質問(2) ・関数間でオブジェクトを渡すときには、パフォーマンスとかも  考慮してもconstキーワードを使いつつの参照渡しがよい。と  Effective C++か何かで読んだのですが、コンテナに格納する  場合にはこれは有効ではないのか?  また、オブジェクトは、基本的には、やたらめったら  コピーするものではなく、一つオブジェクト用のメモリ領域を  作ったらそれを流用(ポインタ・参照を使って参照する)した方が、  作り的にきれいな気がするのですが、なにか方針とかあったりする  のでしょうか? 以上長くなってしまいましたが、よろしくお願いいたします。

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • ポインタ変数への参照について

    現在とあるDLLを作成中なのですが、メソッドの仕様で悩んでいます。 DLL内部で不正アクセス等を極力発生させないことを考えているのですが、ポインタを引数にとるメソッドの場合、引数に不正なアドレスを渡されるとメソッド内部で引数を参照した段階で不正アクセスで落ちてしまいます。この対応は、引数を参照とすることで解決しようと思っているのですが、ダブルポインタを引数にとるメソッドで同じ考え方をすると、メソッドの仕様が理解しづらいものになってしまいます。 下記がサンプルコードです。 class Test { public: Test() { m_test = 1; } int m_test; }; void GetTest1(Test** test) //もともとの仕様はこんな形 { *test = new Test(); } void GetTest2(Test*& test) //参照渡しにすると「*&」と書かなくてはならない { test = new Test(); } int main() { Test* get1; Test* get2; GetTest1(&get1); GetTest2(get2); delete get1; delete get2; return 0; } このように、「ポインタの参照」にすれば不正なポインタを渡される心配はなくなりますが。 「*&」など(私は)見たことも無いような記述になってしまいます。 このような書き方は一般的に考えて正しいのでしょうか? (特にDLLが提供するメソッドとして)

  • Vector定義の配列の共有メモリ化

    Vectorの1次元配列(以下配列Vとします)を共有メモリとして、複数のアプリケーションで利用する方法がわかりません。開発ツールはVC++6.0 SP6です。 配列Vの値を参照時、書込時にはポインタ渡し(memcpy)をしたいです。コンパイルは通るのですが、アプリケーションを実行時にmemcpyを実行時に落ちます。 以下のことを確認しています。 (1)resizeでサイズは同じにしています。 (2)変数自体はNULLではありませんでした(デバッカで確認すると、アドレスがありました。) (3)変数の定義時にVectorにせず、サイズ決めた配列にするとポインタ渡しはできています。パラメータファイルを参照し、配列のサイズを決めたいので、ソース上に記入するのはできません。 よろしくお願いします。

  • クラスのアドレスを引数として渡したい

    関数の引数として,クラスのアドレスを渡すにはどうしたら良いですか. void func(MyClass mc) { mc = ~ } としたとき,これは参照渡しとなっているのですか? それとも値渡しとなっているのですか? もし値渡しとなっているのでしたら,クラスの場合 どのようにすれば参照渡しにできるのでしょうか. よろしくお願いします.

  • vectorをpublicで扱いたい

    Visual C++2013を使用しています。 現在、vectorを下記の位置に定義しています。 public ref class MainForm : public System::Windows::Forms::Form { MainForm(void) { 略1 } 略2 private: void 関数1(引数1) { vector<vector<double>> array_csv(要素数1, vector<double>(要素数2)); } } このvectorを他のクラスと共用して扱いたいのですが、 どう定義したらいいか分かりません。 やってみたこと 略1や略2のところへ以下のように定義してみましたが、関数1内からvectorへアクセスすると、 型が違うため、アクセスできません。 vector<vector<double>> array_csv(int, vector<double>()); 定義する場所か定義の方法がおかしいのでしょうか? ご教授願います。

  • vectorを引数として使いたいのですがエラーが出てしまいます

    vectorを引数として使いたいのですがエラーが出てしまいます 以下のようなコードでコンパイルでエラーが出てしまうのですがどうしたら良いでしょうか。 class car{ public: int tire; int engine; } というクラスを作ります。 main関数内で function(car a[]);//関数の宣言 int main(){ std::vector<car> car1(0);//car型のcar1を作成 std::vector<car>::reference car1rf=car1.front(); function(car1rf);//関数に代入 } function(car a[]){ car test; test.tire=1; a.push_back(test); } としてpush_backを外部関数で行いたいのですが、エラーが出てしまいます。 どうしたら良いでしょうか。

  • VBからCで作成されたDLLへの引数の渡し方

    VBからCで作成されたAPI関数への引数の渡し方がわかりません。 C側の引数のデータ型はchar型でポインタ渡しではありません。 ------------------------------------------------ C側 int KANSU(char Mode) VB側 Public Declare Function KANSU Lib "USERAPI.dll" ( ByVal CHAR As Byte) As Long ------------------------------------------------ C側がポインタ渡しの場合は、VB側はSTRING型で別に悩むことはなかったのですが、文字列渡しの場合は、VB側はBYTE型で渡す必要があり、その方法がわかりません。 どなたか、分かる方よろしくお願いします。 ちなみに、VB6.0です。

専門家に質問してみよう