スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C++][JSON] picojson

今更感もあるけど、最近になり個人的にハマっているもの。

JSONフォーマル結構使いやすいと思います。
で、本日「SystemC Japan2015」なのでC++ でしょ。

その時に includeだけでいい簡単な picojson を使ってます。

  • test.json
{
  "TEST" : {
  ¦ "Value" : 10,
  ¦ "Array" : [20,30,40],
  ¦ "String":"Example Test"
  }
}
  • main.cpp

#include <iostream>
#include <fstream>
#include "picojson.h"

int main(int argc, char const* argv[])
{
  std::ifstream ifs(argv[1]);
  picojson::value v;

  ifs >> v;
  
  std::string err = picojson::get_last_error();
  if (! err.empty()) {
  ¦ std::cerr << err << std::endl;
  ¦ exit(1);
  }
  
  // check if the type of the value is "object"
  if (! v.is<picojson::object>()) {
  ¦ std::cerr << "JSON is not an object" << std::endl;
  ¦ exit(2);
  }

  picojson::object& o = v.get<picojson::object>()["TEST"].get<picojson::object>();

  std::cout << "Value  = " << o["Value"].get<double>() << std::endl;

  picojson::array& a = o["Array"].get<picojson::array>();
  for(picojson::array::iterator it = a.begin(); it != a.end(); it++) {
  ¦ std::cout << "Array = " << it->get<double>() << std::endl;
  }

  std::cout << "String = " << o["String"].get<std::string>() << std::endl;
 
  return 0;
}

実行結果

こんな感じで取得することが出来ます。 数値は数値で取得出来るところがいいなと。


$> ./a.out test.json 
Value  = 10
Array = 20
Array = 30
Array = 40
String = Example Test

スポンサーサイト

[C++]メモ: C++11参考書の公開:C++11の文法と機能

C++11参考書の公開:C++11の文法と機能 - 本の虫


おぉ!素晴らしい。
じっくり読みたいと思います。


ぱっと見たい時にはこちら。


*C++11の文法と機能(C++11: Syntax and Feature)

[C++][SystemC] 区切り文字の話

C++14では、このような話が出ているみたいです。

ちょっと、Verilog HDLとかVHDLとかがメインな私にとっては「_」が使えないのはショックですが、難しそうな問題ですね。


ところで、SystemCはどうなのか気になったんで書いて試してみました。
っというのも SystemC(SystemCのデータ型)の場合、文字列で記述するからです。

 1|#include <systemc.h>
 2|
 3|int sc_main (int argc, char* argv[]) {
 4|  sc_int<8>  sig_int8;
 5|  sc_uint<8> sig_uint8;
 6|  sc_bv<8>   sig_bv8;
 7|  sc_lv<8>   sig_lv8;
 8|
 9|  sig_int8  = "0b10000000";
10|  sig_uint8 = "0b10000000";
11|  sig_bv8   = "0b10000000";
12|  sig_lv8   = "0b10000000";
13|
14|  cout << "sv_int8   = " << sig_int8.to_string(SC_DEC)  << endl;
15|  cout << "sig_uint8 = " << sig_uint8.to_string(SC_DEC) << endl;
16|  cout << "sig_bv8   = " << sig_bv8.to_string(SC_DEC)   << endl;
17|  cout << "sig_lv8   = " << sig_lv8.to_string(SC_DEC)   << endl;
18|
19|  sc_start(10,SC_NS);
20|
21|  return 0;
22|}

実行結果はこちらです。

sv_int8   = -128
sig_uint8 = 128
sig_bv8   = 0d128
sig_lv8   = 0d128

次に、「_」で区切ってみました。

 1|#include <systemc.h>
 2|
 3|int sc_main (int argc, char* argv[]) {
 4|  sc_int<8>  sig_int8;
 5|  sc_uint<8> sig_uint8;
 6|  sc_bv<8>   sig_bv8;
 7|  sc_lv<8>   sig_lv8;
 8|
 9|  sig_int8  = "0b1000_0000";
10|  sig_uint8 = "0b1000_0000";
11|  sig_bv8   = "0b1000_0000";
12|  sig_lv8   = "0b1000_0000";
13|
14|  cout << "sv_int8   = " << sig_int8.to_string(SC_DEC)  << endl;
15|  cout << "sig_uint8 = " << sig_uint8.to_string(SC_DEC) << endl;
16|  cout << "sig_bv8   = " << sig_bv8.to_string(SC_DEC)   << endl;
17|  cout << "sig_lv8   = " << sig_lv8.to_string(SC_DEC)   << endl;
18|
19|  sc_start(10,SC_NS);
20|
21|  return 0;
22|}

で、結果はどうなるかというと。

Error: (E403) conversion failed: character string '0b1000_0000' is not valid

となりました。やっぱりダメか・・・。
でも、データ型に対しての代入時の関数でなんとかならないかな・・・

[C++] 一様乱数生成を試す

上記のブログ見てこんなのあるんだなーって思って書いてみた。
あとせっかくなので、clang 3.3で。

 1|#include <iostream>
 2|#include <random>
 3|
 4|int main()
 5|{
 6|  std::default_random_engine engine ;
 7|
 8|  std::uniform_int_distribution< int > dist( 16 ) ;
 9|
10|  for(int i=0; i< 10; i++)
11|  std::cout << dist(engine) << std::endl ;
12|
13|  return 0;
14|}
$> clang++ main.cpp -std=c++0x
$> ./a.out
1
1
5
3
4
2
1
5
5
6

おぉ!出来た。出来た。

[C++]mutableについて

前回「GCC4.6.1でSystemCをインストール(非推奨)」のやつで、エラーの「mutable」気になったので、調べてみました。

ググると出てくるので、C++編(言語解説) 第20章 constメンバ を参照して。

なるほど!
constメンバ関数内でも変数の値の変更を出来るように指定するのですね。

で、次はGCCを調べる。
GCC 4.6 Release Series Changes, New Features, and Fixes
引用:
G++ no longer accepts mutable on reference members (c++/33558). Use -fpermissive to allow the old, non-conforming behaviour.
とあったので、Bug 33558 へ。

えっと、
「参照型の変数はC++のClass Menbersではないので、エラーにするべき。」
ってことでしょうか。確かに、ソースも見てもその部分がエラーになってました。
試しているバージョンがGCC4.1.2でパッチも出ていますね。
対応版がGCC4.6.0からのようです。

Class Menbersに関してはこちらを見てみたのですが、ちょっと分かりませんでした。
ISO/IEC 14882:1998(E) -- C++ -- Classes

詳しい方教えてください。
プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。