【サーバー各所】ActiveBasicその11【冬眠中】at TECH
【サーバー各所】ActiveBasicその11【冬眠中】 - 暇つぶし2ch463:デフォルトの名無しさん
09/10/07 10:02:49
久々に使ってる。
ウィンドウ作成のクラス名でひっかかってたんでメモ
ABでは文字列型はstringで、普通に文字列ポインタを渡すには必ずStrPtr()を通さないといけないのかと思ったが、
直で指定された文字列は普通に・・C言語と同じポインタとして扱われるってのを、コンパイラの強制型変換で気がついた。
まずだめなコード
dim s_szWndClassName = StrPtr("TheWindowIwillCreate")

大丈夫なのは次
1.dim s_szWndClassName as BytePtr
  s_szWndClassName = StrPtr("TheWindowIwillCreate" )
  s_szWndClassName = StrPtr("TheWindowIwillCreate" as string)

2.dim s_szWndClassName ="TheWindowIwillCreate"
  dim s_szWndClassName ="TheWindowIwillCreate" as BytePtr

さらにテストコード。コンパイルには通っても、実際どう管理されているのかは見てみないと分からない。
dim s0 as DWord
s0 = $"test"
s0 = "test"

dim s1 as string
s1 = $"test"
s1 = "test"

dim s2 as BytePtr
s2 = $"test"

dim s3 = $"test"
dim s4 = "test"
[警告] "s3" 型が指定されていません。Double型として扱います。
[警告] "s4" 型が指定されていません。Double型として扱います。
[警告] *ByteからDoubleに強制変換されています。

464:463
09/10/07 13:44:22
↑はミス

初期値を与えた文字列変数をグローバルに持とうと思ったけどうまくいかん。
最初に名前を定義しようと思ったらconst使うしかないのか。
constだとあちこちにコピーが作られそうでいやなんだけどなあ・・・

'dim s_szWndClassName = "test" ' 空白
'dim s_szWndClassName = "test" as string' 空白
'dim s_szWndClassName = "test" as BytePtr' 空白
'dim s_szWndClassName = "test"$ ' バイナリ
'dim s_szWndClassName = Ex"test" ' "n"
const s_szWndClassName = "test" ' ok


465:デフォルトの名無しさん
09/10/07 21:32:08
文字列がちゃんと表示されたのは次のとおりだった。・・・stringでも*Byteでも一緒なのはどういうことだろ。
なんでエラーになってたんだろ。

dim s_szStr2 = "test" as *Byte
dim s_szStr4 = "test" as BytePtr

dim s_szStr as BytePtr
s_szStr = "test"

dim s_szStr as string
s_szStr = "test"


466:デフォルトの名無しさん
09/10/07 21:53:24
関数内で変数宣言したらうまくいくけど、ファイルの先頭でやるとだめだった。
関数を別スレッドで動かしてるからだめなのか、グローバルの変数を壊してるのか、
グローバルだからだめなのか・・・

グローバルはダメだとすると、グローバル変数を使った同期処理ができないことになりそうだが・・・


467:デフォルトの名無しさん
09/10/07 22:31:19
別スレッドを作ってみたけどやっぱり動いた。
ってことは途中でメモリぶっこわしてんのか・・・
ポインタ演算なんかやってないんだけどなあ・・・
関数ポインタ使ったくらいなんだ。
おtt。Export はDLLでしか使わないんだっけ。
でも別に影響ないよな。

DLLだとだめだとかないよな・・・

typedef WNDPROC = *Function(a as HWND, b as DWORD, c as WPARAM, d as LPARAM) as Long

Function Export WindowProc(hWnd as HWND, uMsg as DWORD, wParam as WPARAM, lParam as LPARAM) as Long

Function RegisterWndClass(WndProc as WNDPROC)
wc.lpfnWndProc = WndProc

RegisterWndClass(AddressOf(WindowProc))


468:デフォルトの名無しさん
09/10/08 12:15:17
アホなベーシックやっても就職では何も評価されないよ
やるだけ時間のムダ

マイクロソフトのフリーのコンパイラあるからそれつかったら?
ABもどうせマイクロソフトのコンパイラでガキどもが
趣味でつくってるだけだろwwww


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch