要素数不定のstd::string型の引数を持つ関数 – プログラミング – Home

要素数不定のstd::string型の...
 
通知
すべてクリア

要素数不定のstd::string型の引数を持つ関数


ね
 ね
(@ね)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

 初心者です

 どなたかお知恵をお借りしたくカキコいたします。

 次のような関数を作成したいのですが、配列要素数をしる方法と
 マネージコードの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);

  }

  以上ですよろしくお願いします。


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

#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 );
}

> 要素数がわかっても、下の方法ですと大きなテーブルですと、
> メモリが枯渇してしまってうまく行きませんでした。

大きなテーブルて...総文字数どのくらいです?


返信引用
ね
 ね
(@ね)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

επιστημηさんありがとうございます。

テーブルの文字数ですが、1要素あたり256文字位で、要素数が
1000以下のテーブルを想定しています。

お手数ですが、よろしくお願いします


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

メモリ枯渇しませんよー
たった256KBだもん。


返信引用
...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

「此処だけ」見れば、枯渇はしないでしょうね。


返信引用
ね
 ね
(@ね)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

επιστημηさん

 ありがとうございます。
 
 要素数が不定の引数は、επιστημηさんが書かれたコードを
 参考にさせていただいた結果問題が解決しました。

 メモリの枯渇の件は、
 
 おっしゃられたとおり、確かに256KBでメッセージが上がるのは
 おかしいので、もとのソースを再確認してみたいと思います。


返信引用
ね
 ね
(@ね)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

申し訳ありません、もう一点教えていただきたいのですが

 実はその関数を、DLL化して呼び出そうとしてるのですが
 どうしても、MAPファイルにエントリ名がでてこず
 呼び出し元も外部参照エラーになってしましいます。

関数の宣言には、__declspec(dllexport)を付加しているので
 すがうまくいっていないようです。

まだ調べている段階ですが、templateをはずすとMAPのエントリ
 が出来ますが、配列要素がみえません。

 要領を得ない書き込みで申し訳ありませんがよろしくお願いいたします。
  

  


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 実はその関数を、DLL化して呼び出そうとしてるのですが
> どうしても、MAPファイルにエントリ名がでてこず
> 呼び出し元も外部参照エラーになってしましいます。

アタリマエです。templateなんだから。


返信引用
ね
 ね
(@ね)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

επιστημηさん

 ありがとうございます。

 可変数の要素を持つ引数は、あきらめて上限値を決めて
 関数を作成する事にします。

 初心者の要領を得ない質問に付き合って下さり、ありがとう御座いました。
  


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

いや、ふつー要素数を共に渡すんじゃないですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

というか、テンプレートならヘッダに記述して
コンパイル時に取り込んで実体化しないと無理なんじゃ?

επιστημηさんの「アタリマエです。templateなんだから」は
そういう意味だと思いますけれど。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> コンパイル時に取り込んで実体化しないと無理なんじゃ?

これをやっちまうと、その実装内にnewを含んでたとき
DLLの知らないexe側空間でnewしちゃいます。
それをDLL側でdeleteしたりすっと楽しい事態となりそうです。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

DLL 化するってことは
・DLL/EXE でコンパイラが違う
・DLL/EXE でコンパイルオプションが違う
場合まで皆考慮しないとならないわけで。

std::string なんて高尚なものを渡すのは避けて plain char 配列を渡すほうが
問題が生じにくく適切であるかもしれない。
その辺は強引に割り切って vector<string>& としてしまう手もあるし。
そもそも System::String を使うなら UNICODE っつことで wstring/wchar_t を
使うほうが内部表現的にはより適切かもしれないよな。

まあ何をどこまで考慮すべきかは応用用途次第っつーことで。


返信引用
ね
 ね
(@ね)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

επιστημηさん
PATIOさん
tetrapodさん
  
 お返事ありがとうございます。

 ただ今、帰宅いたしました。

 Dllの呼び出し方法ですが、皆さんのアドバイスを踏まえ、
 キャラクタ型のポインタと要素数を渡す様に設計者に掛け合って
 見たいと思います。
  
 

 

 


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました