引数のキャスト – プログラミング – Home

通知
すべてクリア

引数のキャスト


泰三
 泰三
(@泰三)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

a_method(const string &, int)

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

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

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

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

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


引用解決済
トピックタグ
小悪魔恭子
 小悪魔恭子
(@小悪魔恭子)
ゲスト
結合: 22年前
投稿: 25
 

stringへのキャストです。
ただし、stringへキャストしても
あなたが期待する動作をするとは思えません。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

-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 ってなんですか?


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

間違えました
(3)
int i =0;
char a[256];

strcpy(a, abc);
ですね


返信引用
泰三
 泰三
(@泰三)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

Ressありがとうございます。

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

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

駄目でした。

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


返信引用
泰三
 泰三
(@泰三)
ゲスト
結合: 22年前
投稿: 14
Topic starter  

島さんご指摘有難うございます。
そして書き込みのタイミングがずれてしまったようです。
ごめんなさい。

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

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

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


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>そして書き込みのタイミングがずれてしまったようです。
>ごめんなさい。

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

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

C の文字列だからです

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

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

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


返信引用
トスポ
 トスポ
(@トスポ)
ゲスト
結合: 23年前
投稿: 36
 

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

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

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

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


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

たんに構造体の渡し方がまずいのでは

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
 hu
(@hu)
ゲスト
結合: 22年前
投稿: 4
 

×Ress
○Res(=Response)


返信引用
七つ夜
 七つ夜
(@七つ夜)
ゲスト
結合: 22年前
投稿: 8
 

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

 char a[256] ;
 a=abc ;

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

 char a[256]=abc ;

です。で、おそらく

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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