可変長のタイプの変数をポインタを引数とする関数に渡したい – プログラミング – Home

可変長のタイプの変数をポインタを引数と...
 
通知
すべてクリア

[解決済] 可変長のタイプの変数をポインタを引数とする関数に渡したい


熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

VC++ 6.0 OS XP

vectorでとった可変長の配列を、ポインタを引数とする関数に渡したいのですが、なに
か、いい手は、ないでしょうか?固定長の配列に置きなおすのは、無駄なような気がす
るのですが、どうでしょう?以下のソースは、コンパイルエラーがでますが、やりたい
ことのイメージは、こういうことです。(strcpyをほかに変えるのは、目的がちがって
きます)

#include stdafx.h
#include <iostream>
#include <vector>
#include <string.h>
using namespace std ;
int main(int argc, char* argv[])
{
vector <char> char_vector ;
char_vector.push_back('A') ;
char_vector.push_back('B') ;
char_vector.push_back('C') ;
char_vector.push_back('D') ;
char_vector.push_back(NULL) ;

char copy_buffer[100] ;

//コンパイルエラー、2番目の引数の形を変換できない
strcpy(copy_buffer,char_vector) ;

return 0;
}


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

&char_vector[0]

でどうでしょうか?


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

vector は、その内部でデータを連続アドレス上に保持することが保証されている。
strcpy(copy_buffer, &char_vector[0]); とすれば事足りるわけだ。

性能面を考えるなら strcpy で \0 文字を探させるのは無駄なので
提示例のごとく、必ず \0 文字が最後の要素に存在するのであれば
memcpy(copy_buffer, &char_vector[0], char_vector.size()); でよい
# size() が 100 より大きい場合の考慮が必要

vector の最割付けが起こりうる処理を行うたびに &v[0] を更新する必要があるわけで
その辺は要注意、っつことで。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

blueさん、レスありがとうございました。
コンパイルもとおり、イメージどおり動きました。
ありがとうございました。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

tetrapodさん、レスありがとうございます。
前回、コメを書いたときには、時間上の問題で、tetrapodさんのコメは、見えませんで
した。
なるほど、可変長は、割り当てメモリが少なくなった場合、動的にメモリ再割り当てを
おこなうわけですね。とても参考になりました。ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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