ab.com コミュニティ
https://www.activebasic.com/forum/

リスト構造体
https://www.activebasic.com/forum/viewtopic.php?t=3114
ページ 11

作成者:  水波形 [ 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つめまでしかループしていないという状況です。


ちょっと長いですが、おかしな所があればご教授ください。
よろしくお願いいたします。

作成者:  水波形 [ 2012年6月13日(水) 16:01 ]
記事の件名:  すいません

上の質問ですが、一応、自己解決できました。
ご迷惑をおかけして申し訳ございません。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/