初心者です
どなたかお知恵をお借りしたくカキコいたします。
次のような関数を作成したいのですが、配列要素数をしる方法と
マネージコードのarrayに変換する方法をご教授をお願いいたします。
関数定義
void CTESTView::test( std::string a[]);
関数の呼び出し
std::string s[3]={a,b,c};
test( s )
関数の記述
void CTESTView::test( std::string a[])
{
要素数がわかっても、下の方法ですと大きなテーブルですと、メモリが枯渇
してしまってうまく行きませんでした。
なにかよい方法がありそうな・・
System::String^s[0] = gcnew System::String( a[0]_cstr);
}
以上ですよろしくお願いします。
#include <iostream>
#include <algorithm>
#include <string>
using namespace System;
using namespace std;
ref class CTESTView {
array<String^>^ strs;
public:
template<size_t N>
void test( const string (&a)[N]) {
strs = gcnew array<String^>(N);
for ( int i = 0; i < N; ++i ) {
strs[i] = gcnew String(a[i].c_str());
Console::Write(L{0} , strs[i]);
}
}
};
int main() {
CTESTView t;
std::string s[3]={a,b,c};
t.test( s );
}
> 要素数がわかっても、下の方法ですと大きなテーブルですと、
> メモリが枯渇してしまってうまく行きませんでした。
大きなテーブルて...総文字数どのくらいです?
επιστημηさんありがとうございます。
テーブルの文字数ですが、1要素あたり256文字位で、要素数が
1000以下のテーブルを想定しています。
お手数ですが、よろしくお願いします
メモリ枯渇しませんよー
たった256KBだもん。
「此処だけ」見れば、枯渇はしないでしょうね。
επιστημηさん
ありがとうございます。
要素数が不定の引数は、επιστημηさんが書かれたコードを
参考にさせていただいた結果問題が解決しました。
メモリの枯渇の件は、
おっしゃられたとおり、確かに256KBでメッセージが上がるのは
おかしいので、もとのソースを再確認してみたいと思います。
申し訳ありません、もう一点教えていただきたいのですが
実はその関数を、DLL化して呼び出そうとしてるのですが
どうしても、MAPファイルにエントリ名がでてこず
呼び出し元も外部参照エラーになってしましいます。
関数の宣言には、__declspec(dllexport)を付加しているので
すがうまくいっていないようです。
まだ調べている段階ですが、templateをはずすとMAPのエントリ
が出来ますが、配列要素がみえません。
要領を得ない書き込みで申し訳ありませんがよろしくお願いいたします。
> 実はその関数を、DLL化して呼び出そうとしてるのですが
> どうしても、MAPファイルにエントリ名がでてこず
> 呼び出し元も外部参照エラーになってしましいます。
アタリマエです。templateなんだから。
επιστημηさん
ありがとうございます。
可変数の要素を持つ引数は、あきらめて上限値を決めて
関数を作成する事にします。
初心者の要領を得ない質問に付き合って下さり、ありがとう御座いました。
いや、ふつー要素数を共に渡すんじゃないですか?
というか、テンプレートならヘッダに記述して
コンパイル時に取り込んで実体化しないと無理なんじゃ?
επιστημηさんの「アタリマエです。templateなんだから」は
そういう意味だと思いますけれど。
> コンパイル時に取り込んで実体化しないと無理なんじゃ?
これをやっちまうと、その実装内にnewを含んでたとき
DLLの知らないexe側空間でnewしちゃいます。
それをDLL側でdeleteしたりすっと楽しい事態となりそうです。
DLL 化するってことは
・DLL/EXE でコンパイラが違う
・DLL/EXE でコンパイルオプションが違う
場合まで皆考慮しないとならないわけで。
std::string なんて高尚なものを渡すのは避けて plain char 配列を渡すほうが
問題が生じにくく適切であるかもしれない。
その辺は強引に割り切って vector<string>& としてしまう手もあるし。
そもそも System::String を使うなら UNICODE っつことで wstring/wchar_t を
使うほうが内部表現的にはより適切かもしれないよな。
まあ何をどこまで考慮すべきかは応用用途次第っつーことで。
επιστημηさん
PATIOさん
tetrapodさん
お返事ありがとうございます。
ただ今、帰宅いたしました。
Dllの呼び出し方法ですが、皆さんのアドバイスを踏まえ、
キャラクタ型のポインタと要素数を渡す様に設計者に掛け合って
見たいと思います。