Download
Desenvolver
Conta
Download
Desenvolver
Login
Forgot Account/Password
Criar Conta
Linguagem
Ajuda
Linguagem
Ajuda
×
Login
Nome de acesso
Senha
×
Forgot Account/Password
Estado tradução de Português
Category:
Software
People
PersonalForge
Magazine
Wiki
Pesquisa
OSDN
>
Pesquisar Software
>
低電力無線通信用モジュールCC1101ドライバ作成
>
Fóruns
>
VC++公開討議
>
IntelHEXFile.cppのinitializeはどうのように呼び出されている?
低電力無線通信用モジュールCC1101ドライバ作成
Descrição
Project Summary
Developer Dashboard
Página da Web
Developers
Image Gallery
List of RSS Feeds
Activity
Statistics
Histórico
Downloads
List of Releases
Stats
Código Fonte
Code Repository list
Subversion
Visualizar Repositório
Tíquete
Ticket List
Milestone List
Type List
Lista de componentes
List of frequently used tickets/RSS
Submit New Ticket
Documents
FrontPage
Title index
Recent changes
Communication
Fóruns
List of Forums
C++ Builder関連 (1)
Developers (1)
Ajuda (1)
VC++公開討議 (29)
公開討議 (10)
送信出力問題について (6)
Mailing Lists
list of ML
News
Fóruns:
VC++公開討議
(Thread #32274)
Return to Thread list
RSS
IntelHEXFile.cppのinitializeはどうのように呼び出されている? (2012-05-30 18:03 by
blackzoro
#64080)
Responder
Criar tíquete
皆様お世話になっております。
現在、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)というのがどこで呼び出されているのかなど教えて頂けませんでしょうか。
Responder a #64080
×
Assunto
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
Pré-visualizar
Post
Cancelar
RE: IntelHEXFile.cppのinitializeはどうのように呼び出されている? (2012-06-05 00:24 by
toy_dev
#64163)
Responder
Criar tíquete
トゥイーです。
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 メソッドを定義しています。
ちょっと複雑な説明ですが、わかりましたでしょうか?
知っているとよくやる書き方なのですが、知らないと確かにちょっと難しいです。
Responder a
#64080
Responder a #64163
×
Assunto
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
Pré-visualizar
Post
Cancelar