Download
Magazine
Develop
Account
Download
Magazine
Develop
Login
Forgot Account/Password
Create Account
Language
Help
Language
Help
×
Login
Login Name
Password
×
Forgot Account/Password
Category:
Software
People
PersonalForge
Magazine
Wiki
Search
OSDN
>
Find Software
>
低電力無線通信用モジュールCC1101ドライバ作成
>
Forums
>
VC++公開討議
>
IntelHEXFile.cppのinitializeはどうのように呼び出されている?
低電力無線通信用モジュールCC1101ドライバ作成
Description
Project Summary
Developer Dashboard
Web Page
Developers
Image Gallery
List of RSS Feeds
Activity
Statistics
History
Downloads
List of Releases
Stats
Source Code
Code Repository list
Subversion
View Repository
Ticket
Ticket List
Milestone List
Type List
Component List
List of frequently used tickets/RSS
Submit New Ticket
Documents
FrontPage
Title index
Recent changes
Communication
Forums
List of Forums
C++ Builder関連 (1)
Developers (1)
Help (1)
VC++公開討議 (29)
公開討議 (10)
送信出力問題について (6)
Mailing Lists
list of ML
News
Forums:
VC++公開討議
(Thread #32274)
Return to Thread list
RSS
IntelHEXFile.cppのinitializeはどうのように呼び出されている? (2012-05-30 18:03 by
blackzoro
#64080)
Reply
Create ticket
皆様お世話になっております。
現在、intelhexutilのプログラムを見ていて思ったのですが、
{code}
int main(int argc, char** argv) {
//argc = 1;
//argv[0] = C:\mywork\new_wireless_module\open\cc1101driver\trunk\VC_test\intelhexutil\eeprom_data_sn11002.hex;
IntelHEXFilePtr file(get_file(argc, argv));
--------(中略)----------------------------------------------------------
{code}
ここで”IntelHEXFilePtr file(get_file(argc, argv));”
というのを呼び出していますが、デバッグでステップ実行でいろいろと追ってみたのですが、class IntelHEXFileImplクラスの
{code}
void initialize(istream& stream) {
string line;
while (getline(stream, line)) {
records.push_back(IntelHEXRecordPtr(new IntelHEXRecord(line)));
}
}
{code}
このinitializeというところでgetlineでファイルに存在するテキスト行を最後まで読み取っていくようなプログラムに行くまでの過程がものすごく複雑に感じていています。
このvoid initialize(istream& stream)というのがどこで呼び出されているのかなど教えて頂けませんでしょうか。
Reply to #64080
×
Subject
Body
Reply To Message #64080 > 皆様お世話になっております。 > > 現在、intelhexutilのプログラムを見ていて思ったのですが、 > > > {code} > int main(int argc, char** argv) { > > //argc = 1; > //argv[0] = C:\mywork\new_wireless_module\open\cc1101driver\trunk\VC_test\intelhexutil\eeprom_data_sn11002.hex; > > > IntelHEXFilePtr file(get_file(argc, argv)); > > --------(中略)---------------------------------------------------------- > > {code} > > > ここで”IntelHEXFilePtr file(get_file(argc, argv));” > というのを呼び出していますが、デバッグでステップ実行でいろいろと追ってみたのですが、class IntelHEXFileImplクラスの > > > {code} > void initialize(istream& stream) { > string line; > while (getline(stream, line)) { > records.push_back(IntelHEXRecordPtr(new IntelHEXRecord(line))); > } > } > > {code} > > > このinitializeというところでgetlineでファイルに存在するテキスト行を最後まで読み取っていくようなプログラムに行くまでの過程がものすごく複雑に感じていています。 > > このvoid initialize(istream& stream)というのがどこで呼び出されているのかなど教えて頂けませんでしょうか。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel
RE: IntelHEXFile.cppのinitializeはどうのように呼び出されている? (2012-06-05 00:24 by
toy_dev
#64163)
Reply
Create ticket
トゥイーです。
initialize の getline でファイルに存在するテキスト行を最後まで読み取っていくという流れはあっています。
これを書くのに C++ の2つの定石(慣習)を使っています。使っている定石は以下の2つです。
1.スマートポインタを使う。
2.PImpl イディオムを使う。
まず、boost::shared_ptr を使った XxxPtr というやつですが、これは new で割り当てたメモリを自動で delete してくれるものです。
自動削除してくれるので「スマート」なポインタと呼ばれています。
メモリリークを防ぐために良く使う基本的な技です。
表面上はポインタと同じ動きをするので、内部の詳細な途中経過は読み飛ばして省いてかまいません。
ptr->method();
と書いてあったら、途中に処理を色々とはさみますが、最終的に method メソッドが呼び出されるので、
呼び出される先のメソッドにブレークポイントを置いて読んで見てください。
次に PImpl イディオムですが、内部的な実装(cpp)と表面上のクラス定義(hpp)を分離するためのものです。
C++ はプログラムが大きくなって複雑になると cpp と hpp との依存関係の嵐でコンパイルが困難になります。
それを避けるための定石です。
P クラスというのがあったら対となる Pimpl クラスを cpp 内でのみ実装するという方法を取ります。
流れとしては
IntelHexFile のコンストラクタで IntelHexFileImpl のインスタンスを new していますね?
すると IntelHexFileImpl のコンストラクタが呼ばれ initialize が呼び出されます。
整理すると
IntelHexFile の new => IntelHexFileImpl の new => initialize
の流れです。
ファイル名(std::string)を指定する場合は、ストリームを指定する場合の両方を考慮して
コンストラクタは2つにし、共通処理として initialize メソッドを定義しています。
ちょっと複雑な説明ですが、わかりましたでしょうか?
知っているとよくやる書き方なのですが、知らないと確かにちょっと難しいです。
Reply to
#64080
Reply to #64163
×
Subject
Body
Reply To Message #64163 > トゥイーです。 > > initialize の getline でファイルに存在するテキスト行を最後まで読み取っていくという流れはあっています。 > > これを書くのに C++ の2つの定石(慣習)を使っています。使っている定石は以下の2つです。 > > 1.スマートポインタを使う。 > 2.PImpl イディオムを使う。 > > まず、boost::shared_ptr を使った XxxPtr というやつですが、これは new で割り当てたメモリを自動で delete してくれるものです。 > 自動削除してくれるので「スマート」なポインタと呼ばれています。 > メモリリークを防ぐために良く使う基本的な技です。 > 表面上はポインタと同じ動きをするので、内部の詳細な途中経過は読み飛ばして省いてかまいません。 > > ptr->method(); > > と書いてあったら、途中に処理を色々とはさみますが、最終的に method メソッドが呼び出されるので、 > 呼び出される先のメソッドにブレークポイントを置いて読んで見てください。 > > 次に PImpl イディオムですが、内部的な実装(cpp)と表面上のクラス定義(hpp)を分離するためのものです。 > C++ はプログラムが大きくなって複雑になると cpp と hpp との依存関係の嵐でコンパイルが困難になります。 > それを避けるための定石です。 > > P クラスというのがあったら対となる Pimpl クラスを cpp 内でのみ実装するという方法を取ります。 > 流れとしては > > IntelHexFile のコンストラクタで IntelHexFileImpl のインスタンスを new していますね? > すると IntelHexFileImpl のコンストラクタが呼ばれ initialize が呼び出されます。 > > 整理すると > > IntelHexFile の new => IntelHexFileImpl の new => initialize > > の流れです。 > > ファイル名(std::string)を指定する場合は、ストリームを指定する場合の両方を考慮して > コンストラクタは2つにし、共通処理として initialize メソッドを定義しています。 > > ちょっと複雑な説明ですが、わかりましたでしょうか? > > 知っているとよくやる書き方なのですが、知らないと確かにちょっと難しいです。
You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.)
Login
Nickname
Preview
Post
Cancel