可変引数とstd::string

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
chaemon
記事: 5
登録日時: 14年前
住所: 川崎

可変引数とstd::string

#1

投稿記事 by chaemon » 13年前

以下のコードがランタイムエラーとなる理由を教えていただけませんでしょうか。

fは各引数に順番に"0", "1", "2", ...と数値の文字列が代入されていくような関数にしたつもりですが、うまく動きません。よろしくお願いします。

コード:

#include<iostream>
#include<sstream>
#include<string>
#include<cstdarg>

using namespace std;

void f(int n,string *argc,...){
	va_list lst;
	va_start(lst,argc);
	for(int i=0;i<n;i++){
		cout<<i<<endl;
		stringstream ss;
		ss<<i;
		*((string*)va_arg(lst,string*))=ss.str();
	}
	va_end(lst);
}

int main(){
	string s0,s1,s2,s3;
	f(4,&s0,&s1,&s2,&s3);
	cout<<s0<<" "<<s1<<" "<<s2<<" "<<s3<<endl;
	return 0;
}


アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 可変引数とstd::string

#2

投稿記事 by h2so5 » 13年前

va_startの引数がおかしくないですか?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 可変引数とstd::string

#3

投稿記事 by ISLe » 13年前

f関数の宣言もおかしいですね。
f関数でi=0の一個だけ代入して、呼び出し元のs0~s3のどれに代入されているかを確認してみましょう。

chaemon
記事: 5
登録日時: 14年前
住所: 川崎

Re: 可変引数とstd::string

#4

投稿記事 by chaemon » 13年前

ありがとうございます。ご指摘を受けて以下のように直したところ
想定通りの動きをしました。

ところで、こちらのポインタの部分をリファレンスにすることはできないのでしょうか。
下のコードのコメントの部分の2箇所を置き換えればできるはず、、、と思ったのですが、
コンパイルすら通りません。

なぜなのでしょうか。

そもそも、stdarg自体がC言語のものですが、C++用の可変引数ライブラリは標準で
用意されているのでしょうか。

よろしくお願いします。

コード:


#include<iostream>
#include<sstream>
#include<string>
#include<cstdarg>

using namespace std;

void f(int argc,...){
	va_list lst;
	va_start(lst,argc);
	for(int i=0;i<argc;i++){
		stringstream ss;
		ss<<i;
		*((string*)va_arg(lst,string*))=ss.str();
//		((string&)va_arg(lst,string&))=ss.str();
	}
	va_end(lst);
}

int main(){
	string s0,s1,s2,s3;
	f(4,&s0,&s1,&s2,&s3);
//	f(4,s0,s1,s2,s3);
	cout<<s0<<" "<<s1<<" "<<s2<<" "<<s3<<endl;
	return 0;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 可変引数とstd::string

#5

投稿記事 by h2so5 » 13年前

chaemon さんが書きました: ところで、こちらのポインタの部分をリファレンスにすることはできないのでしょうか。
下のコードのコメントの部分の2箇所を置き換えればできるはず、、、と思ったのですが、
コンパイルすら通りません。

なぜなのでしょうか。
C++の機能である参照はその性質上コンパイル時に型が判明していないといけないわけですが、
stdargを使用した可変長引数はコンパイル時に型を決定することができません。
chaemon さんが書きました: そもそも、stdarg自体がC言語のものですが、C++用の可変引数ライブラリは標準で
用意されているのでしょうか。
C++11からは可変長テンプレート引数を使うことができますが、
それ以前のC++には可変引数の機能はありません。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 可変引数とstd::string

#6

投稿記事 by ISLe » 13年前

関数原型で可変長引数には型が無いので、値渡しになってしまいます。
文法的にもオブジェクトからアドレスを得ることはできますが参照を得ることはできないので無理ですね。

chaemon
記事: 5
登録日時: 14年前
住所: 川崎

Re: 可変引数とstd::string

#7

投稿記事 by chaemon » 13年前

なるほど。。。やはりC++11でないとないのですね。

ありがとうございました。解決といたします。

閉鎖

“C言語何でも質問掲示板” へ戻る