引数のキャスト

[戻る]
泰三 2003/02/15(土) 11:42:39
a_method(const string &, int)

上記のような関数を呼び出すとき第一引数に下記「a」を入れると
外部参照エラーになってしまいます。

char[256] a ;
a = 'abc';

何かにキャストするすると思うのですが、
何にキャストすればよいのかわりません。

どうぞよろしくお願いします。

PS:
Cラウンジにも書きましたがこちらの方がRessが多そうなので
こちらにも書きました。

小悪魔恭子 2003/02/15(土) 11:53:08
stringへのキャストです。
ただし、stringへキャストしても
あなたが期待する動作をするとは思えません。

2003/02/15(土) 12:00:37
−char[256] a; は意味が良く判りませんので−
char a[256];
a ='abs';

ではなく、(string が std::string の事を指しているものとしてお返事します)

(1)
  string a("abc");
(2)
  string a ="abc";

等と宣言、定義なさるのがよろしいと思いますよ。どうしても char a[256]; が
使いたいのでしたら

(3)
  int i=0;
  char a[256];
  a ="abc";

  a_method(std::string(a), i);
でしょうか((1) 〜 (3) のどれも試していないので間違っていたらごめんなさい)

ところで、Ress ってなんですか?

2003/02/15(土) 12:02:15
間違えました
(3)
  int i =0;
  char a[256];

  strcpy(a, "abc");
ですね

泰三 2003/02/15(土) 12:24:58
Ressありがとうございます。

おっしゃる通りsringにキャストしましたが
同様のエラーでした。

そこで
const string str(a)
をかましましたが

駄目でした。

お手数ですが、理由も教えていただけますか?

泰三 2003/02/15(土) 12:38:13
島さんご指摘有難うございます。
そして書き込みのタイミングがずれてしまったようです。
ごめんなさい。

strcpy()
をする理由ですが、最後に「\0」をつけるからですよね?

実はa[256]は構造体のメンバーなのですが、その場合も
strcpy()をする必要ってありますか?



*ちなみにRessは「返事」という意味で使いました。

2003/02/15(土) 13:05:13
>そして書き込みのタイミングがずれてしまったようです。
>ごめんなさい。

そんなことは何も気にしていません

>strcpy()
>をする理由ですが、最後に「\0」をつけるからですよね?

C の文字列だからです

>実はa[256]は構造体のメンバーなのですが、その場合も
>strcpy()をする必要ってありますか?

それだけでは私には分りません(状況や条件が不明だからです)
単に、何かの構造体の要素 a に文字列を渡したいだけでしたら、私は strcpy() を使う
でしょうとしか言えません 

C++ でしたら、構造体と言えどもクラスですから operator =() が定義できるので
C の文字列を含む適切な処理が構造体の代入についても書く事が出来ますから又、事情が
変ってくるかもしれません

トスポ 2003/02/15(土) 13:05:51
>strcpy()
>をする理由ですが、最後に「\0」をつけるからですよね?

文字列の最後に\0を付けるのは’決まり’なので、a="abc"でもaの4バイト目には\0が入る。
文字列として扱わないのであれば(\0を含めたくないならば)、memcpy等を使う。
なお、普通は文字列のコピーにはstrcpyを使い、a="abc"はポインタアドレスの代入となる。

YuO [E-Mail] 2003/02/15(土) 13:27:00
> 上記のような関数を呼び出すとき第一引数に下記「a」を入れると
> 外部参照エラーになってしまいます。

エラー内容から考えると,キャストとは関係ないのでは?
#というか,コンパイルが通った方が不思議……。

ちなみに,std::stringであればナル文字で終端していなくてもなんとかなります。
char str[256];
std::string(str, str + 16);
とやれば,strの先頭16文字をからなるstd::stringのテンポラリを生成します。
#assign, insert等も参照。

2003/02/15(土) 17:38:54
たんに構造体の渡し方がまずいのでは

struct st{
    st(const char* str){strcpy(buf,str);}
    char buf[16];
};
void foo(const std::string& str){
    
    printf("%s\n",str.c_str());
}
int main(){
    foo(st("xyz").buf);
    st *pst=new st("xyz");
    foo(pst->buf);
    delete pst;
    return 0;
}

hu 2003/02/15(土) 21:19:13
×Ress
○Res(=Response)

七つ夜 [E-Mail] 2003/02/17(月) 11:33:09
char a[256] に対して文字列を代入するのにstrcpy()を使う理由は?って、
そもそも宣言時に初期化しないかぎりはそれ以外に方法がないからだと
思うんですが?memcoy()でも可ですけど(末尾の\0はつきませんが)

 char a[256] ;
 a="abc" ;

はそもそもコンパイル通りません。やるなら、

 char a[256]="abc" ;

です。で、おそらく

 char[256] a ;
 a='abc' ;

なんてへんてこなソースを書いてるんで、aがただのchar型として認識されて、それをstd::string型
へ渡そうとしてるんでエラーが出てるんだと思うんですが?まずは宣言と値の代入をちゃんとする
べきかと。

古いスレッドには追加発言できません。