• ベストアンサー

returnの使い方に関して

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ virtual void put(key_type key, value_type val) { // B地点 ・ ・ } virtual cp::ft<value_type> get(key_type key) {  // A地点 ・ ・  /*keyに対応するvalが取得される*/   return 0; //取得したkeyとvalをputの引数として代入するためputへ移動したい。 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 基本的な事かもしれませんが教えてください。 C++で上記内容のソースを作っています。 A地点でgetを行う際、 上記内容ですと、 returnの部分に差し掛かると、 再度、getの先頭に戻りますが、 「get」の一番最後でreturnまできたとき、 「get」の先頭(A地点)ではなく、 その更に1つ上の「put(B地点)」に戻って、 移動したその際に、 getオブジェクトで取得済みのkeyとvalをputで挿入するには、 どうreturnを記述すればいいでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まず、get() が、その値として、value を 返すのであれば、 virtual cp::ft<value_type> get(key_type key) { ・ ・  /*keyに対応するvalが取得される*/   return value; // value を関数の値として返す } になりまね。 この結果を put() するのであれば、put() を 呼び出すべきところで、 put(key, get(key)); と記述することになります。 return は、関数の値を返す(or 値がない場合 は、単に、関数の処理を終了する)もので、関 数の先頭に帰ることはありません。 呼び出し側で繰り返し呼び出しているのでない 限りは。

mami_try
質問者

お礼

ポイント付与が遅れてしまいましたが、 ありがとうございました! いただいたアドバイスをもとに、 理解し、問題の解決をすることができました。 ありがとうございました!

その他の回答 (1)

回答No.1

こんにちは。こう言う事でしょうか? virtual cp::ft<value_type> get(key_type key) {  // A地点 ・ ・  /*keyに対応するvalが取得される*/  this->put(key, value);//取得したkeyとvalをputの引数として代入するためputへ移動したい。  return cp::ft<value_type>(value_type(key, value)); }

mami_try
質問者

お礼

別の角度から、問題を解決しましたが、 とても参考になりましたです。 ありがとうございました!

関連するQ&A

  • map(STL)でinsertを行いたいですが、成功できないでいます。

    皆さん、こんにちは。 このほど、STLのMAPを勉強しだしたものですが、 もっと基本的な、 C++の事でつまずいてしまいました。 keyとvalueのセットを 登録したり、 取得したりするソースを書いています。 下記ソースにありますとおり、 getの指示を出した際は、 通常、find(key)を行い、 valueを得るのですが、 仮にfindにて意図するvalueが見つからなかった場合には、 MySQLから意図するkeyに対応するvalueを 取ってこようと思っています。 そして、MySQLからvalueを取得した後は、 「m1.insert」にて 取得したその「value」と「key」のセットを insertを行う事で、 コンテナに登録作業をしたいつもりなのです。 どんな1行を足せばいいでしょうか? ずばりの答えでなく、 ユルメな方針のアドバイスでも いただけるとありがたいです。 ================================================================= virtual void put(key_type key, value_type val) { m1.insert(std::make_pair(key, val)); } virtual void get(key_type key) { typename container_type::iterator iterator = m1.find(key); if (iterator != m1.end()) { CTL_INFO("", "[info] Got the value ."); } else { /* ここでMySQLへ接続を行う*/ char query[256]; std::stringstream keystream ; keystream << key; std::string key1 = keystream.str().c_str(); if(sprintf(query, "select value_dht from table_name where key = ('%s')",keystream.str().c_str())); mysql_query(conn, query); res = mysql_use_result(conn); //get the results while ((row = mysql_fetch_row(res)) != NULL){ std::stringstream keydb2stream ; key2stream << row[0] ; std::string val1 = key2stream.str().c_str(); } /* ここで、MySQLから得たvalについて、      上記「virtual void put」のように「m1.insert」を行いたい。 それにより、returnで再度virtual void getへ移動した際には、     「m1.find(key)」を成功させたいです。*/ } return 0; }; ================================================================= また、間違っているかもしれませんが、 試しに、 「return 0」の2行上で、 次の1行を入れてみたのですが、 コンパイル時にエラーが出て怒られて失敗をしてしまいました。 「virtual void put」の部分で行っているinsertと、 同じ内容の文字列を同じようにinsertしているのに、 今回は怒られてしまうのかも、 よく分かりませんでした。 的外れな対応でしたらすいません。 ======================================================== m1.insert(std::make_pair(keystream.str().c_str(), key2stream.str().c_str())) ======================================================== error: cannot convert ‘const char*’ to ‘sc::basic_message_cons<sc::basic_message<void, char> >*’ in initialization

  • mapによるkeyとvalueのinsertに失敗しております。

    STLのmapコンテナにて、 valueを取得したり、 keyとvalueを登録するソースを書いていました。 get(key)にあたって、 valの取得に失敗した際には、 mapコンテナ上のkey-valueデータと 同期されているMySQLより、 データを取得してきます。 MySQLよりkeyに対応するvalの取得が 完了したら、 そのkeyとvalをmapコンテナに insertしたいと思っています。 つきまして、 insertを行おうと、 「_container.insert(std::make_pair(key, val));」の一文を ソースに挿入したところ、 「型が違う!」という内容(?)のエラー文で コンパイル時に怒られてしまいました。 ただ、「どの様に直してごらん!」と エラー文が言っているのか、 今いち、意味を理解できないでいます。 このエラー情報的には、 どんな風の型の改善を求められているのでしょうか? 教えていただけるとありがたいです。 もし可能でしたら、pointBの 「_container.insert(std::make_pair(key, val));」の部分で、 MySQLから取得済みkeyとvalを、 pointAのkeyとvalに代入する方法も 教えていただけるとありがたいです。 どちらかでも、 アドバイスをいただけますとありがたいです。 どうぞ宜しくお願い致します。 -------------------------------------------------- template<typename KEY, typename VALUE> class hoge : public service_object<ipl<KEY, VALUE>> { virtual void put(key_type key, value_type val) { _container.insert(std::make_pair(key, val)); // pointA } virtual cc::fu<value_type> get(key_type key) { typename container_type::iterator iterator = _container.find(key); if (iterator != _container.end()) { return cc::fu<value_type>((*iterator).second); }else { //getにした場合MySQLよりkeyとvalueを取得完了できるので取得した。 /* MySQLより取得したkeyとvalをpointAのようにmapコンテナにinsertしたい。*/ _container.insert(std::make_pair(key, val)); //pointB  } } }; -------------------------------------------------- ■エラー文 error: conversion from std::pair<std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_ptr<csx::basic_message_cons<csx::basic_message<void, char> > > > >, bool>’ to non-scalar type ‘csrpc::future<boost::shared_ptr<csx::basic_message_cons<csx::basic_message<void, char> > > >’ requested

  • 2つのリストのマージ方法について

    2つのリストのマージ方法について 下記の要件を満たしたいと考えています。 ・リスト1・2をkeyをキーにマージしたい。  リスト1[0]:key=2, value1=b  リスト1[1]:key=3, value1=d  リスト1[2]:key=4, value1=e  ・  ・  ・  リスト2[0]:key=1, value2=A  リスト2[1]:key=2, value2=B  リスト2[2]:key=5, value2=F  リスト2[3]:key=6, value2=G  ・  ・  ・  ↓  リスト3[0]:key=1, value1=A, value=""  リスト3[1]:key=2, value1=b, value=B  リスト3[2]:key=3, value1=d, value=""  リスト3[3]:key=4, value1=e, value=""  リスト3[4]:key=5, value1="", value=F  リスト3[5]:key=6, value1="", value=G  ・  ・  ・ ・リスト1・2はkeyの昇順でソート済。各リスト内では重複しているkeyはない。 ・マージ後もkeyの昇順にしたい。 ・実際のリストはそれぞれ数万件~数十万件なので、パフォーマンスを考慮したい。 下記のように作成してみたのですが、無理やりやりました感があり、分かりづらくバグがありそうです。またループでnewもしてたりしてパフォーマンスも悪そうです。もっとスマートにパフォーマンスもよい方法がないでしょうか? int checkedCount = 0; for (int i = 0; i < list1.size(); i++) { String str1 = list1.get(i).get("key"); for (int j = checkedCount; j < list2.size(); j++) { Map<String, String> map3 = new HashMap<String, String>(); String str2 = list2.get(j).get("key"); if (str1.compareTo(str2) < 0) { if (i != list1.size() - 1) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", ""); list3.add(map3); break; } else { Map<String, String> map4 = new HashMap<String, String>(); map4.put("key", str2); map4.put("value1", ""); map4.put("value2", list2.get(j).get("value2")); list3.add(map4); } } else if (str1.compareTo(str2) == 0) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; break; } else { map3.put("key", str2); map3.put("value1", ""); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; } } }

    • ベストアンサー
    • Java
  • &ReadParseを用いての画面データの取得

    Perl初心者なので、わからないことばかりです。 前画面からの情報を&ReadParseを用いて取得し、 取得データの中からキーAのデータを抽出し、 その抽出結果をEUCで変換し、変換後のものを"|(パイプ)"で分割し、 できた7つのデータを、ハッシュでリターンするというサブルーチンを作っています。 このサブルーチンは不特定多数の画面から呼び出されるのですが、 &ReadParseを用いて取得するデータは同じです。 また、ハッシュでリターンする項目も固定です。 ↓こんな感じで書いてみましたが、&ReadParseをあまり理解していないので自信がありません。 どうしたらいいでしょうか? sub return_hash{ &ReadParse(*in); $param = %in{A}; #EUC変換する &jcode::convert(*param ,'euc'); #"|"(パイプ)で分割する @ResultDatas = split(/|/,$param); $val0 = @ResultDatas[0]; $val1 = @ResultDatas[1]; $val2 = @ResultDatas[2]; $val3 = @ResultDatas[3]; $val4 = @ResultDatas[4]; $val5 = @ResultDatas[5]; $val6 = @ResultDatas[6]; $val7 = @ResultDatas[7]; #ハッシュにし返す %in = ('KEY-A' => $val0, 'KEY-B' => $val1, 'KEY-C' => $val2, 'KEY-D' => $val3, 'KEY-E' => $val4, 'KEY-F' => $val5, 'KEY-G' => $val6, 'KEY-H' => $val7); return %in; }

    • ベストアンサー
    • Perl
  • 配列からプルダウン用のHTMLを生成

    配列からプルダウン用のHTMLを生成するプログラムを作成しています。 結果としては <option value="tomato">トマト</option> <option value="onion">たまねぎ</option> <option value="carrot">にんじん</option> のHTMLが生成されるようにしたいのです。 (実際の画面表示はプルダウンになっています) function createDropDownListByArray($key, $val ) {   $array_name = array(    $key => $val,   );   foreach( $array_name as $key => $val ){ $tag .= '<option value="' . $key . '">' . $val . '</option>' . "\n";   }   return $tag; } 上記のようにつくってみましたが、この場合ファンクションを呼び出すと 1つずつしかHTMLを生成できません。  再度ファンクションを呼び出すと、上書きされてしまいます。(当たり前ですが) 可変引数?(func_get_args())を使えないかとも思いましたが、できませんでした。 上記のように一度に全ての結果を表示したい場合、どのような記述に変えたらいいでしょうか? 詳しい方、どうか教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 双方向のHashtableクラス

    Hashtableクラスでは、getメソッドを用いて、keyからvalueの値を取得出来ますが、逆は出来ません(Iteratorすれば出来なくもないですが・・・)。 双方向に値をとれる、よいクラスがあれば、教えてください。 無ければ、keyとvalueを入れ替えて2回putしようと思っていますが、何かしら、よいクラスがありそうな気がしたので。

    • ベストアンサー
    • Java
  • returnがundefinedになってしまう。

    登録フォームhtml(php)からonclickで呼び出すvalidate functionから、ある値の有効性をチェックする別のcheck_data functionを呼び出しています。 check_data functionのソースは以下です。 function check_data(data) { var ajaxRequest; try{ //Opera 8.0+,Firefox,Safari ajaxRequest = new XMLHttpRequest(); }catch(e){ //Internet Explorer Browsers try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ //something went wrong alert("your browser broke!"); return false; } } } //Create a function that will receive date sent from the server ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState==4){ var ajaxDisplay = document.getElementById('data_msg'); ajaxDisplay.innerHTML = ajaxRequest.responseText; var val = ajaxRequest.responseText; return val; } } var date = new Date(); var timestamp=date.getTime(); //var data = document.getElementById('data').value; data = data; var queryString = "?tm=" + timestamp + "&data=" + data; ajaxRequest.open("GET","data_check.php" + queryString, true); ajaxRequest.send(null); } これを validate functionから var vdata = check_data(data); alert(vdata); みたいな感じで呼び出しています。 alertにしているのは単に値が正確に返っているかチェックするためです。 しかし、このvdataに入ってるはずの値がundefinedになってしまうのです。 check_data function内でvar val = ajaxRequest.responseText; をalert(val)する場合には正確な値がalertされるのですが、 validate functionから呼び出してvar vdata = check_data(data); する部分で何故かundefinedになってしまうのです。 responseTextでデータが取得される前にreturnされてしまいundefined になるのかとも思うのですが、たとえばreturn val;の代わりにreturn 10; などにしてもvalidate functionから呼び出すと、undefinedになってしまいます。 何が問題なんでしょうか? IE6とFireFox3.03で同様の結果になります。 因みに function test() { var test = 'ok'; return test; } をvalidate functionから呼び出した場合は キチンと'ok'がalertされます。

  • PHP returnについて

    いつもお世話になっております。 PHPのreturn についてお伺いさせてください。 以下のように外部ファンクションを設けておりまして、本体から渡される値を、ファンクション側で計算させて、値を返す方法なのですが、どうもうまくいきません。 どこら辺が間違っているのでしょう? test_1.php ------------------------------------ require_once('test_2.php'); $a=0; $b=5; $c=5; $a = get_data(b,c); test_2.php ------------------------------------ function get_data($data1,$data2){ $data = $data1+$data2; return $data; } ------------------------------------ こんな感じで、本来であればtest_1.phpの$aにtest_2.phpの$dataの結果を渡したいのですが、どうもうまくいかないのです。 申し訳ありませんが、教えて頂けませんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • テキストボックスに入力した文字がエンター(リターン)キーで全て削除されてしまいます。

    テキストボックスに文字を入力し、確定のためにエンター(リターン)キーを押すと、先に入力された文字が全て削除されてしまいます。 <form name="myform" method="post"> <input type='text' name='keyword' size='46' value=""> ・ ・ ・ </form> エンター(リターン)キーを押しても上記文字が削除されることがないようにするには、 どのようにしたらよいでしょうか。

    • ベストアンサー
    • HTML
  • Mapの要素の削除と挿入

    こんにちは。 Listに挿入されたMapでKeyがFLGのValueが1のものを List要素ごと削除しFlgが0のものに新しくmap.put("LBL","○");したいのですがどうもうまくいきません。 getListMap()はTestListクラスにあるMapの挿入されたリストを返すメソッドです。 よろしくお願いします。 Mapの中身はこのようになっています。 [key=TYPE:value=AAA0] [key=NO:value=000] [key=FLG:value=1] [key=TYPE:value=AAA1] [key=NO:value=001] [key=FLG:value=0] [key=TYPE:value=AAA2] [key=NO:value=002] [key=FLG:value=1] [key=TYPE:value=AAA3] [key=NO:value=003] [key=FLG:value=1] [key=TYPE:value=AAA4] [key=NO:value=004] [key=FLG:value=1] [key=TYPE:value=AAA5] [key=NO:value=005] [key=FLG:value=0] [key=TYPE:value=AAA6] [key=NO:value=006] [key=FLG:value=1] [key=TYPE:value=AAA7] [key=NO:value=007] [key=FLG:value=0] [key=TYPE:value=AAA8] [key=NO:value=008] [key=FLG:value=1] [key=TYPE:value=AAA9] [key=NO:value=009] [key=FLG:value=1] public class Test { public static void main(String[] args) { TestList tl = new TestList(); List list = tl.getListMap(); for (int i = 0; i < list.size() ; i++){ Map map = (Map)list.get(i); Set keyset = map.keySet(); Iterator it = keyset.iterator(); System.out.println("-------------------"); while(it.hasNext()){ Object key = it.next(); if(map.get(key)=="1"){ list.remove(i); }else{ map.put("LBL","○"); } System.out.print("[key=" + key); System.out.println(":value=" + map.get(key)+"]"); } } } }

    • ベストアンサー
    • Java

専門家に質問してみよう