FC2ブログ

cLuaJIT:LuaJIT ソースを exe ファイル化

2019-09-18 :  PCクリニック
世の中には、
Pythonのファイルをexe化する方法【初心者向け】
  初心者向けにPythonでファイルをexe化する方法について解説しています。
  exeとはWindowsの環境で使える実行ファイルの拡張子です。
  今回はpyinstallerを使ったexe化の方法を見ていきます。
  pyinstallerの導入から変換、起動の確認までの一連の手順を見ていきましょう。
  ・・・・・
  ・・・・・

などの様に、スクリプト言語のソースを実行ファイルに変換する、
疑似(?)コンパイラが存在する。


過去記事(2018-02-09付)にもあった:
Anaconda 学習:スクリプトを exe ファイル化



そこで、
Lua 言語ソースを、実行ファイルに変換するLuaJITコンパイラ?を探してみた。


「LuaJIT exe」検索で、・・・


“Qiita”の記事を見つけた:
LuaスクリプトをLuaJITを使ってexe化する

  Luaをexe化する際は、LuaDist/srluaというLuaのコンパイラとLuaスクリプトを
  一つのexeとして固めるツールが有名ですが(といいますか、これ以外知らない)、
  Luaの場合は実行速度がRubyよりも遅く、遅さが気になる場合があります。

  なのでLuaJIT版を作りました。
  なお、こちらは複数のLuaスクリプトをアーカイブして
  exe内に取り込むようになっています。

  wordijp/cLuaJIT(github)(リンク)


  使い方

  コマンド名はcluajitです、これは作成時にソースを流用させて頂いた
  uLuaの名前にあやかっています。
  # luajitと同じくスクリプトを実行
  $ cluajit hello.lua
  hello world

  # 一旦exe化して実行
  $ cluajit hello.lua hello.exe -link
  $ hello.exe
  hello world

  # モジュール用スクリプトもある場合は
  $ cluajit hello.lua foo.lua hello.exe -link
  $ hello.exe
  hello world
  from foo


  速度比較

  ・・・・・
  ・・・・・
  やはりLuaJITは速いです、exe化したら少し遅くなってますが
  これくらいの誤差なら気にならないかと思います、
  なによりも配布時にバイナリ渡すだけで済むのは楽です。
  ・・・・・
  ・・・・・


と云うことで、上記リンク先を見てみた。

wordijp/cLuaJIT(github)
  ・・・・・
  ・・・・・
  binaries

  Windows binaries


ここから、
  「cluajit-windows-x86_64-mingw32-gcc.zip」 265KB
  をダウンロードした。

中には、「cluajit.exe」 2016-11-24 付 1つ



これで、某プログラム「~.gsl」をテスト。


拡張子を「.lua」に変え、
「require 'pl'」と「require 'time'」を削除

これで、使えた。
コンパイル(ソースからexeへの変換)は無視できる程の速さ。
exeの実行時間は25秒が、27~28秒。
・・・最初の“Qiita”の記事と似たり寄ったり。

出来る exe は 32ビット版。



ただ、1点バグ?:複数ソースを纏めることが出来ない???



本日はここまで。


Lua ( GSL Shell ) 学習も続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190331
スポンサーサイト



FreeBASIC 学習:ビット操作と String

2019-09-11 :  PCクリニック

まだまだ、FreeBASIC の学習は続く。

今回は、
「ビット操作について & その他、関連事項」と「文字列(String)」



(1)n進数:直定数
   「目次→教本→プログラマーのための案内→直定数(Literals)」

   10進数 17
   2進数  &B10001
   8進数  &O21
   16進数 &H11


(2)ビット操作マクロ:Bit Manipulation
   「目次→実行時ライブラリー→ビット操作(Bit Manipulation)」

  ビット操作マクロ:数値の、個々のビットの状態を、得ます。

  BIT   個々のビットの状態を、整数値で取得します。
    result = Bit ( value, bit_number )
         bit_number は、0 ~ 7/15/31/63
    bit_number によって指定されたビットが、整数 value で設定されているか
         どうかを示す整数値
    ( value And 1 Shl bit_number ) <> 0

   Print Bit (4,2) → -1
       &B100 の3ビット目は 1 なので、“1<>0”は true で -1
   Print Bit (5,1) → 0
       &B101 の2ビット目は 0 なので、“0<>0”は false で 0

  BITRESET 整数の値を、指定したビットを消去した状態で、取得します。

  BITSET  整数の値を、指定したビットを設定した状態で、取得します。
    result = Bitset ( value, bit_number )
       指定された bit_number を設定( on あるいは 1 に )して、
       整数 value のコピーを展開
    value Or ( 1 Shl bit_number )


(3)演算子 Shl (左シフト)
   演算子 Shr (右シフト)
   「目次→演算子→算術演算子→演算子 Shl (左シフト)

   ビット単位演算子: And  Or  Xor  Not
             その他 ・・・ 論理演算子のこと

     result = lhs Shl rhs
          lhs を、rhs の数だけ、左に移動した結果を返す
          ・・・ 溢れは消える
          一つシフトする毎に lhs に 2 を掛けるという効果がある


(4)数値を文字列に変換
   「目次→実行時ライブラリー参考→文字列関連(String Functions)

  BIN: 整数値の、2進数文字列(String(文字列)) 表現を返します。 WBIN
  OCT: 整数値の、8進数文字列(String(文字列)) 表現を返します。 WOCT
  HEX: 整数値の、16進数文字列(String(文字列)) 表現を返します。WHEX
  STR: 数値から、その文字列(String(文字列)) 表現を返します。 WSTR

  FORMAT:倍精度浮動小数(DOUBLE)の、
      成形された文字列(String)表現を返します。

   result = Bin( number [, digits ] )
     Print Bin(54321)    1101010000110001・・・・キッチリ表示
     Print Bin(54321, 5)   10001 ・・・・・・・・・・・上位切り捨て
     Print Bin(54321, 20)  00001101010000110001・・上位ゼロ埋め

     &B、&O、&H は付かない文字列


   result = Str( number ) または、
   result = Str( string )
       number:文字列に変換する、数値表現。
       string:文字列に変換する、文字列表現。

    Str は、数値変数を、文字列表現に変換します。
    数値型変数に適用する Wstr にあたる String を取得できます。
    文字列を数値に変換する Val 関数の反対にあたります。

       result = Val( strnum )
               strnum:数に変換する文字列
    Val は、2進数/8進数/16進数形式に、
       関連識別接頭辞 ("&B" / "&O" / "&H") を付けて、
         整数に変換するのに使えます。
         例えば: Val("&HFF") は 255 を返します。



(5)FORMAT:「目次→ランタイム・ライブラリー参考→文字列関数→FORMAT

   指定された書式で、数を整形します。

  構文:
declare function Format( byval N as double, byref F as CONST String = "" ) as String

  用法:
   # include "vbcompat.bi" ←渡辺推奨
   result = Format( numerical_expression, formatting_expression )

  パラメタ:
    numerical_expression :整形される数
    formatting_expression:整形に使う書式

  戻り値:
    数の表示形式を、書式で指示したように整形した、文字列を返します。
    書式表現は、数値や日付・時間の値を生み出すことができる文字列です。

  注意:
    Format は、渡された値を常に Double に変換します。
    上の「構文」を参照下さい。
    このため表示できる結果の精度は、10進数て約15桁までになります。

  記述:
    意味のある日付・時間の値を取り出すために、
    適切な関数から得られた日付データであること。

  この関数は FreeBASIC の一部だが、vbcompat.bi が無いと、
  コンパイラによって認識されない。


行継続、文字列連結、そして、エスケープ文字を使ったコード例:
============================================
Dim txt As String

txt = _ '' 改行を含む文字列 txt の定義
!"abc 123\n" +_ '' ! は、\n を使う為
!" xyz\n" +_ '' + は、文字列連結
!" ABC\n" '' _ は、行継続

print txt

''' ---------------- 以上の様に txt を定義すると、

abc 123
xyz
ABC

''' ---------------- の様に出力される。

   \n は、&h0A = 10 : LF ( 改行 ) 1バイトのみ。

   &h0D = 13 : CR ( 復帰 ) は無し。・・・ つまり、Unix 系



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190517

防災の日の出来事?

2019-09-04 :  PCクリニック
ことの発端は、
令和元年(2019年)8月31日の夜でした。

一日の終わりに、メールを受けて仕舞おうとした。

ところが、なんと 1,200超ものメールを受信した!

殆ど(全てと思うが)、Melania Trump がどうたらこうたら・・・
そして、発信元は、GMail アドレス。

2通ほど、普通のメールが混じっていたが、
どうたらこうたらは全て消した。

これで、やっと一日が終わった。



ところが、
翌9月1日の朝、サーバーにログイン出来ない:
  パスワードが違っている???

これは、メインの plala メール。

他の biglobe メールは、正常。
plala メールでも、家族のアドレスは正常。


仕方なく(?)、・・・・・


マイページの「メールパスワードの変更」で、
新しいパスワードを設定した。


これで、一件落着?



2日後:9月3日


NTTぷらら から、封書が届いた:(一部、文言を変えている)

  「緊急のご案内」

  9月1日、お客様の契約しているメールアドレス、メールパスワードを利用し、
  大量のメールが送信されており、メール送信サーバーが過負荷状態になって
  おります。そのため、メールのご利用に制限をかけさせていただきました。

  至急、メールパスワードの再設定を行ってください。


と云うことだった。



これは、まずかった。



そして、
AVG AntiVirus Free も古くなっていた。
・・・・・これも、アップデートした。



本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190831-0903

FreeBASIC 学習:DATA 、READ 、RESTORE

2019-08-31 :  PCクリニック
先月(2019-07-27)の記事:
FreeBASIC 学習:gsl, The GNU Scientific Library
で書いたコードを見直してみたら、

次の様なコードがあった。
dim x(4) as double          ''''' これ、実は5要素の配列

for i=1 to 4
Read x(i)
next

data 1970, 1980, 1990, 2000 ''''' これ、何処にあっても可

そう云えば、
フリー ベーシック (日本語マニュアル) FreeBASIC」をよくよく見ると、
左ペインの、 目次 → その他 → その他の予約語
に、データ として、
  DATA
  READ
  RESTORE
がある。



DATA」には、

  Data は、定数値か文字列表現の、一覧を格納します。
  内容は、コンパイル時に評価されます。
  この一覧は、定数として、保存されて、Readを用いて、
  変数に読み込むことができます。

  すべての Data 命令は、ただ一つの数珠つなぎの一覧として振る舞います。
  1つの Data 命令の最後の要素が読まれた後に、
  次の Data 命令の最初の要素が読み込まれます。

  最後の Data の要素を読み込んでしまった後は、Read 命令があっても、
  それ以上の要素を読み込むことは有りません。

  Data 定数は、単純な型(数値か文字列)であることができるだけです。
  数値は、数字直定数として、文字列変数に読み込むことができます。
  数値変数に読み込まれた文字列は、Val 関数で評価されます。

  Data は、通常、変数に初期値を設定するために使います。



READ」には、

  Data 命令で、アプリケーションに保存したデータを、読み込みます。

  要素並びは、数値、文字列、配列要素の、標準のデータ型と、ユーザ定義型です。

  Data の最後の要素まで読んだ後は、Read を試みることはありません。



RESTORE」には、

  次に読まれる位置を、Data 命令文で格納された値のために、変更します。

  次に読むデータのポインタを、
  指定ラベルにつづく、最初の Data 命令文の、最初の要素に、設定します。

  例:
dim x(4) as Long
dim y(4) as double

for i=1 to 4 : Read x(i) : next
for i=1 to 4 : ? x(i) : next

restore dat_ ''''' <===== 再読み込み可
for i=1 to 4 : Read y(i) : next
for i=1 to 4 : ? y(i) : next

dat_:
data 1970, 1980, 1990, 2000
とある。


これは、「Perl の、__DATA__ 相当?」かナ???



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190515

FreeBASIC 学習:備忘録(忘れやすい事)5言語対比表

2019-08-28 :  PCクリニック
最近は、
GSL Shell(Lua) 以外に、FreeBASIC を学習している。
更に、以前からの C言語 や、Python 、Perl も使うことがある。

微妙なところで、言語仕様がゴチャゴチャになるので、
備忘録として、良く忘れる事について、対比表を作ってみた。

「FreeBASIC」、「C言語」、「GSL-Shell」、「Python」、「Perl」の5言語。


作り方は、
4月(2019-04-24)の記事:
Microsoft Excel :html 形式での保存
で書いた方式:
  MS Excel を使って、表形式で入力し、
  “~.html”ファイルに変換出力する。


と云うことで、

未だ、仕掛かり状態ですが、・・・・・

一応まとまったので、
<紙>さんHP にアップした。

これ



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190512

FreeBASIC 学習:winbase.bi

2019-08-24 :  PCクリニック
ひょんなことから、
  ~/FreeBASIC/inc/win/ に「winbase.bi」が有ることを発見した。

  これは、“kernel32”で定義されている関数用のヘッダファイルの様だ。

  1ヶ所コンパイルエラーとなるので、コメントアウトして、置き換えた。


そこで、
以前(2019-07-24)の記事:
FreeBASIC 学習:ファイル・アクセス方法
とは異なる、所謂Win32API 方式について、
ファイルの入出力処理に関して学習。



「WriteFile ReadFile」検索で、
Win32API ファイルを扱う CreateFile, ReadFile, WriteFile, CloseHandle
を見つけたので、
これで学習。

  Win32APIでファイルを扱う

  使用するAPI
    CreateFile ・・・・・ 後記:CreateFile(A)
    ReadFile
    WriteFile
    CloseHandle
    GetStdHandle


そこに載っているコード:
  ファイルからデータを読み込み、コンソールにそのデータを出力する

「Read_conPut.bas」として、作ってみた:
                                             ''''' Read_conPut.bas
#include "win/winbase.bi"

Dim hFile As HANDLE
Dim ss As zString ptr : ss=Allocate(9) : *ss = "test.txt"
Dim szBuff As String *1024
Dim As DWORD RdByt, WtByte
Dim bRet As BOOL

while true
hFile = CreateFile( *ss, GENERIC_READ, 1, 0, 3, FILE_ATTRIBUTE_NORMAL, 0 )
'' 1:FILE_SHARE_READ 3:OPEN_EXISTING
if hFile = INVALID_HANDLE_VALUE then
print *ss; " CreateFile Failed" : exit while
end if

bRet = ReadFile( hFile, @szBuff, 1024, @RdByt, 0 )
print bRet, RdByt
if bRet = 0 then
print "ReadFile Failed" : CloseHandle(hFile) : exit while
end if

WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), @szBuff, RdByt, @WtByte, 0 )
print WtByte
CloseHandle(hFile)
exit while
wend

Sleep

OKダ。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190511

FreeBASIC 学習:QSort - CRT 改造版

2019-08-21 :  PCクリニック
FreeBASIC では、ソートはどうする?

と云うことで、

「FreeBASIC qsort」検索を行って、
Sort Array - freebasic.net」を見つけた。

これの[1番目]は、
  I found the code in JustBasic. Works like a quick.
  On my computer, sorted 1000000 for 0.22 .... second.
  Someone can offer a faster version?


[2番目] は コード ( [3番目]も同一 ):
Dim As UInteger MaxSize = 2000000
Dim Shared NumArray(MaxSize) As UInteger
Randomize Timer
Sub Qsort(start As Integer,Finish As UInteger)
Dim As UInteger I=start,J=Finish,X=NumArray(Int((I+J)/2)),A
While I <= J
While NumArray(I) < X
I+=1
Wend
While NumArray(J) > X
J-=1
Wend
If I<=J Then
A = NumArray(I)
NumArray(I) = NumArray(J)
NumArray(J) = A
I+=1
J-=1
EndIf
Wend
If J > Start Then Qsort(start,J)
If I < Finish Then Qsort(I,Finish)
End Sub

Sub ASM_QSort(a() As Integer, l As Integer, r As Integer)
Dim As Integer i=l, j=r, x=a((l+r)\2)
Asm
QS_L0: 'Do
mov ecx, [a]
mov ecx, [ecx]
QS_L1:
mov ebx, [i]
lea edi, [ecx+ebx*4]
mov ebx, [x]
cmp [edi], ebx 'While a(i) jge QS_L2
inc dword ptr [i] 'i+=1
jmp QS_L1
QS_L2:
mov ebx, [j]
lea esi, [ecx+ebx*4]
mov eax, [esi]
cmp [x], eax 'While x jge QS_L3
dec dword ptr [j] 'j-=1
jmp QS_L2
QS_L3:
cmp [i], ebx 'If i<=j Then
jg QS_L4
mov eax, [edi] 'Swap a(i), a(j)
xchg eax, [esi]
mov [edi], eax
inc dword ptr [i] 'i+=1
dec dword ptr [j] 'j-=1
QS_L4:
cmp [i], ebx 'Loop Until i>j
jle QS_L0
End Asm
If l If iEnd Sub

Sub RapidSort (Item()As Integer, LoElement As Integer, HiElement As Integer)
Dim As Integer n, wert, nptr, arr, rep, LoVal, HiVal
LoVal=Item(LoElement)
HiVal=Item(HiElement)
For n=LoElement To HiElement
If LoVal> Item(n) Then LoVal=Item(n)
If HiVal< Item(n) Then HiVal=Item(n)
Next
ReDim SortArray(LoVal To HiVal) As Integer
For n=LoElement To HiElement
wert=Item(n)
SortArray(wert)=SortArray(wert)+1
Next
nptr=LoElement-1
For arr=LoVal To HiVal
rep=SortArray(arr)
For n=1 To rep
nptr=nptr+1
Item(nptr)=arr
Next
Next
Erase SortArray
End Sub

Dim t As Double
Print "Qsort ";
For I As Integer=1 To MaxSize
NumArray(I) = Int(Rnd*MaxSize)
Next
t=Timer
Qsort(1,MaxSize)
?Timer-t

Print "ASM_QSort ";
For I As Integer=1 To MaxSize
NumArray(I) = Int(Rnd*MaxSize)
Next
t=Timer
ASM_QSort(NumArray(),1,MaxSize)
?Timer-t

Print "RapidSort ";
For I As Integer=1 To MaxSize
NumArray(I) = Int(Rnd*MaxSize)
Next
t=Timer
RapidSort(NumArray(),1,MaxSize)
?Timer-t
Sleep
コンパイル/リンク OK
そして、実行
     QSort 0.35
     ASM_QSort 0.31
     RapidSort 0.055


[4番目]
  RapidSort is good! Thanks.

  Yes because 'RapidSort' algorithm is optimized for the particular case
   where the variables are integers.
  The principle is to compute the distribution 'SortArray()' of
   the variables to order.


[5番目]~[7番目] : 上記のディスカッション


[8番目]
  The CRT qsort function implements a compiler-optimized,
  non-recursive quick sort-insertion sort hybrid,
  that despite having to call a separate function for each comparison is
  much faster than your simple recursive version.
 ===
  CRTのqsort関数は、コンパイラごとに最適化された、
  非再帰的なクイックソート - 挿入ソートハイブリッドを実装していますが、
  比較ごとに別々の関数を呼び出す必要があるにもかかわらず、
  単純な再帰バージョンよりはるかに高速です。

 そのコード:
''==========================================
#include "crt.bi"
''==========================================
Dim As UInteger MaxSize = 1000000
Dim Shared NumArray(MaxSize) As UInteger
Randomize Timer
''==========================================

function compare naked cdecl( byval elem1 as any ptr, _
byval elem2 as any ptr ) as integer
asm
mov ecx, [esp+4]
mov edx, [esp+8]
mov eax, [ecx]
sub eax, [edx]
ret
end asm
end function

''==========================================

Sub _Qsort(start As Integer,Finish As UInteger)
Dim As UInteger I=start,J=Finish,X=NumArray(Int((I+J)/2)),A
While I <= J
While NumArray(I) < X
I+=1
Wend
While NumArray(J) > X
J-=1
Wend
If I<=J Then
A = NumArray(I)
NumArray(I) = NumArray(J)
NumArray(J) = A
I+=1
J-=1
EndIf
Wend
If J > Start Then _Qsort(start,J)
If I < Finish Then _Qsort(I,Finish)
End Sub

''==========================================
/' ------------------------------------
Print "Unsorted Array"
For I As Integer=1 To MaxSize
NumArray(I) = Int(Rnd*100)
Print NumArray(I);" ";
Next
print
_Qsort(1,MaxSize)
Print "Sorted Array"
For I As Integer=1 To MaxSize
Print NumArray(I);" ";
Next
print

Print "Unsorted Array"
For I As Integer=1 To MaxSize
NumArray(I) = Int(Rnd*100)
Print NumArray(I);" ";
Next
print
qsort( @NumArray(1), MaxSize, 4, @compare )
Print "Sorted Array"
For I As Integer=1 To MaxSize
Print NumArray(I);" ";
Next
print
-------------------------------------'/

sleep 3000

dim as double t
t = timer
_Qsort(1,MaxSize)
print using "##.###";timer-t

t = timer
qsort( @NumArray(1), MaxSize, 4, @compare )
print using "##.###";timer-t

sleep
と云うことで、・・・・・

実行結果:
     0.090
     0.003

速い!


本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190509

FreeBASIC 学習:strtok, 文字列を指定文字で分割

2019-08-17 :  PCクリニック
FreeBASIC は、実質 C言語 と同じ?!

と云うことで、
「C言語 関数集」検索を行って、
C言語関数辞典」を見つけた。

ここには、多分全てのC言語関数が載っている?

   当サイトは、その名のとおりC言語の関数やマクロの使い方
  についての説明を主なコンテンツとしております.
   コーディング中に「あれ,この関数なんだっけ?」となったときや,
  関数をmanコマンドで調べたけれど,いまいち使い方が分からないとき
  などにご利用いただければ幸いです.


  “C言語関数辞典”は大きく分けて4つのコンテンツから構成される

   コンテンツ     説明
  ヘッダファイル別  C言語の関数とマクロをヘッダファイルごとに掲載
  アルファベット別  C言語の関数とマクロを索引(アルファベット)ごとに掲載
  C言語Tips集     C言語のTipsを各分類ごとに掲載
  C言語用語集     使用している用語についての解説を掲載

  ・・・・・
  ・・・・・



この中の、string.h に、

  strtok : 文字列を区切り文字で分割する

がある:

  strtok

  strtok 関数は・・・・・ char* strtok( char* s1, const char* s2 );
  s1 が指す文字列を,
  s2 が指す文字列の中のいずれかの文字で区切られる字句の列に分割します.

 strtok 関数は,
  Perl などの他のプログラム言語の文字列分割関数とは異なり,
 1 回の呼び出しで複数の分割を行うことができません.
 文字列の分割は,strtok 関数を呼出すごとに 1 回ずつ行われます.

  1 回目の呼び出しには,s1 に分割する対象の文字列を指定します.
  2 回目以降の呼び出しは,s1 に NULL を指定することで,
  前回分割された場所の次から分割を開始します.
  分割できる文字列がなくなると strtok 関数は NULL を返します.



この、「C言語関数辞典」に載っているヘッダファイルは、
(全てが?) ~/FreeBASIC/inc/crt/ にある?

そこで、
C言語サンプルプログラム
にあるサンプルを FreeBASIC で書き直してみた。
'' #include "crt/stdio.bi"   ' 無くて可
'' #include "crt/stdlib.bi" ' 無くて可
#include "crt/string.bi"

dim as string s1 = "0055,Ichiro Suzuki,Seattle,090-9999-9999"
dim as zstring ptr cod, nam, add, tel, emp

'' ----- 1回目の呼出し
cod = strtok(s1, ",")

'' ----- 2回目以降の呼出し
nam = strtok(NULL, ",")
add = strtok(NULL, ",")
tel = strtok(NULL, ",")
emp = strtok(NULL, ",")

print "code:"; *cod
print "name:"; *nam
print "address:"; *add
print "tel:"; *tel
print "empty:"; *emp

Sleep
これを、コンパイル&実行。

OKですね。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190508

FreeBASIC 学習:IUP ライブラリ

2019-08-14 :  PCクリニック
先月(2019-07-31)の記事:
FreeBASIC 学習:配列等とインデックス演算子」に続いて、・・・・・

FreeBASIC マニュアル」(日本語訳版)」の、左ペイン: 目次
の下の方、
その他”の 「ライブラリ・ヘッダー索引
を見ていたら:「FreeBASIC ExtLibTOC

  描画/試験版のユーザ・インタフェース
    ・・・・・
    ・・・・・
    IUP - GUI を構築するための移植ツールキット。
    ・・・・・
    ・・・・・

があった。

これは、
3年前(2016-03-13)の記事:
GSL Shell 学習:IUP - Portable User Interface
に相当するもの(?) ですネ。


ヘッダファイル「iup.bi」は、初めから含まれていた:
インストール先: ~/FreeBASIC/inc/IUP/ にある。


そこで、
中で定義されている:「#inclib "iup"」に対しては、
GSL Shell からコピーした:
  ~/Lua/gsl-shell/iup.dll を持ってきた。


テストとして、3年前の記事で書いたコードを移植した:
#include once "IUP/iup.bi"

IupOpen( 0, 0 ) ' ----- これ必須!!!

IupMessage( "test", "OK?" ) ' -- IupMessageDlg のテスト

Dim As String A, B
Dim Fdlg As any ptr

A = !"DIALOGTYPE = OPEN, TITLE = \"File Load\""
B = !"FILTER = \"*.png\""

Fdlg = IupFileDlg()
IupSetAttributes( Fdlg, A )
IupSetAttributes( Fdlg, B )

IupPopup( Fdlg, 0, 0 )

IupClose()
これで、OKでしょうか?



ここで、学習したこと。

  文字列でエスケープ・シーケンス(拡張表記)を使うとき:
  演算子 ! を使うと、文字列直定数で使える。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190507

FreeBASIC 学習:cv2 モジュール

2019-08-10 :  PCクリニック
前回(2019-08-07)の記事:
FreeBASIC 学習:time モジュール」に続いて、
OpenCV用のヘッダファイルを作る。

とは云っても、
実際は、GSL Shell用に(2016-03-26に)作った“cv2.lua”モジュール:
  「GSL Shell 学習:“cv2.lua”モジュール自作
から
C言語用ヘッダーファイル相当を抜き出して、

先日(2019-07-20)の記事:
FreeBASIC 学習:ヘッダファイル変換ツール fbfrog」で作った、
fbfrogで変換するダケ(変換結果から若干手修正するが)。

そして、

  #inclib "opencv_world300" '  この行を付加した。

結果は、“cv2.bi”



早速、
動作確認の為のテストメイン:「CV_test.bas」
を作成・実行。

これは、先月(2019-07-12)の記事:
FreeBASIC 学習:OpenCV 使えた
を若干手直しして作成。
#include "cv2.bi"
' ----------------------------------------

dim img as CvMat ptr
dim as long xx, yy
dim B as ubyte ptr

img = cvLoadImageM( "test.tif", 0 ) ' 0 : GrayScale で読込む

yy = img->yy: xx = img->xx: B = img->Byte

print yy, xx ' 行数、列数
print B[0], B[xx-1], B[(xx*(yy-1)+xx-1)] ' 画素値3つ
これで動いた。
OKダ。



更に、もう1本

2年前(2017-08-11)の記事:
OpenCV 学習:cvMinMaxLoc」の
テスト・プログラム「CV_cvMinMaxLoc.gsl」を移植して、
「CV_cvMinMaxLoc.bas」を作ってみた。
#include "cv2.bi"

declare sub cvMinMaxLoc_ Alias "cvMinMaxLoc"( byval arr as CvArr ptr, byval N as double ptr, byval X as double ptr, byval Nidx as CvPoint ptr, byval Xidx as CvPoint ptr, byval mask as CvArr ptr )
'      _ は、@24 付のため。--- リンクで Warning が出るが
' =======================================
Dim As CvMat Ptr M_, m ' 大文字/小文字の区別が無いので注意!
Dim T( 4*3 ) As Double => { 0.2, 4, -0.5, 1 , 1.1, 0, 3.0, -3 , 1.2, -5, 0, 2 }
Dim As Long n, k, j

' --- 3行4列マトリックス
M_ = cvCreateMat( 3, 4, 6 ) ' -- CV_64FC1
For n = 0 To 11 : M_->Dbl[n] = T(n) : Next

Dim As Double N_, X
Dim As CvPoint PN, PX

m = cvCreateMat( 3, 4, 0 )


' --- 2行目ベクトル 4要素目=2行目先頭
For n = 0 To 11 : m->Byte[n]=0 : Next
For n = 4 To 7 : m->Byte[n]=1 : Next
cvMinMaxLoc_( M_, @N_, @X, @PN, @PX, m )

' --- 最大値のインデックスの列
' print N_, X, PN.x, PN.y, PX.x, PX.y
for j=0 to 2 : print M_->Dbl[4*j+PX.x], : next : print


' --- 3列目ベクトル 1行は4要素
for n=0 to 11 : m->Byte[n]=0 : next
for n=2 to 10 step 4 : m->Byte[n]=1 : next
cvMinMaxLoc_( M_, @N_, @X, @PN, @PX, m )

' --- 最大値のインデックスの行
' print N_, X, PN.x, PN.y, PX.x, PX.y
for k=0 to 3 : print M_->Dbl[4*PX.y+k], : next: print
これもOK。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190506

FreeBASIC 学習:time モジュール

2019-08-07 :  PCクリニック
3年前(2016-03-29)の記事:
GSL Shell 学習:Lua モジュール・サイト」で、
timeモジュールについて書いている。

  ・LuaPower サイトからダウンロードした。

具体的には、
その2ヶ月前(2016-01-18)の記事:
Lua 学習:FFI Bindings
  ・・・・・
  ・・・・・
  Core OS Libraries
  の5番目:
  luapower/time: time, clock, sleep (Linux/OSX/Windows)
  ・・・・・
  ・・・・・

この「time.lua」を解読して、
FreeBASICに移植した。

関数は、現在時刻の取得1つだけで、名前は<紙>流の time_ とした。


1万分の1秒単位(100um単位)の時刻取得関数の実体は、
kernel32.dll に含まれている、GetSystemTimeAsFileTime ですネ。


それで、
ヘッダファイルを、_time.bi として作った:
Declare Sub GetSystemTimeAsFileTime_ Alias "GetSystemTimeAsFileTime"( Byval t As LongInt ptr )
' _ は“@4”が付くから。

' #inclib "kernel32" ・・・・・ これは、無くても可

Function time_( ) As Double
Dim tm_time as LongInt
Dim DELTA_EPOCH_IN_100NS As LongInt = 116444736000000000
GetSystemTimeAsFileTime_( @tm_time )
tm_time = ( tm_time - DELTA_EPOCH_IN_100NS ) / 1000 ' 100マイクロ秒単位
return tm_time / 10000.0 ' 実数化(秒.100u秒)
End Function


そして、
早速テストメイン:
' test_mS.bas
#include "_time.bi"

dim tm as double = time_() : Print ( tm )
これをコンパイルして、実行

  9_999_999_999.9999

の様に、表示された。( アンダバーは、見やすさのため )


確かに、1万分の1秒単位(100um単位)で取得できた。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190505

MS Excel 起動時にエラー・ダイアログ表示

2019-08-03 :  PCクリニック
突然、
Microsoft Excel 起動時にエラー・ダイアログが出るようになった:

  オブジェクト ライブラリ(stdole32.tib)が見つからないか、または壊れています。
  セットアップ プログラムを実行し、インストールし直してください。

「OK」をクリックすると、・・・・・

インストール中 Microsoft Excel の機能・ダイアログが出て。
何かが行われ、正常(?)に立ち上がる。

でも、
再度起動しても、同じ結果。

そして、
インストール中 ~~・ダイアログ の「キャンセル」をクリックしても

なんら変わりはない???


今朝方、WPS Office のアップグレードをしようとしたが、
アップデートプログラムが AVG でブロックされたので、
アップデートは ヤメ た。

だが、
「コントロールパネル」の「プログラムと機能」で見ると、
バージョンは、10.2.0.7646 から、11.2.0.8333 になっていた。


これが、原因かナ?

   Excel 以外の、Word や PowerPoint は問題ないのだが???



若干検索し、
excel2007起動時に、「stdole32.tlb」というエラーが出て・・・
を見つけた。

<紙>は、excel2002 なのだが、
この記事の内容に従ってみようと、
エクセル2007を起動すると”stdole32.tlb”と出るようになった!
を参考にする。


  「subinacl.msi」というファイルをダウンロードしインストールします。


  subinacl.msiのインストールが終わったら、コマンドプロンプトを開きます。
  Windows7の場合、スタートからアクセサリフォルダを開き、
  コマンドプロンプトの上で右クリックし、管理者として実行をクリックします。
  この管理者モードでないと次に行うコマンドが実行できないようです。

  コマンドプロンプトが開いたら、以下のコマンドを入力します。
  そのままコピーして貼りつければOKですが、
  コマンドプロンプトでは貼り付けのショートカット「Ctrl+V」が使用できないので、
  右クリックし貼り付けを選択します。

cd /d "C:\Program Files (x86)\Windows Resource Kits\Tools\"
subinacl /subkeyreg HKEY_CURRENT_USER /grant=administrators=f /grant=system=f /grant=restricted=r /grant=kami=f /grant=restricted=r /setowner=administrators
subinacl /keyreg HKEY_CURRENT_USER /grant=administrators=f /grant=system=f /grant=restricted=r /grant=kami=f /grant=restricted=r /setowner=administrators
subinacl /subkeyreg HKEY_LOCAL_MACHINE /grant=administrators=f /grant=system=f /grant=users=r /grant=everyone=r /setowner=administrators
subinacl /keyreg HKEY_LOCAL_MACHINE /grant=administrators=f /grant=system=f /grant=users=r /grant=everyone=r /setowner=administrators
subinacl /subkeyreg HKEY_CLASSES_ROOT /grant=administrators=f /grant=system=f /grant=users=r /setowner=administrators
subinacl /keyreg HKEY_CLASSES_ROOT /grant=administrators=f /grant=system=f /grant=users=r /setowner=administrators


やってみたが、・・・・・
<紙>の場合は、何の効果も無く、
結果は変わらなかった。



仕方なく、Office XP を丸ごとアンインストールして、

再度インストールしてみたが、これでも、ダメ



仕方なく修復することを諦めた。



本日はここまで。



見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190428,29

FreeBASIC 学習:配列等とインデックス演算子

2019-07-31 :  PCクリニック
改めて、
FreeBASIC マニュアル」(日本語訳版)」で学習。

今回のテーマは、
         ( )[ ]


マニュアルの、左ペイン: 目次
では、

  索引
  ●アルファベット順予約語
  ●機能別予約語
  ●描画予約語
  ●演算子一覧
  ・・・・・
  ・・・・・

とあるので、演算子一覧:FreeBASIC CatPgOpIndex へ行ってみた:

  代入演算子
  型変換演算子
  術演算子
  索引演算子
  文字列演算子
  比較演算子
  論理演算子(ビット単位のブール演算)
  短絡演算子
  プリプロセッサ演算子
  ポインタ演算子
  型とクラスの演算子
  メモリ演算子
  繰り返し演算子



さて、今回のテーマ:

  索引演算子:Indexing Operators
  ・() (配列添え字:Array index)
  ・[] (文字列索引:String index)
  ・[] (ポインタ索引:Pointer index)

  () (配列添え字:Array index)
  配列の要素への参照を返す。
  Returns a reference to an element in an array

Dim A(0 To 4) As Long = { 0, 1, 2, 3, 4 }
' Dim A(4) As Long = { 0, 1, 2, 3, 4 } ' と同じ
For k As Long = 0 To 4 ' ゼロ・オリジン
Print A(k); ' 0 1 2 3 4
Next


  [] (文字列索引:String index)
  文字列の文字への参照を返す。
  Returns a reference to a character in a string

Dim A As String = "Hello, world!"
Dim i As Long
For i = 0 To Len(A) - 1 ' Len(A) は、13(文字数)
Print Chr(A[i]) & " "; ' ゼロ・オリジン、 H e l l o , w o r l d !
Next


  [] (ポインタ索引:Pointer index)
 メモリの指定アドレスから、指定分ずらした位置の、参照を返す。
 Returns a reference to memory offset from an address

Dim A(4) As Long = { 0, 1, 2, 3, 4 } ' 5要素の配列を初期化
Dim p As Long Ptr = @A(2) ' 3番目の要素のアドレス
For k As Long = 0 To 2 ' ポインタ索引を使って、配列の要素を出力
Print p[k]; ' 2 3 4
Next
の様に使う。



序でに(?)
マニュアルの、左ペイン の続き(若干下方):

  実行時ライブラリー

  ●配列関連
  ●ビット操作
  ●実行画面関連
  ●日付と時間
  ●エラー処理関連
  ●ファイル入出力関連
  ●数学関連
  ●メモリ関連
  ●オペレーティングシステム関連
  ●文字列関連
  ・・・・・
  ・・・・・


この文字列関連FreeBASIC CatPgString についても学習:

   MID(関数)
  文字列の中の、一部分の文字列を返す。Returns a substring of a string
Print Mid ("abcdefg", 3, 2)      ' cd    1オリジン
Print Mid ("abcdefg", 3) ' cdefg  終端まで
Print Mid ("abcdefg", 2, 1) ' b


   INSTR
  文字列の中で、部分文字列か文字が、初めて出現する場所を、見つける。
  Locates the first occurrence of a substring or character within a string
Print InStr ("abcdefg", "de")    ' 4を返す 1オリジン
Print InStr ("abcdefg", "h") ' 0を返す 見つからない場合


   MID(命令文)
  文字列の指定桁の部分を、別の文字で、上書き置換する。
  Overwrites a substring of a string with another
Dim text As String
text = "abc 123"
' ----------------   1オリジン
Mid(text, 5, 3) = "456" ' "abc 456" となる  7番目(終端)まで
Mid(text, 5 ) = "123456789" ' "abc 123" となる  終端で打ち切り
Mid(text, 5, 2) = "456" ' "abc 453" となる  指定以上は無視



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190427

FreeBASIC 学習:gsl, The GNU Scientific Library

2019-07-27 :  PCクリニック
以前(2019-07-10)の記事:
FreeBASIC 学習:im モジュール」で書いた、
  ライブラリ・ヘッダー索引:「FreeBASIC ExtLibTOC
を見ると、

  ・・・・・
  ・・・・・
  数学
    GSL - 乱数発生器、特殊関数、最小二乗法のような、
       広範囲の数学的ルーチンを提供します。
  ・・・・・
  ・・・・・

があったので、行ってみた。

  ・・・・・
  ・・・・・
  プログラム例は、GSL ライブラリの使用例のページも参照下さい。
  ・・・・・
  ・・・・・

ここの、

  プログラム例目次

の、
1番目に、

  線形回帰 (37.1)

があったので、「GSL_fit_1D.bas」としてテストしてみた。


但し、最初に見たページに、

  注意:コンパイル時に、下記のエラーが表示される場合:
  FreeBASIC\bin\win32\ld.exe: cannot find -l****
  これは、linker のエラーで、
  ****.a または ****.dll または ****.dll.a が見つからないからです。
  ・・・・・・・・・・
  もしくは、
  ・・・・・・・・・・
  ・・・・・・・・・・
  から該当ファイルをダウンロードして fbc の /lib/win32 に
  ****.a または ****.dll ファイルをコピーします。

とあったので、

  「FB-win32-gsl-1.15.zip」 2014-09-14 付 903.0KB

をダウンロードした。

そして、書庫の中の ~/lib/win32/ にある2つ:

  libgsl.a
  libgslcblas.a

を、取り敢えず持ってきた。


' GSL_fit_1D.bas: gsl_fit.bi 関数を使った線形回帰のプログラム

#Include once "gsl/gsl_cblas.bi"
#include "gsl/gsl_fit.bi"
dim x(4) as double
dim y(4) as double
dim w(4) as double
dim as double c0, c1, cov00, cov01, cov11, chisq
dim as integer i, n=4, s=1
data 1970, 1980, 1990, 2000 ' x data
for i=1 to 4
Read x(i)
next
data 12, 11, 14, 13 ' y data
for i=1 to 4
Read y(i)
next
data .1, .2, .3, .4 ' weight data
for i=1 to 4
Read w(i)
next

gsl_fit_linear (@x(1),s,@y(1),s,n,@c0,@c1,@cov00,@cov01,@cov11,@chisq)
Print using "best fit: y = ####.###### + ####.###### x"; c0; c1
Print " 共分散行列:"
print using " ######.#### ######.#### "; cov00; cov01
print using " ######.#### ######.#### "; cov01; cov11
Print using " chisq = ####.#### "; chisq
'
' ウェイト付き線形近似。データの重みは w() 配列です。
'
gsl_fit_wlinear (@x(1),s,@w(1),s,@y(1),s,n,@c0,@c1,@cov00,@cov01,@cov11,@chisq)
Print
Print "加重版:"
Print
Print using "best fit: y = ####.###### + ####.###### x"; c0; c1
Print " 共分散行列:"
print using " ######.#### ######.#### "; cov00; cov01
print using " ######.#### ######.#### "; cov01; cov11
print using " chisq = ####.#### "; chisq

' 加重版と非加重版の両方で、
' 傾きは .06 で、切片(intercept)は -106.6 になるはずです。

Sleep
確かに、
  best fit: y = -106.600000 + 0.060000 x
   chisq = 0.8000
となった。


GSL が使える。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190423

FreeBASIC 学習:ファイル・アクセス方法

2019-07-24 :  PCクリニック
FreeBASIC の最初(2019-07-06)の記事:
FreeBASIC ってどうかナ?」で書いた、
ドキュメント:
フリー ベーシック (日本語マニュアル) FreeBASIC」サイトの、
左ペインの実行時ライブラリーの「エラー処理関連」で、
ファイルの読み/書き(バイナリ/テキスト)について学習。

dim as long  fb, ft    ' ファイル番号

' バイナリ出力 ---------------------------
fb = FreeFile
Open "tmp1.bin" For Binary As #fb
dim k as long
' 整数配列を作る
Dim BT(1 To 10) As Long
For k = 1 To 10
BT(k) = k
Next
Put #fb, , BT()
Close #fb

' テキスト出力 ---------------------------
ft = FreeFile
Open "tmp2.txt" For Output As #ft
Dim i As Long = 10 ' これは、C の、int ( 32bit )
Dim d As Double = 123.456
Dim s As String = "テキスト"
Write #ft, 123, "テキスト", -.45600
Write #ft,
Write #ft, i, d, s
Close( ft )

' バイナリ入力 ---------------------------
fb = FreeFile
Open "tmp1.bin" For Binary As #fb

Dim buf(0 to 4) As Long ' C の、int ( 32bit ) 配列

for k = 0 to 4
' ファイル番号 "bf" を使って、ファイルから バッファに読込
Get #fb, , buf(k) ' 第2、第3引数:配列添字も 丸括弧
' 結果を印刷
Print buf(k)
next
Close (fb)
for k=0 to 4: print buf(k): next

' テキスト入力 ---------------------------
ft = FreeFile
Open "tmp2.txt" For Input As #ft
Dim ss(1 to 5) As string

for k = 1 to 3
Line Input #fb, ss(k) ' 引数は2つ
' 結果を印刷
Print ss(k)
next
Close (ft)

dim sptr as zstring ptr
sptr = strptr(ss(3))
print *sptr
と云った感じ。


FreeBASIC 言語仕様の備忘録:

  FreeBASIC では、行末を改行コードかコロンで表す。
  このため、C言語のセミコロンのような特別な行末記号は必須ではない。
  改行するまでに複数行のコードを書く場合に、コロンで区切る。

  コメントは行単位のものとブロック単位のものがあり、
  行単位のコメントはシングルクオート (') で開始され、
  ブロックコメントは /' で開始して、'/ で終了となり、
  途中に改行コードがあってもよい。

そして、
  大文字/小文字の区別無し



次に、ファイル・アクセスをC言語流コードで。

上記の日本語ドキュメントから、
左ペインのその他の「C標準ライブラリー関数」の、
ストリーム I/Oに、

  #include "crt/stdio.bi"

とある。


これを記述するダケで使える。
 テキストファイルの入力例:
' C Runtime Library( msvcrt.dll で実行 )
' crt/stdio.bi を使った ストリーム I/O

'' ファイルを開く
'' fopen( filename as zstring ptr, access_mode as zstring ptr ) _
'' as FILE ptr

'' zstring を読む
'' fgets( string1 as zstring ptr, maxchar as integer, _
'' file_pointer as FILE ptr) as zstring ptr

'' ファイルを閉じる
'' fclose( file_pointer as FILE ptr ) as integer

/' --------------------------------------------------- '/
#include "crt/stdio.bi"

dim FILE as any ptr
dim buf as zstring*255

FILE = fopen( "test.txt", "r" ) ''' print FILE

Do
fgets( buf, 255, FILE ) : Mid( buf,len(buf) ) = Chr(0)
print buf
Loop Until feof(FILE)

fclose( FILE )

Sleep



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190418,23

FreeBASIC 学習:ヘッダファイル変換ツール fbfrog

2019-07-20 :  PCクリニック
前回(2019-07-17)の記事:
FreeBASIC 学習:ヘッダファイル変換ツール h_2_bi」では、
h_2_bi.basが何故か使えなかった。


それで、
「FreeBASIC h_2_bi」で更に検索していたら、・・・・・


Creating FB bindings for C libraries - FreeBASIC
を見つけた。

  Creating FB bindings for C libraries

  This page aims to document the problems and solutions commonly
   encountered when creating FB bindings for C libraries.

  In general, FB and C/C++ are very similar.
  FB follows the same ABI as GCC where applicable,
   in order to be binary-compatible as much as possible.
  The language syntax is also similar to C/C++.
  As a result, a lot of type and procedure declarations can be translated
   directly 1:1 between C and FB.
  However, there also are constructs which cannot be translated directly,
  for example: typedefs declaring function types.
  FB has function pointer types, but not plain function types.

   ・The good news: We have tools (fbfrog and h_2_bi) which can do
     most of the translation automatically.
   ・The bad news: There always are some problems which cannot be solved
     automatically and thus need to be fixed manually.

  ・・・・・
  ・・・・・

=====

  Cライブラリ用のFBバインディングの作成

  このページは、Cライブラリ用のFBバインディングを作成するときによく
   遭遇する問題と解決策を文書化することを目的としています。

  一般に、FBとC / C ++はよく似ています。
  可能な限りバイナリ互換にするために、
   FBは、該当する場合はGCCと同じABIに従います。
  言語構文もC / C ++に似ています。
  その結果、CとFBの間で多くの型と手続きの宣言を
   直接1:1に変換できます。
  ただし、直接変換できない構造体もあります。
  たとえば、typedefは関数型を宣言します。
  FBには関数ポインタ型がありますが、普通の関数型はありません。

   ・良いニュース:ほとんどの翻訳を自動的に行うことができる
     ツール(fbfrogとh_2_bi)があります。
   ・悪いニュース:自動的に解決できない問題が常にあり、
     手動で解決する必要があります。

  ・・・・・
  ・・・・・



  上記の fbfrog リンク:「Board index > FreeBASIC > Projects
に行くと、

  fbfrog header translator
   by dkl > Oct 22, 2011 1:53

  github.com/dkl/fbfrog

  fbfrog is a command line tool that reads *.h files (C API declarations)
   and generates a corresponding *.bi file (FreeBASIC API declarations).
  It's intended to automate most of the work needed to create and
   maintain FB bindings for C libraries.
===
  fbfrogは、*.hファイル(C API宣言)を読み込み、対応する * .biファイル
   (FreeBASIC API宣言)を生成するコマンドラインツールです。
  これは、Cライブラリ用のFBバインディングを作成および維持するために必要な
   作業の大部分を自動化することを目的としています。

とあったので、
  github.com/dkl/fbfrog
にいった。

そこで、緑色の[Clone or download]ボタンで、
  「fbfrog-master.zip」2017/12/11 付 692KB
をダウンロードして、

 /src/ 内のファイルのみ 44ヶと、
 /include/fbfrog/ 内3ファイル(これはイラナイ?)
で、

  fbc *.bas -m fbfrog

として、「fbfrog.exe」を作った。


出来たfbfrog.exeを使って、

  fbfrog cv2.h

とすると、「cv2.bi」が出来た。



そこで、

生成された .bi ファイルを確認



この「cv2.h」の場合では、

  [ 1/23] linux-x86
  ・・・・・
  [23/23] dos
      cv2.h
  emitting: cv2,bi (30 declarations, 1 TODO)

だった。


「cv2.bi」の中身を見ると、

  TODO が1つあった。 ← これは取り敢えずコメントアウトした。


他に、

  予約語となっている(?) type が変数名に使われているので変更した。


更に、

  #if があったので、この辺りもコメントアウトした。


そこで、
今変換できた「cv2.h」を使って、
前々回(2019-07-13)の記事:
FreeBASIC 学習:OpenCV 使えた」で書いたコードを、
書き直してみた:
#include "cv2.bi"           ' fbfrog で変換し、手直ししたもの

#inclib "opencv_world300" ' リンク用にコピー
' ---------------------------------------------
dim img as CvMat ptr
dim as long xx, yy
dim B as ubyte ptr

img = cvLoadImageM( "test.tif", 0 ) ' 0 : GrayScale で読込む

yy = img->yy: xx = img->xx: B = img->Byte

print yy, xx ' 行数、列数
print *B, *(B+(xx-1)), *(B+(xx*(yy-1)+xx-1)) ' 画素値3つ
これで動いた。
OKダ。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190422

FreeBASIC 学習:ヘッダファイル変換ツール h_2_bi

2019-07-17 :  PCクリニック
C言語のヘッダファイル(~.h)を、
FreeBASICの「~.bi」に変換するツールは?

と云うことで、

「FreeBASIC bi convert header」で検索してみた。


いろいろ漁った結果、
やっとのことで、
h_2_bi.bas, a tool for translating .h files into .bi
が見つかった。


そこで、
「h_2_bi.bas」と kinza で検索したが、何故か見つからない?

Firefox で Google 検索「h_2_bi.bas」で何とか見つかった。

ドイツ語のサイト:
h_2_bi.bas (SWIG-Alternative, Version 0.2.8.2) - FreeBASIC-Portal


ここから、ダウンロード:ZIP-Archiv (55 kB)

つまり「141003_h_2_bi-0.2.8.2.zip」 2014.10.03 付 54.8KB


ドイツ語の説明(翻訳結果):

  h_2_biはC言語のヘッダファイルをFreeBasicプログラミング言語用の
  (バージョン0.2.1以降も)いくつかのヘッダファイルに翻訳できるツールです。
  目標は、FreeBasicの下でCで書かれたライブラリを使えるようにすることです。
  GTK +、sqlite3、DisLin、ZBar、cairoなど。

  h_2_bi.basはコマンドラインツールのソースコードです。
  最初にfbcでコンパイルする必要があります。
  ツールは設定ファイル(拡張子.h2bi)によって制御されます。
  外部リンク!Geanyは、グラフィカルユーザーインターフェースまたは
  IDEとして推奨されています。

  コマンドラインから起動すると、h_2_biは常に各制御ファイル(* .h2bi)
  に対して正確に1つの結果ファイルを生成します。
  これは作業フォルダに作成されます。
  制御ファイルの名前の後に、拡張子「.bi」が付きます。
  この結果ファイル(FBヘッダー)には、翻訳の結果、
  およびコメントとしてのCソーステキストが含まれているだけでなく、
  翻訳プロセスで発生した問題に関するコメントも含まれています。
  変換プロセス(および結果ファイルの内容)はカスタマイズ可能で、
  オプションを使用して(コマンドラインまたは制御ファイルで)設定できます。

  これは対話的に使用するためのツールであり、
  通常は翻訳プロセスの過程で数回呼び出されます。
  中間結果はfbc(FreeBasicコンパイラ)でチェックされます。
  h_2_biは、(まだ)Cヘッダーで発生する可能性のある
  すべての構造を変換することはできません。一定量の手作業が残ります。
  h_2_biは、確実な翻訳を最初から確実にし、
  未翻訳の文書を手動で後処理できるようにすることを目的として開発されました。

  h_2_biは “ダム”翻訳者です。型チェックは行われません。
  未定義の変数またはシンボルは変換プロセスを停止しません。
  この概念の利点は、不完全または不完全な入力ファイルでも、
  結果ファイルが常に生成されることです。
  結果の品質は、h_2_biが制御ファイルによってどの程度適切に
  パラメータ化されているかによって異なります。
  これには、FreeBasicおよびC SOURCEのテキストに関する背景知識に加えて、
  h_2_biを扱う際のちょっとした練習が必要です。

  h_2_biはコマンドラインプログラムとして使用されるだけでなく、
  IDE Externer Link!Geanyのユーザー定義モジュールとしても使用できます。
  このIDE内では、h_2_biはボタンを押すだけで、
  マークされたブロックCのソースコードを変換されたFreeBasicのソースコードに
  置き換えることができます(詳細はReadme.txtを参照してください)。

  さらなる情報は外部リンク english forum の議論で見つけることができます!

  zipアーカイブには以下が含まれています。
    ファイル      説明
   ReadMe.txt    情報とチュートリアル
   LiesMich.txt   情報とドイツ語のチュートリアル
   changelog.txt   変更の年表
   example.h2bi   設定ファイルの例
   /src       folder with source code (compile h_2_bi.bas)

  頑張って結果を共有しましょう。



下の方に英語訳が載っていた(汗;



何はともあれ、h_2_bi.bas を試してみた。

コンパイル、リンク
そして、実行。・・・・・

何故か、2GB 超 エラー?????
動か無い!




本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190421

FreeBASIC 学習:OpenCV 使えた

2019-07-13 :  PCクリニック
前回(2019-07-10)の記事:
FreeBASIC 学習:im モジュール」で、
取り敢えず、画像ファイルのアクセスに成功した。

でも、本命(?)は OpenCV が利用できることか?


何とかして出来ないかと学習した。

(1)構造体(struct)の定義方法
(2)共用体(union)の定義方法
(3)ヘッダファイル(biファイル)の定義方法

そして、
以前(2016-02-23)書いた記事:
GSL Shell 学習:OpenCV 使えそうダ?」に出てくる、
「opencv_world300.dll」を使って、
コーディングしてみた:

'----- 「cv2~.bi」 相当:
Type CvMat ' 構造体定義(Type)の方法。Struct じゃない
type as long
step as long
refcount as long ptr
hdr_refcount as long
Union ' Union の定義方法。
Byte as ubyte ptr
Char as byte ptr
Word as ushort ptr
Long as long ptr
Dbl as double ptr
End Union
Union
yy as long
rows as long
End Union
Union
xx as long
clos as long
End Union
End Type

declare function cvLoadImageM alias "cvLoadImageM" _
( byval fnam as const zstring ptr, byval color as long ) _
as CvMat ptr
' alias は必要。 @ 付問題に対処

#inclib "opencv_world300" ' リンク用にコピーした
' --------------------------------------------------

dim img as CvMat ptr
dim as long xx, yy
dim B as ubyte ptr

img = cvLoadImageM( "test.tif", 0 ) ' 0 : GrayScale で読込む

yy = img->yy: xx = img->xx: B = img->Byte

print yy, xx ' 行数、列数
print *B, *(B+(xx-1)), *(B+(xx*(yy-1)+xx-1)) ' 画素値3つ
これで動いた。
OKダ。


補足事項
 @ 付問題とは、

リンカで以下の警告メッセージが出る。
Warning: resolving _cvLoadImageM@8 by linking to _cvLoadImageM
Use --enable-stdcall-fixup to disable these warning
Use --disable-stdcall-fixup to disable these fixups

でも、エラー・レベルでは無いので、「~.exe」は出来て、動く。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190420

FreeBASIC 学習:im モジュール

2019-07-10 :  PCクリニック
前回(2019-07-06)の記事:
FreeBASIC ってどうかナ?」で導入した、
FreeBASICのインストール場所を見ていたら、

~/FreeBASIC/inc/ に、「im」フォルダがあり、
その中に、ヘッダーファイル:im.bi があった。

ひょっとしたら、
GSL Shellに取り込んだ DLL ファイル:
~/gsl-shell/ に置いた、im.dll
  ( 参考「GSL Shell 学習:IM はどうか?」)
を使って、
画像ファイルのアクセスが出来るのでは?
と思った:

こんなコードでテストしてみた:
#include "im/im.bi"   ' これは、システムにあり
#inclib "im" ' これは持ってきた dll

dim pp as any ptr
dim as long y, z, xx, yy, cm, dt

pp = imFileOpen( "test.tif", @y )
' print pp, y ' *****, 0 確認用

z = imFileReadImageInfo( pp, 0, @xx, @yy, @cm, @dt )
print xx, yy, cm, dt ' **, **, 1026, 0 確認用

dim B(yy*xx) As UByte

z = imFileReadImageData( pp, @B(0), 0, -1 )
print B(0), B(xx-1), B(yy*xx-1)
' 左上、 右上、 右下   確認用
これで動いた。
OKダ。



前回記事の中で書いた、
フリー ベーシック (日本語マニュアル) FreeBASIC
サイトの、
左ペイン(の下の方)にある:
  その他 の、

  ライブラリ・ヘッダー索引:「FreeBASIC ExtLibTOC

は、要学習ダ。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190419

FreeBASIC ってどうかナ?

2019-07-06 :  PCクリニック
先月(2019-06-12 )に書いた記事:
D 言語ってどうかナ?」から、
少々 D 言語について、学習(?)してみたが、・・・・・

イマイチしっくり来ない。


そこで、
再び「フィボナッチ数だけで40以上のプログラム言語に精通したつもりになる
サイトに行ってみた。


順位 3(タイ) に、言語 Basic (fbc -O3) がある。

「FreeBASIC D言語」検索で、
FreeBASIC poseidonFB」が見つかる。

  このページは、台湾の Kuan Hsu(YungKuan Hsu 許 永寬)さんが開発継続している
 FreeBasic IDE-poseidonFB (Linux と Windows で動作)の紹介です。

 FreeBASIC IDE-poseidonFB は、プログラミング言語 D と IUPフレームワークを
 使ってコーディングされています。

 2016年10月時点で「これはまだ初期のベータ段階ですが、使えます。
 楽しんでみてください!」と書かれています。

 PoseidonFBのサポート:
 1. 構文ハイライト
 2. プロジェクト・マネージャ
 3. 自動補完と書式ポップアップ(Calltip)
 4. 関数 / 型 / 変数 ... ツリー表示
 5. 検索 / 置換 (文書やプロジェクトで)
 6. definition へのジャンプ
 7. Utf-8/16/32 デコード&エンコード
 8. デバッグ
 9. コンパイル / クイック実行 / プロジェクト構築
 10. その他 ......

 ・・・・・
 ・・・・・

とある。


そう云えば、その昔:
9年前(2010-01-13)に、「FreeBASIC 使用始め?
を書いていた。

もっと前 11年前(2008-07-03)の記事:
PIC(13) GCBC」でも触れている。(汗;


そう云うわけで(なんのコッチャ)

FreeBASIC に(再びの)チャレンジ。


本家サイトは、
FreeBASIC Language - Home」ですね。

  「Get FreeBASIC」 と云う緑色の大きなボタンから、

「Download Latest Version / FreeBASIC 1.06.0-win32.exe(11.3MB)」
と云う緑色のボタンを見つけたが、これは「~.exe」

調べてみると、
フリー ベーシック (日本語マニュアル) FreeBASIC」サイトの、

左ペインの、
「FreeBASIC コンパイラを使う」にある
 「FreeBASIC をインストール」リンクから、

「FreeBASIC-1.06.0-win32.zip」 2019-02-17 付 19.9MB
そして、
「FBEdit」も序でにダウンロードした。


例によって、
「D:/TOOL/FreeBASIC/」に展開し、
作業用に「E:/~/_FreeBASIC/」を作った。


取り敢えず
「set_FB_path.bat」:
  set PATH=%PATH%;D:\TOOL\FreeBASIC
を作って、パスの設定。
コンパイルは、
  fbc hoge.bas
ですね。
そして、最適化では、
  fbc -O 3 hoge.bas
注意: ^^ ^ ( -O と 3 ) は離すコト。

で、1本コーディング:
/' ========== time_test.bas ========== '/
'処理時間計測
#include "vbcompat.bi" 'Now を使えるようにする

Dim TimeStart As Double
Dim TimeEnd As Double

TimeStart = Now ' 開始時刻を変数に格納。
Sleep (1000)
TimeEnd = Now ' 終了時刻を変数に格納。

Print ( TimeEnd - TimeStart ) * 100000 ' これで、1.1574
といった感じ???


ざーっと確認したところでは、

大文字/小文字の区別無し:要注意点。
GOTO 文あり。( GOSUB 文もあり。 )
CONTINUE も、EXIT ( break 相当 ) もあり。
ヘッダー ファイルは、「~.bi」。



本日はここまで。


FreeBASIC 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190418

人気blog Ranking/おきてがみ


おきてがみ
最新記事
カレンダー
08 | 2019/09 | 10
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク