質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

2304閲覧

エラー:ローカル変数のアドレスは仮引数' 'によって返されます。 の解決方法を教えてください。

sassassa9898

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2016/07/29 01:41

C#で実装したcppファイルで下記エラーが発生しましたので、エラーが発生した原因と対応方法をご存知でしたらご教示お願い致します。

*発生しているエラーメッセージ
ローカル変数のアドレスは、仮引数 'this->bbb' によって返されます。

*該当のソースコード
言語:C#

~省略~

if ( this -> a() == TRUE ) {
ABC* l_itsABC = ABC::def();
unsigned char z = 0;
z = l_ABC->co(xyz_o, yo_i, pp_lnm);
this->aaa(k_o, &l_k_i);
return FALSE; → エラー発生箇所

~省略~

void q::aaa(unsigned char o_k, unsigned char* i_k_l) {
ACE_BDF = o_k;
ZYX_WVU = i_k_l;

#if !NBOX if(ACE_BDF != 0){ ABC* l_itsABC = abc::def(); l_ABC->mo(xyz_o, yo_i, pp_lnm, ZYX_WVU); if ( ace_bdf == TRUE ) { DEF* l_itsDEF = DEF::def(); l_itsDEF->doCB(xyz_o, yo_i, pp_lnm, ZYX_WVU); return; } } #endif itsIf->doCC(this,HIJ_id,ACE_BDF,ZYX_WVU);

}

※関数名、変数名、引数等は社外秘のため全て簡易的なものに変更しました。ご了承願います。 上記処理で発生したエラー「ローカル変数のアドレスは、仮引数 'this->bbb' によって返されます。」の直接的原因と解決方法をご教授願いたく宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/07/29 01:46

コードが省略されすぎて、訳が判りません。
退会済みユーザー

退会済みユーザー

2016/07/29 01:59

C# ?
ozwk

2016/07/29 02:39

「C#で実装したcppファイル」←!?
guest

回答1

0

こんにちは。

まず、言語はC#ではないように見えます。C++の間違いではないでしょうか?(もしかして、C++/CLI?)

次に、推測ですが、何らかの仮引数を参照、もしくは、ポインタで受け取っていて、そこへこの関数の中で定義したローカル変数のアドレスを設定しているのだろうと思います。

エラーが発生している関数の宣言部分と、仮引数に値を返すために設定している部分、および、その設定した「値」(恐らく変数)を定義している部分を開示頂ければ、具体的な回答をできるかも知れません。

投稿2016/07/29 02:10

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sassassa9898

2016/08/01 02:48

回答ありがとうございます。C#ではなく、C++ですね。間違えておりました。 下記にコメント分を除いた実装部分を添付致します。具体的なご回答を頂きたく宜しくお願い致します。 bool SpReadCmd::actStart() { int l_table_num = ( (sizeof(sp_table)) / (sizeof(SSP_TABLE)) ); for ( int i = 0; i < l_table_num; i++ ) { if ( ( sp_table[i].sp_big_classify == big_classify ) && ( sp_table[i].sp_small_classify == small_classify ) && ( sp_table[i].sp_sub_classify == sub_classify ) ) { send_size = sp_table[i].data_length; //set Data Size. data_type = sp_table[i].data_type; if ( this -> isPscSp() == TRUE ) { SpParameter* l_itsSpParameter = SpParameter::getInstance(); unsigned char l_send_data = 0; l_send_data = l_itsSpParameter->getPscSpParam(big_classify, small_classify, sub_classify); this->receiveData(send_size, &l_send_data); return FALSE; } else { itsSpEngineIF->requestStatus(this,send_size, data_type); return TRUE; } } } PRINT(eDEBUG_TYPE_ENGINE,PSC_LOG_NOT_USE,0,"SpReadCmd:no much Sp number\n"); if ( upload_data == FALSE ) { this->receiveData(0,(UCHAR*)NULL); } return FALSE; } void SpReadCmd::receiveData(unsigned char rv_size, unsigned char* rv_data) { send_size = rv_size; send_data = rv_data; #if !DEV_ENV_PLUS if(send_size != 0){ SpParameter* l_itsSpParameter = SpParameter::getInstance(); l_itsSpParameter->updateExSpParam(big_classify,small_classify,sub_classify,send_data); if ( upload_data == TRUE ) { EngineRapiSender* l_itsEngineRapiSender = EngineRapiSender::getInstance(); l_itsEngineRapiSender->doSUD(big_classify,small_classify,sub_classify,send_size,send_data); return; } } #endif itsSpRapiIF->doSRR(this,req_id,send_size,send_data); }
Chironian

2016/08/01 03:16

確実なことは言えませんが、return FALSE;の直前でthis->receiveData(send_size, &l_send_data);を呼んでます。 実引数として&l_send_dataを与えてますが、l_send_dataはローカル変数に確保しているため、retufn FALSE;で失われてしまいます。 「ローカル変数のアドレスは、仮引数 'this->bbb' によって返されます。」は、行間を読むと下記を意味しているように思います。 ローカル変数l_send_dataのアドレスが、this->receiveData()の第2引数に与えられています。this->receiveData()がl_send_dataに値を設定していた場合、l_send_dataはローカル変数なのでreturn FALSE;で失われます。問題ないですか? 対策ですが、l_send_dataをthis->receiveData()へ渡したいだけなら、ポインタではなく値を渡すようにしましょう。 もし、receiveData()が他のケースでは第2バラメータで値を返却している場合は頭痛いてす。 しかし、このケースで警告ではなくエラーというのは少し不可解です。 単に値を設定して使わない場合と同じことですので、単なる警告でよいと思うのです。 わざわざエラーにしているということは、その対処方法がお使いのコンパイラのマニュアルに記載されていませんか? エラー番号等で検索したら出てくるかも知れません。 もしくは、プロジェクトを設定した人が警告をエラーとして扱うよう設定しているかも知れません。その場合はその人に対処方法を相談するしかないと思います。様々な事情を考慮してそのように設定していると思いますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問