ab.com コミュニティ https://www.activebasic.com/forum/ |
|
リスト構造体 https://www.activebasic.com/forum/viewtopic.php?t=3114 |
ページ 1 / 1 |
作成者: | 水波形 [ 2012年6月09日(土) 02:00 ] |
記事の件名: | リスト構造体 |
お世話になっております。 今回、ポインタを勉強していて、リスト構造体と言うものを知り、 現在開発しようと思っているツリー型のテキストエディタ(Story Editorに似た感じのもの)に使えると思って考えているのですが、 どうもうまくいきません。 学校ではC言語で習い、何とか課題は提出できたのですが、 自分をごまかしている部分があって完璧には理解できていません。 私の頭の中では、 ツリーのノードの情報をポインタを使って保存していき、 ノードがクリックされた時に参照し表示していく という図式ができています。 [構造体1] - [構造体2] - [構造体3] - [構造体4]…… これを順に検索していく感じです グローバル構造体で コード: Type TREEDATA 'ツリービューのリスト構造体 hHandle As HWND 'ノードのハンドル buffer As BytePtr 'ノードのデータ NextPtr As BytePtr '次のリストの構造体ポインタ End Typeを定義し、 グローバル変数で コード: Dim FirstPtr As TREEDATA 'ツリーデータの最初のポインタを定義。 クリエイトイベントで コード: FirstPtr=NULLとりあえず、追加していこうと コード: Sub AddPointer(hHandle As HWND) 'ツリーのポインタを作成 Dim pt As TREEDATA pt=malloc(SizeOf(TREEDATA)) pt.hHnadle=hHandle pt.NextPtr=FirstPtr FirstPtr=pt End Sub ※引数の「hHandle」はノードのハンドルと書いたのですが、型が違うと怒られます。 これは、どのような感じで書いていけばいいのでしょうか。 また、調べていて疑問に思ったのですが、 BytePtrと*Byte型の違いは何でしょうか。 ご存じの方がいらっしゃいましたら、ご教授ください。 |
作成者: | たかせ [ 2012年6月09日(土) 21:01 ] |
記事の件名: | |
水波形さんが実現したいプログラム(ソフト)機能仕様についてはよくわかりませんが、 ①FirstPtrを構造体のポインタ変数で定義してみてください。 具体的には Dim FirstPtr As TREEDATA ではなく Dim FirstPtr As *TREEDATAで定義してみてください。 ②BytePtrと*Byte型の違いについてですが BytePtrと*Byte型はまったく同じものです。 AB V4.24のBASIC.SBPの28行目~46行目のソースコードに注目してください。 TYPEDEFステートメントを使用しています。 よろしくお願いします。 |
作成者: | 水波形 [ 2012年6月13日(水) 01:31 ] |
記事の件名: | ご返信ありがとうございます |
たかせ様 ご返信ありがとうございます。 引用: Dim FirstPtr As TREEDATA ではなく
なんという醜態……Dim FirstPtr As *TREEDATAで定義してみてください。 そりゃそうだと、回答を拝見した時画面にチョップを入れてしました。 すいませんでした。 引用: ②BytePtrと*Byte型の違いについてですが
なるほど、ありがとうございました!BytePtrと*Byte型はまったく同じものです。 AB V4.24のBASIC.SBPの28行目~46行目のソースコードに注目してください。 TYPEDEFステートメントを使用しています。 TYPEDEFステートメントは……定義付けみたいなものですね……? 何とか進んでいったのですが、今度はリエントラントで躓きました。 ツリービューで、各ノードにリスト構造体を持たせて、情報を管理しています。 リストの中身は、 ・ノードのハンドル ・ノードのデータ(テキストデータ) ・次のリストへのポインタ です。 ツリービューで、アイテムが追加されると、自動的にポインタも作られます。 その時、親ノードを閉じると、子ノードも自動的に消えますが、メモリは開放しません。 それをすべて解放しようとしています。 実験を重ねたところ、 hNext=SendMessage(hTree,TVM_GETNEXTITEM,TVGN_NEXT,hChild) で、なぜか同列のノードが途中からかえらなくなっているところまでわかりました。 理由はわかりません…… 子ノードは5つあるのに、上の関数では3つめまでしかループしていないという状況です。 ちょっと長いですが、おかしな所があればご教授ください。 よろしくお願いいたします。 [ここをクリックすると内容が表示されます]
↓例のリスト構造体です
コード: Type TREEDATA 'ツリービューのリスト構造体 hHandle As HWND 'ノードのハンドル buffer As BytePtr 'ノードのデータ NextPtr As BytePtr '次のリストの構造体ポインタ End Type コード: /* 子ノードのハンドルをすべて削除する関数 */ Function DeleteChildNodePointer(hHandle As HWND) As HWND Dim hChild As HWND Dim hNext As HWND 'まず、削除対象のノードが子を持っていないかを確認する hChild=SendMessage(hTree,TVM_GETNEXTITEM,TVGN_CHILD,hHandle) If hChild<>0 Then '持っていればそいつのハンドルを取得(リエントラント) DeleteChildNodePointer(hChild) End If '持っていなければ次のノードを検索 hNext=SendMessage(hTree,TVM_GETNEXTITEM,TVGN_NEXT,hChild) 'ノードがあれば検出 If hNext<>0 Then DeleteChildNodePointer(hNext) End If 'ポインタを削除する DeletePointer(hHandle) End Function コード: /* ハンドルから指定されたポインタリストを削除する */ Sub DeletePointer(hHandle As HWND) Dim pt As *TREEDATA Dim tp As *TREEDATA pt=FirstPtr tp=FirstPtr Do If pt=NULL Then Exit Do End If If pt->hHandle=hHandle Then If pt=FirstPtr Then 'ポインタが最後ならつなぎ替える FirstPtr=pt->NextPtr free(pt->buffer) free(pt) Else tp->NextPtr=pt->NextPtr free(pt->buffer) free(pt) End If Exit Do End If tp=pt pt=pt->NextPtr Loop End Sub |
作成者: | 水波形 [ 2012年6月13日(水) 16:01 ] |
記事の件名: | すいません |
上の質問ですが、一応、自己解決できました。 ご迷惑をおかけして申し訳ございません。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |