TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
クロージャって何がいいの?
Visual Studio Code / VSCode Part7
将来性ないプログラミング言語。Delphi含まれず安心
Excel VBA 質問スレ Part61
Android開発質問スレ
Javaはもう死んだの? Part.2
Excel Python 質問スレ
Xamarin Part6
関数型プログラミング言語Haskell Part32
【計測】LabVIEW相談室【制御】

【QBASIC互換!?】FreeBasic【GPL】 2


1 :2016/12/24 〜 最終レス :2020/06/13
FreeBasic
ttp://www.freebasic.net/

建てたいって人がいたので勝手に建てた
後はご自由にどうぞ
俺は知らん
過去スレ
http://echo.2ch.sc/test/read.cgi/tech/1139379786/

2 :
現在 Declere 文75KB,
””内外で処理が異なる例を見つけた。
「:」、
””外では、Visual Basic では、半角空白が1文字追加され、文の切れ目の意味を持つ。
””外では、Windows では、デバイスの末尾の文字でルートディレクトリーを示す。
前者に慌せて、一律空白を入れてしまうと、ファイルに全くアクセスできなくなるという状態に陥る。

サブルーチン内で値を変更している引数を一括して、ByRef 引数に書き換えるべく、
解釈ルーチンを作っているのだが、大文字と小文字を区別しないということが、漢字コード゛の存在下でかなり面倒くさい処理になってしまっている。

3 :
http://makoto-watanabe.main.jp/freebasic/PgIfthen.html
にあるように
IF NOT (なんだら) Then
の代わりの
IF (なんたら) ELSE
文がFreeBasic では使えない。
V.B.でIF ELSE 文を使っていた人は要注意。

4 :
http://video.fc2.com/content/20161231knmREYEX

5 :
現在 Declere 文81KB,まもなく900行となる。
Function文からの引き抜きルーチンがうまく動いているようで、Function 文に間違いがなければ、何とか動いてくれている。

問題は引数検査。
命令語の右側の値を定義する命令が今のところ見つかっていないので、
例 機械語の INC AL 等
「=」を見つけて、左側の変数が定義される、として処理したまでは良かった。
問題は関数
適当な関数(変数,,,,)
で、変数を定義する場合があることに気が付いた。

引数の入出力チェックは今のところで来ていない。
引数の値を定義しないByValと定義するByRefの検査ルーチンが今のところ作成不能。

6 :
複数モジュール(ファイル) AAA.BAS, BBB.BAS, CCC.BAS があったとする。
お互いに、他のファイルの関数を参照していると、他の関数の参照関係(ByValかVtRefか)が決定されないと自分の参照関係がわからない。

ループや振り子現象にどう対応するか、
ループや振り子現象になるようなルーチンをどうやって発見するか、
が問題となる。これの見通しが立っていない。
発見できれば、別ファイルにして一つにまとめると、
同一ルーチン内のループや振り子現象になるので、処理が楽になる(一律ByRefとする)。

今現在は、大文字小文字を区別せずに整列して、昇順に処理しているけど
これを参照する他のファイル数の少ない順に処理してゆく
もし、参照関係を変更したら、遡って処理しなおすという方法で避けられるから。
その代り、処理時間がやたらかかることになる。
a,b,c,dとあったときに、Dが他のファイルを参照していない独立なファイルならば、最初に参照関係を調べる。独立なファイルをまず調べる。
次に、Dだけ(独立しているファイルだけ)を参照しているファイルをみつけて、このファイルだけ処理する、
というようにやってゆく。
ファイルが内容だけで分類する(たとえば、ファイル操作、ファイル名操作、ディレクトリー操作等の分類)のではなく
他のファイルの内容を参照しているか否かの分類も必要になってくる。

これが今のところ分からないでいる。
というのは、以前は、Call 文を検出するだけで、参照することを発見できたが
Call文が使えなくなって、参照している(配列ではない)ことを検出する方法が見当つかない。

Call 文とかLET文とか、結構使い道があった。

7 :
hosyu

8 :
>>6
>Call 文とかLET文とか、結構使い道があった。

'$lang:

9 :
>>6
>Call 文とかLET文とか、結構使い道があった。

'$lang:"fblite"
とすると、Call 文、LET文が使えるようになります。
http://makoto-watanabe.main.jp/freebasic/CompilerDialects.html
試してみては、いかがでしょう。

10 :
>>8-9 それ絶望的。現在
ライブラリーの総ファイル数約100。
内、FreeBasic 要に書き換えた
ファイルが約40、
局所ルーチン 53
大域ルーチン 646
と合計700のルーチンがある。100位は、FreeBasic用に新規に作成したもの。
例 Function (適当)(IAA As Long)の他に、AS Integer, As Byte 等FreeBasic で新規に作られた変数型対応。

これを全部 Call文に書き換えて、、、というのは絶望に近い。

なお、引数を伴わないFunction 文に関しては、無意味な引数をつけることで、引数なしの場合を想定しないで済むようにしている。
もう少し使い方になれたから、自己書き換えルーチンの作り方がマシになって、ある程度の自由な操作が可能になるだろう。

11 :
参照関係を調べる時に使うルーチン
Public Function RoutineImmediateStringCat(InLineString As String, OutLineString As String) As Long
'*-* 即値 の文字列をヌルに書き換える
Dim As String BString
'Dim As String CH22String
Dim As Long IAA, IBB, iModeLong
RoutineImmediateStringCat = 0
iModeLong = 0&: 'CH22String = Chr$(&H22)
OutLineString = ""
For IAA = 1& To Len(InLineString)
BString = Mid$(InLineString, IAA, 1): IBB = Asc(BString)
Select Case iModeLong
Case 0&
If (IBB = &H22) Then
iModeLong = 10&
OutLineString = OutLineString + BString
Else
OutLineString = OutLineString + BString
End If
Case 10&
If (IBB = &H22) Then
iModeLong = 0&
OutLineString = OutLineString + BString
End If
End Select
Next IAA
End Function

12 :
>>11 のつづき。
自己書き換えルーチンの場合に、目印とする行が即値で定義されている場合が多い。
即値を目印と勘違いするルーチンとなる場合があるので、即値を消す作業を行う。

13 :
ロボッチチェックに引っかかってちょっと分割する。
Public Function RoutineCommentLineCat(InLineString As String, OutLineString As String) As Long
Const TakaSubRoutineNo as long = 21&
'*-* コメント行をヌルに置き換える

Dim As String BString
'Dim CH22String 大域
Dim As Long IAA, IBB, iModeLong

RoutineCommentLineCat = 0
'CH22String = Chr$(&H22)
OutLineString = Trim$(InLineString)
If (Left$(OutLineString, 1&) = "'") Then
OutLineString = ""
ElseIf (InStr(OutLineString, CH22String) <= 0&) Then
IAA = InStr(OutLineString, ": '")
If (IAA > 0&) Then OutLineString = Left$(OutLineString, IAA - 1&)
IAA = InStr(OutLineString, " '")
If (IAA > 0&) Then OutLineString = Left$(OutLineString, IAA - 1&)
OutLineString = Trim$(OutLineString)
If (Right$(OutLineString, 1) = ":") Then OutLineString = Trim$(Left$(OutLineString, Len(OutLineString) - 1&))

14 :
ElseIf (InStr(OutLineString, "'") <= 0&) Then
Else
iModeLong = 0&
For IAA = 1& To Len(OutLineString)
BString = Mid$(OutLineString, IAA, 1)
IBB = Asc(BString)
Select Case iModeLong
Case 0&
If (IBB = &H22) Then
iModeLong = 10&
ElseIf (BString = "'") Then
OutLineString = Left$(OutLineString, IAA - 1&)
Exit For
End If
Case 10&
If (IBB = &H22) Then
iModeLong = 0&
End If
Case Else
'障害
End Select
Next IAA
OutLineString = Trim$(OutLineString)
If (Right$(OutLineString, 1) = ":") Then OutLineString = Trim$(Left$(OutLineString, Len(OutLineString) - 1&))
End If
End Function

15 :
>>13-14はコメント行を消す作業。コメント行か実行文か判断は面倒なので、
一括して消してしまう。
この2つのルーチンが主要なもので、他には、連続した空白の削除、TAB文字を空白に書き換える等の処理が必要。
こっちは比較的簡単なので、すぐ作れると思う。
Function 文で定義したルーチンの場合、
先頭が1文字目にある場合、戻り値を使わない場合の参照方法。
戻り値を使う場合には、先頭文字の直前(左側)が、演算子の場合が多い。
ということで、演算子であるかのチェックが必要。その他、()や空白、TAB文字等も演算子とみなして処理する。

なんとか、どのファイルの内容を参照しているか、を一覧表で表す見込みが立った。

16 :
>>5
「=」を見つけて、左側の変数が定義される、として処理したまでは良かった。
例外が見つかってしまった。
Abool = (Along = Blong)
Abool = TekitoBool(Along = Blong, (適当な引数))
論理演算子「=」の取り扱い。
Fotran でなぜ .EQ. を使っていたのかわかるような気がした。

17 :
>>8-9 を受けて、Function 文から Sub 文への変更の可能性について検討を始めた。
と言っても、自己書き換えルーチン用。
Function 文指定ルーチンのうち、Subroutine に書き換え可能なルーチンは、戻り値が一定値ある必要がある。
参照する必要性がない値を返す場合に限られる。混乱を避けるために専用の型を用意した。
Type Wata As Long
綿は、C:\FbEdit\ や C:\tool\FbEdit\ 内 *.BIファイルに使われていないし、http://www.freebasic.net/ 内にも発見できなかったから、今後使われる見込みがないと見当がつく。
変数型、Wata を指定した。
Public Function taka00_CommonStringSet(ByVal hWin As HWND) as Wata
のように、CALL 文参照可能なサブルーチンは、戻り値の型を綿とした。
今度は、サブルーチン内で、
taka00_CommonStringSet = 0
という定義以外の定義があるルーチンは、別の型にしなければならない。
前スレでは、戻り値に障害メッセージ番号を返すように、という指摘があった。
返すようにルーチンを作ったものもあるが、せいぜい数十個ぐらいで数が少ないので、
以前のように、
外部出力として障害を積み上げてゆく(Fotran の Write (4, *) システムコンソールへの障害情報表示)か
障害があってもそのまま強行してしまうか
ある期間障害の発生個数を記録して、読み出せるようにするか、
どれを選択するか、迷っているところ。

余計なルーチンである、との指摘を受けて、Function WriteLibErrMes() 処理系を省いてしまったので、
再度、付け足すか、する必要がある。

18 :
Declare Function なんたらだけを記載している
TakaCom1.BI
の作成ルーチンで、ちょっと集計を取ってみた。
'簡易障害の発見件数(Function 文) (障害数)/(戻り値総数)/(引数総数)
'%%:01'  可変長文字変数 の末尾が String 以外の末尾を使っている箇所 (1) : 21/ 147/ 970
'%%:02'  符号付32Bit整数変数 の末尾が Long 以外の末尾を使っている箇所 (2) : 0/ 36/ 817
(中略)
'%%:16'  論理変数 の末尾が Bool 以外の末尾を使っている箇所 (16) : 0/ 21/ 13
'%%:28'  草型変数 を引数として使っている箇所 : 0/ 5/ 0
'%%:29'  綿型変数 を引数として使っている箇所 : 0/ 529/ 0
'%%:30'  その他型変数 を引数として使っている箇所 : / 0/ 0
と、引数に値を返している場合に、末尾に String 等をつけて区別している。
草型変数 As Xusa は、前スレで指摘があった障害メッセージを返す場合。
綿型変数 As Wata は常に定数( = 0)を返す場合。
その他変数は、ルーチンの間違いがあって、なんたら() As Long なんて引数が存在しない場合がここに該当する。
ルーチン名の末尾に問題がある場合、ルーチンの総数、引数の型の総数の3つを集計した。
'%%:30'等は、ルーチン名に問題があった時に、この番号をつけて、ルーチン名を出力する。
Function 文がそのまま出力されているので、エディタで修正するときに使う。

もう一つが
ファイル別 大域 局所 不明 ルーチン数
Taka00.bas 16 1 0
(中略)
Taka35E.bas 8 8 0
合計 679 68 11 758
ファイル名、Public Function 、Private Function 、Function の集計。
合計 758個のFunction文があり、このような調子で使っていることを示している。
単なる Function 文のルーチンは、ほとんどが動作試験用のルーチン。

19 :
引数無しのルーチンが解釈できないというバクがあるのでこんなのも作ってみた
Function Tekito As Bool
Tekito = 0
End Function

Function Tekito2() As Long
Tekito2 = 0
End Function

Public Function Tekito3 As Bool
Tekito3 = 0
End Function

Public Function Tekito4() As Long
Tekito4 = 0
End Function
解釈できなくても、良いんじゃないかな、という手抜きをする心境。
自分の作ったソフトで解釈できない、難解な処理ルーチンは使わなければよいから。

20 :
虚数演算は、皆さんはどのように作ってますか?。
V.B.用ルーチンを転用したら、見事に文法エラーが発生した。
'複素数(虚数)計算
Type Conplex
RealPart As Double
ImagPart As Double
End Type

Public Function ConplexAdd(CA As Conplex, CB As Conplex) As Conplex
Const TakaSubRoutineNo as long = 2&

'Cadd = CA + CB
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
ConplexAdd.RealPart = CA.RealPart + CB.RealPart
ConplexAdd.ImagPart = CA.ImagPart + CB.ImagPart
End Function

21 :
>>20
>>Conplex
複素数はComplexでしょ

>ConplexAdd.RealPart
>ConplexAdd.ImagPart
アクセス演算子(「.」や「->」)の使い方が間違っている
何故に関数名からアクセス演算子が伸びるのよ?
メソッドチェインしているならともかく

>虚数演算は、皆さんはどのように作ってますか?
普通にクラス作って、必要なメンバーを定義しているよ
非メンバーの算術演算子も別途オーバーロードしているよ

>V.B.用
恐らくVB6の事だと思うけど、.NetのVBもあるのだからきっちりバージョンを書いた方が良いよ
同じBASICだからといって、言語仕様が全く違うのだから文法エラーになるのは当然
FBはQBASICとの互換モードがあるBASIC系言語ってだけで様々なBASIC構文を網羅しているわけじゃないよ
分かっていると思うけれども一応ね

-lang fbにはクラスとしてのユーザ定義型(type ... end type)があるのだから
構造体としてのユーザ定義型ではなく、OOPのクラスとして定義するべきだと思うよ

22 :
>>20
type Complex
private:
_real as double
_imag as double

public:
'' member functions.
declare const property Real() as double
declare property Real(byval value as double)
declare const property Imag() as double
declare property Imag(byval value as double)

declare operator +=(byref value as const Complex)
end type

'' non-member operators.
declare operator +(byref lvalue as const Complex, byref rvalue as const Complex) as Complex

こんな感じ
勿論、コンストラクタ、デストラクタ、その他のメンバー関数など
必要なものは定義しているよ

23 :
>>21-22 よくわかんないけと゛、Type 命令文関係を見てみます。

虚数演算と同じファイルに放り込んでおいたのが、整数演算。
'http://rucio.a.la9.jp/main/Samples/vbsample042.htm
で見つけた内容をコピーしただけのルーチン(何やっているのかわからなかった)がいくつか。
で、問題は
Function LCM(ParamArray Values() As Variant) As Long
の「ParamArray 」、の部分。これに対応できるらしい命令が
Function Overload 系処理。
http://makoto-watanabe.main.jp/freebasic/TutFunctionOverloading.html
http://makoto-watanabe.main.jp/freebasic/PgFunction.html

Declare Function AAAA OverLoad (InA1 As Long, InA2 As Long, InA3 As Long) As Long
Declare Function AAAA OverLoad (InA1 As Long, InA2 As Long) As Long
Declare Function AAAA(InA() As Long) As Long

と、OverLoad 句のついている Declare を先に、ついていないDeclare文を後ろにと、並べないとエラーになる。
間に別の名称の文を入れても解釈してくれるみたい。
Declare Function AAAA OverLoad (InA1 As Long, InA2 As Long, InA3 As Long) As Long
Declare Function AAAA OverLoad (InA1 As Long, InA2 As Long) As Long
Declare Function BBBB(InA() As Long) As Long
Declare Function AAAA(InA() As Long) As Long

24 :
>>23
独自に定義した関数をオーバーロードする設計なら「全て」の同名関数にoverloadは付けるべき
複数のヘッダファイルに同名関数のオーバーロード宣言を書いた時
インクルード次第で多重定義のエラーになる可能性がある
更にその関数にはオーバーロードされた関数が別に存在することが分かる

>内容をコピーしただけのルーチン(何やっているのかわからなかった)がいくつか。
褒められたものじゃないなあ
最小公倍数のアルゴリズム位は理解しておこうよ

25 :
>>24 最小公倍数、最大公約数を求めることはできるのだが
http://ameblo.jp/sakai-futabajuku/entry-12108035056.html
に示された方法が理解できない。
覚えている方法は、素数表と簡易除算
http://ameblo.jp/sakai-futabajuku/entry-12108035056.html
を覚えて、出題範囲の関係で 11,13,17,19 の2乗を覚えて
手計算でやる方法しか理解できない。こんな感じ
  12 24
2   6 12
2   3  6
3   1  3
区切り線は略。
縦に 2*2*3 = 12 が最大公約数
さらに横をかけて、2*2*3*1*3 = 36 が最小公倍数
素数表がなくて、役数を積んでないので、わからない。
なお、自作した多倍精度ルーチンでは、約数と残りをもとめて、作ったけど
既約か可約かの判断に1000桁ぐらいの数で1回5秒ぐらいかかる。
高速化したいがこれもわからないでいる。

26 :
>>25
整数a, bの最小公倍数をLCM(a, b)とし、最大公約数をGCD(a, b)すると
整数a, bの最大公約数と最大公倍数の積が整数a, bの積に等しいという定理から
LCM(a, b) = a * b / GCD(a, b)
となる
>>23のリンク先の関数は、n個の整数の最大公倍数LCM(n1 , n2 ...) を求める関数
単に上記をn個分ループしているだけ

上記の定理の証明が知りたいならググってくれ、幾らでも見つかる

27 :
>>25
最大公約数は「ユークリッドの互除法」でもググってくれ

28 :
>>26
ありゃ記述間違えてるわ

>n個の整数の最大公倍数LCM(n1 , n2 ...) を求める関数
n個の整数の最小公倍数LCM(n1 , n2 ...) を求める関数

こうね

29 :
>>27 最大公約数は「ユークリッドの互除法」
なら、わからない理由が分かった。
「ユークリッドの互除法」を高校1年目にやったんだけど、何が何だかわからない。
んで、他の教科もわからなくなって、高校中退したんだわ。

高校中退の原因の一つが「ユークリッドの互除法」。今は昔。
整数問題がよくわからなくて、結局、公式を使わないで定理から力技で無理やり計算する日々。

30 :
>>29
えっと、プログラマに求められるのは「何故そうするのか?」ではなく
「それをどのようにするのか?」であるわけよ

>>24でアルゴリズム位は理解しておこうよって言ったのは
数学的証明や理論の理解ではなく、方法論の話
つまり端的に言うなら、検索、実装、検証が出来ればコードは書けるのよ
勿論、そこに「何故そうするのか?」と考証が入るのが良いけれども

で、最小公倍数や最大公約数を実装するに辺り、目の前の便利な箱を使うわけだよ
そうしたらユークリッドの互除法なんて真っ先に辿り着く情報でしょ
その実装なんてちょっとした頭の体操程度の物で
悩むにしても再帰処理にするかループ処理にするか位でしょ
ユークリッドの互除法は単なる除算(剰余)の繰り返しだよ?
modとwhileか、modとifがあれば実装できるんだよ
複雑な公式を使うことなんて無いんだよ

プログラミングは、数学的証明をしているわけじゃないんだよ
実際に動作する組み合わせをするだけで、その大前提である検索をして実装方法を吟味しなさいよ
他人のコードをコピペしてるだけじゃプログラミングは上手くならんよ

学歴云々の前に、検索しない事に真剣にびっくりだわ

31 :
>>26
>整数a, bの最大公約数と最大公倍数の積が整数a, bの積に等しいという定理から
いかんな、ここも記述間違えているわ

整数a, bの最大公約数と最小公倍数の積が整数a, bの積に等しいという定理から
こうね

32 :
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95
ユークリッドの互除法

このサイトの画面右側の絵の変化、なんとなくいい味だしてるよ。

33 :
>>23 つづき。
Declare Function IniFileRead OverLoad(FileString As String, SecNameString As String, KeyNameString As String, ByRef KeyValString As String) As Wata
(一致部分略), ByRef KeyValLong as Long) As Wata
, ByRef KeyValDouble As Double) As Wata
, ByRef KeyValShort As SHORT) As Wata
, ByRef KeyValSingle as Single) As Wata
, ByRef KeyValByte As Byte) As Wata
, ByRef KeyValInteger As Integer) As Wata
, ByRef KeyValLongint As Longint) As Wata
, ByRef KeyValLong as ULong) As Wata
, ByRef KeyValShort As USHORT) As Wata
, ByRef KeyValByte As UByte) As Wata
, ByRef KeyValInteger As UInteger) As Wata
, ByRef KeyValLongint As ULongint) As Wata
, ByRef KeyValString As ZString) As Wata
, ByRef KeyValString As WString) As Wata
Declare Function IniFileRead OverLoad(FileString As String, SecNameString As String, KeyNameString As String, ByRef KeyValBool As Boolean) As Wata
と宣言して、
BString =DataKeyName + str$(ICC)
TakaDammyReturnCode = IniFileRead(SoseFileListFile, DataEriaSecName, BString, CString)
TakaDammyReturnCode = IniFileRead(SoseFileListFile, DataEriaSecName, DataKeyName + str$(ICC), SoseFileList(ICC))
と参照したら
..\Kako02\Mod\Taka05.bas(3439) error 97: Ambiguous call to overloaded function, INIFILEREAD() in 'TakaDammyReturnCode = IniFileRead(SoseFileListFile, DataEriaSecName, BString, CString)'
..\Kako02\Mod\Taka05.bas(3440) error 97: Ambiguous call to overloaded function, INIFILEREAD() in 'TakaDammyReturnCode = IniFileRead(SoseFileListFile, DataEriaSecName, DataKeyName + str$(ICC), SoseFileList(ICC))'
とエラーになった。
内容を調べていない。
使わない(使い方がわからない)変数型を消してみてどうなるか、
面倒だと思ったらば、Overload化をやめて元の状態に戻す予定。

34 :
>>30 学歴云々の前に、検索しない事に真剣にびっくりだわ
書いた通り、ユークなんたらは、見るのもいや、な内容。
整数論を除いた内容なら、まだ見る気にもなれるけど。

35 :
>>33 つづき
Function IniFileReadなんたら

Declare Function IniFileRead OverLoad(FileString As String, SecNameString As String, KeyNameString As String, , ByRef KeyValString As ZString) As Wata
を抜いて
IniFileRead OverLoad → IniFileRead14
に戻したらば、発生しなくなった。16個以下なのか、
As String と  As ZString の混用が認められないのか
は、調べていない。

36 :
>>34
ああそう
クソみたいなコードを書いていても
古臭いながらもそれなりに知識を持っている人って
思ってたけど何だかな、独善なだけかよ

有益な情報になると思い、多少なりにも絡んできたけど
建設的に話ができないなら悪いけどこのスレには必要無いわ
過疎ったスレだし、誰も指摘しないし、自分もスルーしてきたけど
自分のブログか何かでやったら?

まだ過疎っている方のがマシだわ

37 :
>>36
おほめいただいて感謝します。

>自分のブログか何かでやったら?
やってます。
カウンターをつけていないので利用者がわかりませんけど
Lobot Off を指定しているので、利用者がいないはずです。
QB用ソース(現在いじっているV.B.用ライブの原型を含みます)付き実行形式ファイルで配布していますので、もし見かけたらばメールください。
ロボットメールしか受け取ったことがないのですけど。
地震以後ですと、ロボットメールすら来ません。
V.B.用ソースは公開しませんでした。
実行形式のみ公開していましたが、通信会社のサービス停止(+地震のよるHDD破損+MSのサポート停止)に伴い消失しました。

38 :
>>23 Type 命令文関係を見てみます。
のつづき。Type みてもわからなかったので、逃げの九素コードを
大域宣言は
'複素数(虚数)計算 '(2017.01.29 済)名称変更 Conplex → Complex
Type Complex
RealPart As Double
ImagPart As Double
End Type
で。ご指摘の通り、n → m への変更済み。
http://makoto-watanabe.main.jp/freebasic/PgFunction.html より、
関数は、Byref As return_type を指定して、参照を返すこともできます。
とあるので、破壊されない戻り値を保管する場所が必要。
局所ルーチンで参照され、破壊されない戻り値の保管場所は、九素コードとして、大域変数を使う。
Dim Shared ComComplexVal As Complex
関数としては単なるLET文を用意した。
Function TekiToComp(Aval As Complex) ByRef As Complex
ComComplexVal.RealPart = Aval.RealPart
ComComplexVal.ImagPart = Aval.ImagPart
TekiToComp = ComComplexVal
End Function
参照側で
ComComplexVal.RealPart = -5.0: ComComplexVal.ImagPart = -0.5
Complex1Val.RealPart = 1.0: Complex1Val.ImagPart = 0.1
Complex2Val.RealPart = 2.0: Complex2Val.ImagPart = 0.2
と定義して
Complex2Val = TekiToComp(Complex1Val)
関数を実行、3つの変数すべてが Complex1Val の値で一致する。
ここで、ComComplexValに適当な値を設定しても、Complex2Val の値が変化しなかった。
参照渡しと言っても、Complex2Valのアドレス(ポインター)をComComplexValのソレに書き換えるのではなかった。
3つの変数の保存領域は独立して存在する。

39 :
>>38 のつづき。動作試験用ソフトは以下の通り。
http://www.dotup.org/uploda/www.dotup.org1138726.zip.html
D:\bas\Projects\Kako02\Mod\TakaCom0.bi
が抜けているけど、Bak\TakaCom0(1).bi が使えると思う。

使える人がいたら使ってみて。

40 :
>>37
君の実情なんてどうでも良い
やっているなら、スレの私的専有を止めればよいでしょ
移植日記なら他所でやりなよ

>>38なんか見てもそうだけどマニュアル読めば分かることを
ダラダラと流されても何じゃそりゃなんだよ
せめて分からなかった所を質問形式でレスしなよ
全く整理もしていないオナニーレスを流すな

一応突っ込んでおくわ
>Complex2Val = TekiToComp(Complex1Val)
参照返しを値型の変数で受け取ったら、コピー代入になるのだから当たり前でしょ
右辺と左辺の間の=の意味は、let演算子
つまり、右辺の関数評価→左辺に代入評価が起こっているの

dim byref as Complex a = TekiToComp(Complex1Val)
なら、変数aは参照先Complex1Valの値を表示するだろうよ

FB独自の言語機能云々の前にプログラム言語としての前提知識が無さ過ぎるわ

41 :
>>40 >変数aは参照先Complex1Valの値を表示するだろうよ
高度な使い方。
この方法は、昨年5月ぐらいから探していた。結局見つからなくて、
主ルーチンから各ファイル(モジュール)へ関係値を配るという方法を取った。

なお、*.BI,*.Bas で検索したが
C:\FbEdit\ や C:\Tool\FreeBASIC\ 内に「dim byref」という文字を発見できなかった。
http://makoto-watanabe.main.jp/freebasic/PgDim.html 内にも ByRef の記載が見つからない。

42 :
>>41
ttp://www.freebasic.net/wiki/wikka.php?wakka=KeyPgByrefVariables

まず公式Wiki、次に公式フォーラム、次にGoogleなどで検索しなされ
>>41のリンク先は個人サイトで非公式サイト

こういうこと本気で言いたくないけど、もうキツイこと言っているから言わせてもらう
このスレッドを利用するに辺り下記を約束して欲しい
・ダラダラ日記を書かない
・分からないことがあれば、簡潔に明瞭に質問する
・ここはパブリックスペースであると認識する
・コードを書くなら該当する部分のみ、不必要なのは書かない

あと、向上心と好奇心、新しいものへの挑戦は忘れないで欲しい

43 :
>>41
ちょいと付け足し
君の実情なんてどうでも良いからそんなのも書かなくて良い
匿名掲示板では「誰が書いたか」よりも「何を書いたか」を重要視するべきだから
加えて、コテハン禁止、無断転載禁止

自治厨みたいなことしたくないが、これがこのスレのルール
異論ある人は言ってくだされ

44 :
・コテハン禁止
・無断転載禁止
・荒らしは放置
・sage進行推奨
・質問は簡潔明瞭に必要最低限の情報を記載する事
・次スレは>>990が宣言後に立てる事、無理なら代役をアンカー指名する事

公式
ttp://www.freebasic.net/
公式Wiki
http://www.freebasic.net/wiki/wikka.php?wakka=FBWiki
公式フォーラム
ttp://www.freebasic.net/forum/

前スレ
【QBASIC互換!?】FreeBasic【GPL】2
ttp://echo.2ch.sc/test/read.cgi/tech/1482549747/

テンプレここまで

何時になるか分からんが、次スレはこのテンプレを使うように

45 :
固定ハンドルは別に構わない
スパムじゃなければ沢山書いても構わない
質問が増えてきて邪魔になったときは質問用にスレッド別に建てればいい
日本語訳されたヘルプが存在することを示してもいいと思う(リンクの扱いについては知らないからその辺は解らない)
今沢山書いている人に付いては内容が解らないのでなんとも?

46 :
>>36 自分のブログか何かでやったら?
というお勧めがあったので、2008年頃に作ったルーチンを見直してみた。
MS でサービスを打ち切ったことから、実行形式のファイルを作るのは不可能。
残っているのは、バックアップ用に残していたソースファイルのみ。
ヘッダー、BODY, LINK, META, TimeZONE の5つの*.frm を子プロセスとして起動して
親プロセスがTxt → Html 書き換えを行うルーチンなんだけど、
html のバージョンが5になった関係で、かなり派手な書き直しが必要。
*.css ファイルについては全く考慮してなかった関係で、新規作成が必要。

内容を見たら、下手に直すよりも最初から作ったほうがでっとりばやい、という結論になった。

47 :
>>42-44 異論ある人は言ってくだされ
>>1 でいいんじゃないの。
何かってーと制限を加える方向に人は動く。結果として社会主義国家へと動いてしまう。
自由を民主主義を守るためならば、規制を緩和する方向へ動かなければならない。

規制を加える意味がない。オレのことを邪魔するだけの目的しかないんでしょ。

近所のソフト会社で1年以上勤めている人は1割ぐらい。新規学習が追い付かなくなって離職している。
プロと言われる人々で9割が去ってゆくのだが
>向上心と好奇心、新しいものへの挑戦
を要求するのは酷だわ。
プログラマー35歳定年説を支えているのが、このあたりが゜できなくなる年齢が35歳、なこと。
プログラマーになれない9割の人に、同様なことを要求するのは酷だ。

なお、うちの母校で、情報処理関係で卒業できるのは2割程度。
8割が中途退学している。この中途退学者ですら、俺よりも数学は詳しい。
というのは、1年の時に共通講座で数学を学ぶ。
1年の時に微積(微分方程式・積分方程式)で落伍者が出ていない。
うちの学科は、微積で1割弱が落伍していなく、9割が落伍する。
ところが、オレのように高校の副読本を見てつけ焼き場で挑むと、大学院入学試験まで通用する。
というのは、高校の微積の副読本の中から大学院入学試験問題、数学、が出題されるから。

あまりにも酷な条件だ。

48 :
>>47
そういうのは、公共スペースにおいて必要最低限のルールを守っている人が言うこと
君には言う資格がないよ、何言ってんの?
自分が提示した内容は、他の板では通常運転している状態の内容、特別なものではない
君は、そんな暗黙の了解ですら理解していない

>自由を民主主義を守るためならば、規制を緩和する方向へ動かなければならない
自由と無秩序を同列で語るなよ
掲示板のルール云々の話で、その枠を超えて話をするなよ
言っちゃ悪いが、それ馬鹿の典型だぞ

>規制を加える意味がない。オレのことを邪魔するだけの目的しかないんでしょ。
もし、こっちに邪魔する意図があるなら、普通に絡まずに最初からそうするわ
何勝手な被害者妄想してんの?
こっちは何度も譲歩してんだよ、それすら理解していないだろ?
ルール云々を持ち出したのは最終手段なんだよ

君のこれら以外の駄文は、このスレに無用な内容故、反応する気なし
何の反論にもなっていない駄文をダラダラ流すなよ

49 :
>>48 反論だということを理解できないんだな。
>それ馬鹿の典型だぞ
「後はご自由にどうぞ」とある通り、便所の落書き程度の内容が、掲示板だ。
だから、「馬鹿の典型」な内容を書いていて、問題なし。

なお、オレの文章の基本としては、ドルトルマンボウ系小説がある。
北杜夫が、あとがきに「書くか書かないか迷った時には、書かないほうが良いと思った内容を書く」と書いている。
だから、まじめに、必死になって、「馬鹿の典型」な内容を書いているのが、オレ。

格調高い内容は、いくらでも描ける人かいる。そんなないようは、いくらでも任せられる人々がいる。
しかし、ばかげた内容は任せられる人はなかなかいない。

50 :
>>49
やりたきゃ、ご自身のブログやサイトでどうぞ
2chっぽく言うなら、チラシの裏にでも書いてろ

一応言っておくが
君がこのスレで自分の自由を主張するなら、こっちにも君を邪魔する自由があるよね?
ってなるからルールが必要と言っているだけなんだがな
何で理解できないのかな?アホなの?

というわけで、こっちの考えはちゃんと提示したし、譲歩もした
もうこれ以上言うことはない

51 :
ユークリッドの互除法の数学的な証明が分からないとか言い出したら、きりがない。
グラフ理論など、アルゴリズムの数学的な証明なんか、全部難しい

数学的な証明の話は、数学板でやればいい。
ここはプログラム板だから、数学的な証明は分かっているとして、話を進めろ

数学的な証明が分からない人は、数学板で聞いてくればいい。
一々、プログラム板で対処していたら、きりがない

52 :
新スレになってから何も書かずに放置していたからびっくりした。
ここまでの流れ(?)を確認したらコメント書くよ

53 :
流れを確認したけど、今のままだったら今後のFreeBASICの発展は望めないと思う。
前スレの日本語訳の辺りから利己的な理由でこのスレが乗っ取られてると思ってる。
それとソースコード垂れ流している時点で簡潔なコミュニティでは無くなってる。
技術ドキュメントだったらまとめて圧縮してファイルにしてアップローダーに上げれば
ほんの数行のコメントとリンクを1つ提示するだけで済む。
こんな状態続いたら開発ツールとしてのFreeBASICの選択意欲は削がれるでしょ。

>>43
異論は無い。FreeBASICとスレの私物化が酷いので長いこと不定期ROMになってる。
国内事情がこれだとFreeBASICに関わりたくなくなるね。

54 :
>>45
>固定ハンドル
これはスレが荒れる原因になるから極力避けたいと考えてるよ
特定の人物への執拗な攻撃、あるいは騙りなどが起きるため

>多段レス
これはスパムじゃなきゃ禁止事項じゃないよ
ただ、節度は必要かな

>質問スレ
現状、まあ必要はないよね…

>日本語ヘルプ
日本語版を配布しているサイトや翻訳しているサイトはあるけど
間違った情報源になる可能性もあるからテンプレからは外すべきかな

55 :
>>53
完全に同意

正直な話、嫌な空気になる可能性があったから言っていいものかずっと迷っていた
でも正常化したい気持ちが彼のネガティブな態度で大きくなったのよね
自己顕示欲が強いというか、自己中というか、何故頑なになるのかが本当に理解できない
それでも、節度を守ってくれたら迎い入れたい気持ちもある
キャッチボールのボールは彼に投げた
今後は彼の出方次第、もうこれ以上は言うことはないかな

56 :
DialogAsMain.tpl を使って新規に作成

http://makoto-watanabe.main.jp/freebasic/ExtLibgsl.html
のように
#include "gsl/gsl_math.bi"
行を入れる。
http://makoto-watanabe.main.jp/freebasic/ExtLibTOC.html
では、
「注意:コンパイル時に、下記のエラーが表示される場合:」とあるが
http://www.freebasic.net/wiki/wikka.php?wakka=ExtLibTOC
では記載なし。

FB-win32-gsl-1.15.zipを導入していないと、有無を言わせず、終了してしまう。
障害メッセージ無し。
DialogAsMain.tpl を使わないで使用すような環境と、しようする環境では障害の内容が異なる模様。

57 :
>>56 つづき。 日本語マニュアル
http://cbrc3.cbrc.jp/~tominaga/translations/gsl/gsl-1.15/index.html

自前で訳そうと始めたが、DLできたのが他のバージョン。
検索したら、既に日本語訳が公開されていた。

>>38 つづき。
こっちの想定していた使い方と異なる使い方になってしまう。
アト゛レス(ポインター)の引き渡しがうまくいかなかった。
したがって、いまのところ虚数のみの取り扱いになるから、
>>56 の関数群が使えるようになれば、ポインターに関係することなく、何とかなりそう。
目次の和訳をやっていてコケた程度なので、使えるかどうかはわからぬ。
ライブの30-34系が複素関数、特殊関数、多倍精度整数演算なので、ライブラリーを切り替えられるかもしれない。
35系の移植が終わったが、これは、整列ルーチンで、変なことをしている一部ルーチンを除くとGSLライブに統一できると思われる。

>>53
オレのようにばかげたことをやっている人間がいると、
オレに比べて頭が良いんだ、という人が多数表れて、普及が進む。
だけど、高度なことばかりやっていると普及しない。
c言語から入る人にとっては、ご指摘の通りだろう。
商法の規定で、商人は良品を販売する義務を負う。
だから、金を出して買ったものは良品であり、第三者に販売するつもりの内容は商人から購入することで、良品であることを確保する。
無料の物はそうはいかない。損害賠償請求する価値がないと言える。
だから、営利活動にはあまり普及しないのが無料品。
自分たちで使える無料品を自分たちで作っていくという活動もある。

58 :
>>57
>オレのようにばかげたことをやっている人間がいると、
>オレに比べて頭が良いんだ、という人が多数表れて、普及が進む。
>だけど、高度なことばかりやっていると普及しない。
そういうのは、世間一般では屁理屈を捏ねるっていうのだよ
掲示板において自分勝手に振る舞うための自己中心的な勝手な解釈にしかなっていない
そんなのは公共スペースである掲示板には断じて必要ない、肥やしにもならないクソ未満だよ

>商品云々
先生ー、意味が分かりませーん
C/C++、.NET、Javaなど、現行の主な言語を扱うための環境づくりは無料で出来ますがー?
大昔にQBASICとかは販売されていたけど、何時の時代の話をしているのですかー?

というわけで、これまでの指摘に対して何も言及しないのは
この掲示板において君のスタンスは変わらないってことで良いのかな?
そうであれば、こっちも次のフェイズに移行するけど、きっちりと言及してくれないかな

59 :
>>58 >先生ー、意味が分かりませーん
先生からは、
意味が分かりなさい

>何も言及しないの
しているじゃない。

60 :
>>59
君のは言及とは言わない、屁理屈を捏ねて話を逸らかしているだけ
本当に対話の出来ない人なんだな
君のスタンスは、

・こっちの提案に聞く耳持たない
・このスレを私物化する気満々

って解釈するね

61 :
このスレは、スレを私物化する屁理屈大先生専用スレとなりました


------------------------------------------------------------------------
ここからは、屁理屈大先生の独演会をお楽しみ下さい

62 :
一年ぶりに、FreeBASIC 日本語版マニュアルを更新しました。
2016年末までの英文版 Wiki の変更を反映したつもりです。
http://makoto-watanabe.main.jp/freebasic/

CHM 版は、下記でダウンロードできます。
http://makoto-watanabe.main.jp/freebasic/FB-manualJP20170207.zip

修正すべき点、加筆すべき点など、ご指摘、ご意見を、お願いいたします。
FreeBASIC で遊んでみて下さい。

63 :
>>61 大先生専用スレ
おほめいただきありがとうございます。
アルバイトで1年半ほど教員のまねごとをしていましたが、
当時の先生から大先生へと進歩しました。

思い起こせば、2次方程式の解を求めていた高校から始まる Basic の世界です。
この歳になって、当時のBasicの教科書には常に記載されていた MAT 命令を使うことができるようになりました。

MAT演算で何をしようか、思い当たるものがないんだよ。
細かいことは、gsl_matrix.bi参照。
欠損がないことを前提条件にすれば、結構いろいろできるのだが

64 :
MATならば、Fortran90/95では、標準で実装されていて、実際に、ベクトルや行列、連立一次方程式
を解く必要がある場合は、Fortran 90/95を使うほうがいいかもしれません。
まあ、趣味でやる分には、Basicでベクトルや行列、行列式のサブルーチンを
作るのも楽しみですが。

65 :
>>64 >ベクトルや行列、連立一次方程式を解く必要がある
Foortan 6 用の
> ベクトルや行列、行列式のサブルーチン
ライブラリー SSP01.FTからSSP3?.FT はどこかに入っています。
かなりの内容を V.B.に移植して使っていました。

今迷っているのは、何のデータを使って、ベクトルや行列、連立一次方程式を解くかといしうこと。
代数関係の公式などは、すべて、
データの欠落がない
データの繰り返しは同じ回数である
データの有効桁は無限長である
ことを前提に成り立っています。手持ちのデータでは、
欠落が多数(データどりを忘れた等)
繰り返しはなし
有効桁はせいぜい2桁。0.5単位で30位まで。
稀に50-60位まで増えるが異常値と解釈したほうが正しい。

なんてものしかない。最近は変な偏りが出てくるようになったし。
http://www1.river.go.jp/
http://www1.river.go.jp/cgi-bin/SelectMapSite.exe

66 :
いわゆるill conditionの連立一次方程式などでは、解法によって解がちがったりして
結構勉強になるとおもいます。

67 :
>>66 悪条件な連立方程式は、
線形代数の教科書に載っていた有名な方程式
とか、デカコンを使っていたころに色々やりました。
だから、手持ちのライブには、その頃の名残として、
対角化、三重対角化、LP(線型計画法)
等のルーチンも存在します。
有効桁が無限でないと、発散して解けない問題とかありました。
http://www.math.ritsumei.ac.jp/yasutomi/jugyo/Numerical_Analysis/note5.pdf

68 :
新しい開発環境 FreeBasic IDE-poseidonFB の紹介です。
http://makoto-watanabe.main.jp/freebasic/tipsPoseidonFB.html

ファイルをユニコードで保存したい場合は、FbEdit より便利かもしれません。

69 :
>>67 つづき。
行列式のまともな計算方法がある。詳しいことは
http://w3e.kanazawa-it.ac.jp/math/category/gyouretu/senkeidaisu/henkan-tex.cgi?target=/math/category/gyouretu/senkeidaisu/index.html
内を探してくれ。

http://www.cis.twcu.ac.jp/~nagasima/02sek4.pdf
一つの列の定数倍を他の列に加えても行列式の値は変わらない
一つの列の各要素をc倍すると行列式の値はc倍になる
二つの列を入れ替えると行列式の値は−1倍になる
という性質をうまく使って、入れ替えの回数と、全体にかけた倍数を記録しておいて
上三角又は下三角行列に書き換える。
http://tau.doshisha.ac.jp/lectures/2005.linear-algebra-I/html.dir/node77.html
対角の積で行列式の値を求められる。
こんなことが、高校の線形代数の副読本に書いてあったものだから

手持ちのライブには、三角化ルーチンと、三角化することを使った行列式の解法ルーチンがある。
これ、評判悪いんだよ。
まともな方法を使わないで、n次まで拡張してしまったから。

70 :
Public Function MacinNameGet(MnameString as string) as string
Const TakaSubRoutineNo as long = 14&
'*-* コンピュータ名を取得

'const MAX_COMPUTERNAME_LENGTH = 15
Dim strComputerNameBuffer As ZString * MAX_COMPUTERNAME_LENGTH = "123456789012345"
Dim lngComputerNameLength As Dword = MAX_COMPUTERNAME_LENGTH
'Dim lngComputerNameLengthPtr As LPDWORD
'Dim strComputerNameBufferPtr As LPSTR
Dim lngResult As Long

'lngComputerNameLengthPtr = @lngComputerNameLength
'strComputerNameBufferPtr = @strComputerNameBuffer
'TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
' コンピュータ名の長さを設定
lngComputerNameLength = Len(strComputerNameBuffer)
' コンピュータ名を取得
'declare function GetComputerNameA(byval lpBuffer as LPSTR, byval nSize as LPDWORD) as WINBOOL
'declare function GetComputerNameW(byval lpBuffer as LPWSTR, byval nSize as LPDWORD) as WINBOOL
'lngResult = GetComputerName(strComputerNameBuffer, lngComputerNameLength) : 'ハング
lngResult = GetComputerName(@strComputerNameBuffer, @lngComputerNameLength)
lngResult = GetComputerName(@strComputerNameBuffer, @lngComputerNameLength)
'lngResult = GetComputerName(strComputerNameBufferPtr, lngComputerNameLengthPtr)
'lngResult = GetComputerName(strComputerNameBufferPtr, lngComputerNameLengthPtr)
MnameString = strComputerNameBuffer
'MnameString = Left$(strComputerNameBuffer, InStr(strComputerNameBuffer, vbNullChar) - 1)
MacinNameGet = MnameString
End Function

71 :
コンピュータ名を取得 で、なぜか
lngResult = GetComputerName(@strComputerNameBuffer, @lngComputerNameLength)
lngResult = GetComputerName(@strComputerNameBuffer, @lngComputerNameLength)
とか
'lngResult = GetComputerName(strComputerNameBufferPtr, lngComputerNameLengthPtr)
'lngResult = GetComputerName(strComputerNameBufferPtr, lngComputerNameLengthPtr)
のように、2回参照しないとコンピュータ名を取得できない。
なお、変数名については、当時のMS系サイトの内容をそのまま使っている。

72 :
Why have I been blocked?
This website is using a security service to protect itself from online attacks.
The action you just performed triggered the security solution.
There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked.
Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
なんだわ。
'キーの中の値を列挙します
function RegEnumValue で探して
'http://www.freebasic.net/ 内になし
'ドイツサイトより
'https://www.freebasic-portal.de/code-beispiele/system/serielle-schnittstellen-com-ports-unter-windows-ermitteln-248.html
があって、コピーしたわ。
UPしたら、引っかかってしまった。

73 :
分割すれば何とかなるかもしれぬから、20行ぐらいづつやってみる。
Public Function RegistryKeyList(RootKey as HKEY, SubKeyString As String, KeyNameString() As String, KeyValString() As String, Ierror As Long) As Wata
'キーの中の値を列挙します
'http://www.freebasic.net/ 内になし
'ドイツサイトより
'https://www.freebasic-portal.de/code-beispiele/system/serielle-schnittstellen-com-ports-unter-windows-ermitteln-248.html

Dim hKey As HANDLE
'Dim Ierror As Integer
'type LPCSTR as const zstring ptr
Dim SubKeyZString As ZString * 1024
Dim SubKeyZStringPtr As LPCSTR
Dim KeyValStringTSU As Long, KeyValStringSU As Long, Jerror As Long
SubKeyZStringPtr = @SubKeyZString

RegistryKeyList = 0
'SubKeyString = "HARDWARE\DEVICEMAP\SERIALCOMM": '保守用
'RootKey = HKEY_LOCAL_MACHINE: '保守用

SubKeyZString = SubKeyString

74 :
'Schlussel offnen; Fehlermeldung ausgeben und Programm beenden falls nicht erfolgreich
'キーは開きます;エラー・メッセージは、うまくいかなければプログラムを終えます
'const KEY_QUERY_VALUE = &h0001 ''サブキーのデータを問い合わせることを許可します。
'declare function RegOpenKeyExA(byval hKey as HKEY, byval lpSubKey as LPCSTR, byval ulOptions as DWORD, byval samDesired as REGSAM, byval phkResult as PHKEY) as LONG
'declare function RegOpenKeyExW(byval hKey as HKEY, byval lpSubKey as LPCWSTR, byval ulOptions as DWORD, byval samDesired as REGSAM, byval phkResult as PHKEY) as LONG

Ierror = ERROR_SUCCESS
KeyValStringTSU = 10
KeyValStringSU = 0
Redim KeyValString(KeyValStringTSU) As String, KeyNameString(KeyValStringTSU) As String
'Ierror = RegOpenKeyEx(HKEY_LOCAL_MACHINE, @"HARDWARE\DEVICEMAP\SERIALCOMM", 0, KEY_QUERY_VALUE, @hKey)
Ierror = RegOpenKeyEx(RootKey, @SubKeyZString, 0, KEY_QUERY_VALUE, @hKey)
If (Ierror = ERROR_SUCCESS) Then
Dim comCnt As Integer 'レジストリエントリの数
Dim As String comStrString 'レジストリエントリ名の最長の長さ(文字型)
Dim As String comPortString 'レジストリエントリのデータの最長の長さ(文字型)
Dim As Integer comStrLen
Dim As Integer comPortLen
Dim As Integer comStrMaxLen 'レジストリエントリ名の最長の長さ
Dim As Integer comPortMaxLen 'レジストリエントリのデータの最長の長さ

75 :
'鍵となる問題の局面情報 Groseninformationen des Schlussels abfragen
'指定されたレジストリキーに関する情報を取得します。
'declare function RegQueryInfoKeyA((中略, C:\FreeBASIC\inc\win\winreg.bi 参照)byval lpftLastWriteTime as PFILETIME) as LONG
'declare function RegQueryInfoKeyW((中略), byval lpftLastWriteTime as PFILETIME) as LONG

RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, @comCnt, @comStrMaxLen, @comPortMaxLen, 0, 0)
comStrString = String(comStrMaxLen, 0)
comPortString = String(comPortMaxLen, 0)

KeyValStringTSU = comCnt + 1
KeyValStringSU = 0
Redim KeyValString(KeyValStringTSU) As String, KeyNameString(KeyValStringTSU) As String
Dim IQQ As Integer

76 :
For IQQ = 0 To comCnt - 1
comStrLen = comStrMaxLen + 1 'String文字数 → ZString文字数
comPortLen = comPortMaxLen / 2 'ANSI → UNICODE 文字数
'Schlusselname und -wert ermitteln und ausgeben; Fehlermeldung ausgeben wenn nicht erfolgreich
'オープンレジストリキーから値の列挙
'declare function RegEnumValueA(byval hKey as HKEY, byval dwIndex as DWORD, byval lpValueName as LPSTR, byval lpcchValueName as LPDWORD, byval lpReserved as LPDWORD, byval lpType as LPDWORD, byval lpData as LPBYTE, byval lpcbData as LPDWORD) as LONG
'declare function RegEnumValueW(byval hKey as HKEY, byval dwIndex as DWORD, byval lpValueName as LPWSTR, byval lpcchValueName as LPDWORD, byval lpReserved as LPDWORD, byval lpType as LPDWORD, byval lpData as LPBYTE, byval lpcbData as LPDWORD) as LONG

Jerror = RegEnumValue(hKey, IQQ, StrPtr(comStrString), @comStrLen, 0 , 0, StrPtr(comPortString), @comPortLen)

77 :
If Jerror = ERROR_SUCCESS Then
KeyValStringSU = KeyValStringSU + 1
KeyValString(KeyValStringSU) = Left(comPortString, comPortLen)
KeyNameString(KeyValStringSU) = Left(comStrString, comStrLen)
ドイツ語のPrint文消してみた

78 :
Else
'レジストリキーを読み取りでエラーが発生しました
'Print "Fehler beim Auslesen des Registry Keys (Error"; Ierror; " bei Index"; IQQ; ")"
Ierror = Jerror
EndIf
Next
'Schlussel schliesen
RegCloseKey(hKey)

'Print comCnt; " COM-Ports vorhanden"
'TakaBuff = "COM-Ports :" + Str$(comCnt)
'SetDlgItemText(TakaHWND, IDC_STC1, @TakaBuff): '枠表示用バッファ

79 :
Else
'Print "Registry Keys Open (Error"; Ierror; ")"
'TakaBuff = "OpenError :" + Str$(Ierror)
'SetDlgItemText(TakaHWND, IDC_STC1, @TakaBuff): '枠表示用バッファ
EndIf
End Function

で終わり。使いたい人は適当に使って。

80 :
このドイツ語サイトでは、'ANSI から UNICODE へ文字数の換算をしている。
FreeBasic では、区別ないで、declare 文を切り替えて使っているので、おかしくなるかもしれないし、
この参照元の著者が考慮しているのかもしれない。
それと、2バイト文字については考慮していないかもしれない。

>>77 で消したプリント文は全角で送ってみる
      ’Print Left(comPortString, comPortLen) + Chr(9) + Left(comStrString, comStrLen)

81 :
このドイツ語サイトで゜気になるのは、>>76
RegEnumValue(hKey, IQQ, StrPtr(comStrString), @comStrLen,
Dim IQQ As Integer (For 文内に有った宣言だが、自作宣言チェックルーチンが解釈できない(Dim 文だけ先読みして使用する変数をルーチン別に一覧表を作る)ので移動)
RegEnumValueW(byval hKey as HKEY, byval dwIndex as DWORD,
変数型 DWORDを使うところをInteger で参照している。
Integerは、32Bit符号付整数又は64Bit符号付整数
http://makoto-watanabe.main.jp/freebasic/PgInteger.html#start
Dword は、32Bit符号無整数
http://makoto-watanabe.main.jp/freebasic/PgUlong.html#start
なので、引数の換算ルーチン次第でおかしなことが起こりうる。

82 :
以前紹介のあったレジストリーの読み取れルーチン
'http://makoto-watanabe.main.jp/freebasic/tipsRegistry.html
'名称変更して ReadRegistry() → RegistryRead02()となっている。
2016.09にレジストリーエディタを使って、レジストリーのダンプリストを作成。
その中から、「Mozilla/」「User Agent」「UserAgent」を検索して見つかったレジストリーパスを読み取っている。
'[HKEY_CURRENT_USER\(何かの文字\)Software\Microsoft\Windows\CurrentVersion\Internet Settings]
と'サブキーを取得して、その後に同じディレクトリーを付け足してUserAgentの内容を読み取る場合が多い。
しかも、一部内容は消えている。何で消えたかなどは不明。
レジストリーのOpen/Closeは成功しているが
RegEnumKeyEx(hKey, IQQ, StrPtr(Moji), @Nagasa, 0, 0, 0, @File)
の実行で、エラー234が発生している。

83 :
GSL(科学技術計算関数ライブラリ) のプログラム例を日本語化しました。
http://makoto-watanabe.main.jp/freebasic/tipsGSL.html

数学的な意味について、私は理解できないのですが、プログラムとしては、動きました。

84 :
http://madia.world.coocan.jp/vb/API/RegEnumKeyEx.htm
を見本に、サブキー取得ルーチンを作っていた。
>>82
egEnumKeyEx(hKey, IQQ, StrPtr(Moji), @Nagasa, 0, 0, 0, @File)の実行で、エラー234が発生している。
の原因がやっとわかった。
Nagasa = Len(Moji)
では、常に Nagasa = 0となる。
Const MojiLen As Long = 1024
Dim SubKeysNameBuffZString As ZString * MojiLen 'サブキー名が格納されるバッファ
と定義して
Nagasa = MojiLen
とする必要があった。

85 :
多分動くと思うけど、ライブ化のための整理前の状態でup
Public Function RegistrySubKeyList(RootKey as HKEY, TopSubKeyString As String, SubKeyNameString() As String, Ierror As Long) As Wata
'Subキーの名を列挙します
'http://madia.world.coocan.jp/vb/API/RegEnumKeyEx.htm

Dim hKey As HANDLE
Dim SubKeyZString As ZString * 1024
Dim SubKeyZStringPtr As LPCSTR
SubKeyZStringPtr = @SubKeyZString
Dim Jerror As Long

RegistrySubKeyList = 0

'RootKey = HKEY_LOCAL_MACHINE '(保守用)
'TopSubKeyString = "BCD00000000\Objects": '(保守用) 前後の「\」なし
'TopSubKeyString = "SYSTEM\CurrentControlSet\Services\xmlprov\Parameters\SchemaGroups\User"
'TopSubKeyString = "SYSTEM\CurrentControlSet"
'RootKey = HKEY_CURRENT_USER
'TopSubKeyString = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"
If (TopSubKeyString = "") Then
'Ret = 234(バッファサイズの不足) 発生

86 :
ElseIf (Left$(TopSubKeyString, 1) = "\") Then
'Ret = 161(指定されたパスは無効です) 発生
Else
'Fun RegQueryInfoKey() 用変数
'Dim As DWORD ClassBuffSize 'クラス文字列バッファのサイズ (MS指示: 0を指定する)
Dim as DWORD SubKeysSU 'サブキーの数
Dim as DWORD SubKeysMaxLen 'サブキー名の最長の長さ
Dim as DWORD ClassMaxLen 'クラス文字列の最長の長さ
Dim as DWORD KeyNameSU 'レジストリエントリの数
Dim as DWORD KeyNameMaxLen 'レジストリエントリ名の最長の長さ
Dim as DWORD KeyValMaxLen 'レジストリエントリのデータの最長の長さ
Dim as DWORD SecurityLen 'セキュリティ記述子の長さ
Dim LastWriteTime As FILETIME '最後の書き込み時刻

SubKeyZString = TopSubKeyString
Dim SubKeyNameStringTSU as Long, SubKeyNameStringSU As Long
SubKeyNameStringTSU = 100
SubKeyNameStringSU = 0
Redim SubKeyNameString(SubKeyNameStringTSU)


Const MojiLen As Long = 1024
Dim IQQ as DWORD 'サブキーのインデックス番号
Dim SubKeysNameBuffZString As ZString * MojiLen 'サブキー名が格納されるバッファ
Dim SubKeysNameBuffSize As DWORD = MojiLen 'サブキー名バッファのサイズ
'Dim ClassBuff As ZString * MojiLen 'クラス文字列バッファ MS指定 0
'Dim ClassBuffSize as DWORD 'クラス文字列バッファのサイズ MS指定 0
Dim FileWriteTime As FILETIME '最終更新時刻

87 :
また引っかかった。。続きはそのうち

88 :
’以下の実行文が引っ掛かったみたい。全角にしてみた。
'バッファを確保する
  SubKeysNameBuffZString = ””: ’String(MojiLen, Chr(0))
  SubKeysNameBuffSize = MojiLen: ’Len(SubKeysNameBuffZString)

'キーをオープンしてハンドルを得る

89 :
Ierror = RegOpenKeyEx(RootKey, @SubKeyZString, 0, KEY_ALL_ACCESS, @hKey)


If (Ierror = ERROR_SUCCESS) Then
'MessageBox(TakaHWND,"Hello Open 成功","Messagebox caption",MB_ICONINFORMATION)
Jerror = RegQueryInfoKey(hKey, 0, 0, 0, @SubKeysSU, @SubKeysMaxLen, @ClassMaxLen, @KeyNameSU, @KeyNameMaxLen, @KeyValMaxLen, @SecurityLen, @LastWriteTime)
If (Jerror = ERROR_SUCCESS) Then

'MessageBox(TakaHWND,"Hello Info 成功","Messagebox caption",MB_ICONINFORMATION)

'MessageBox(TakaHWND,"Hello SubKeysSU:"+Str$(SubKeysSU)+"SubKeys最大長さ"+Str$(SubKeysMaxLen)+")","Messagebox caption",MB_ICONINFORMATION)
'MessageBox(TakaHWND,"Hello 保存キー数"+str$(KeyNameSU) +"キー名最大長さ"+ Str$(KeyNameMaxLen) +"キー値最大長さ"+ Str$(KeyValMaxLen) +")","Messagebox caption",MB_ICONINFORMATION)
for IQQ = 0 To SubKeysSU -1
'サブキーを取得
SubKeysNameBuffSize = MojiLen
' 1 2 3 4 5 6 7 8
Jerror = RegEnumKeyEx(hKey, IQQ, @SubKeysNameBuffZString, @SubKeysNameBuffSize, 0, 0, 0, @FileWriteTime)

If (Jerror = ERROR_SUCCESS) Then
'MessageBox(TakaHWND,"Hello RegEnumKeyEx 成功("+SubKeysNameBuffZString+") Loop :"+Str$(IQQ),"Messagebox caption",MB_ICONINFORMATION)

90 :
>>89 本文が長すぎるというので、コメント行('declare function RegEnumValuなんたら)を消した。
以下の6行は、全角化している
          IF (SubKeyNameStringSU >= SubKeyNameStringTSU) then
            SubKeyNameStringTSU = SubKeyNameStringTSU + 20
            redim preserve SubKeyNameString(SubKeyNameStringTSU)
          End If
          SubKeyNameStringSU = SubKeyNameStringSU + 1
          SubKeyNameString(SubKeyNameStringSU) = SubKeysNameBuffZString

91 :
Else
'Jerror = 234(バッファサイズの不足) 発生
'MessageBox(TakaHWND,"Hello RegEnumKeyEx Err:"+Str$(Jerror )+"("+SubKeysNameBuffZString+")","Messagebox caption",MB_ICONINFORMATION)
'MessageBox(TakaHWND,"Hello RegEnumKeyEx Err:"+Str$(Jerror )+"("+Str$(Len(SubKeysNameBuffZString))+"," +Str$(SubKeysNameBuffSize)+")","Messagebox caption",MB_ICONINFORMATION)

End If
'初期化する
SubKeysNameBuffZString = ""
SubKeysNameBuffSize = MojiLen: 'Len(SubKeysNameBuffZString)

Next IQQ
Else
'MessageBox(TakaHWND,"Hello RegQueryInfoKey Error."+Str$(Jerror),"Messagebox caption",MB_ICONINFORMATION)
End If
'ハンドルを解放
RegCloseKey(hKey)
Else
'MessageBox(TakaHWND,"Hello RegOpenKeyEx Error."+Str$(Ierror),"Messagebox caption",MB_ICONINFORMATION)
End If
End If
End Function

92 :
こんなところ。使いたい人は適当に使って。

内容の読み書き、サブキー名とキー名の取得、
の4ルーチンがあれば、中身を読み取って何とかできると思われる。

>>82のUserAgentのように
途中がちょっと違って、前後が同じパスのレジストリーのデータを読む場合のように、
サブキーを取得して、(値が保存されていることを前提に)適当に読み取るというルーチンを作成できれば
ユーザー名全員の取得が可能となる。

Htmlファイル作成ルーチンの、<META>タグに著者名を指定する場合がある
このときに、著者名を誰で登録するか、の選択をするときぐらいしか使わない。

93 :
'C:\tool\FreeBASIC\inc\win\secext.bi 内指定値
'declare function GetUserNameExA(byval NameFormat as EXTENDED_NAME_FORMAT, byval lpNameBuffer as LPSTR, byval nSize as PULONG) as WINBOOLEAN
'declare function GetUserNameExW(byval NameFormat as EXTENDED_NAME_FORMAT, byval lpNameBuffer as LPWSTR, byval nSize as PULONG) as WINBOOLEAN
'type EXTENDED_NAME_FORMAT as long
'enum
'(中略)
'end enum
'type PEXTENDED_NAME_FORMAT as EXTENDED_NAME_FORMAT ptr

に関係して、
'#Include Once "win/secext.bi"
指定以外の#Include文が必要らしく、コンパイラーが通らない。型宣言が
'#Include Once "win/bcrypt.bi"
'#Include Once "win/ntdef.bi"
に同一な宣言があるけど、どっちを使ってよいものかわからない。どちらか入れてもコンパイルエラーになる。
したがって、GetUserNameEx()が使えない。
部分切り出しという手法もある。

94 :
>>93 つづき
'#Include Once "win/wincrypt.bi"
'#Include Once "win/security.bi"
'の2行が必要と判明した。

95 :
declare function SHGetKnownFolderPath(byval rfid as const KNOWNFOLDERID const ptr, byval dwFlags as DWORD, byval hToken as HANDLE, byval ppszPath as PWSTR ptr) as HRESULT
の解読中。

96 :
>>95 つづき
#if _WIN32_WINNT = &h0602
の時のみ使えるシステムコールルーチンで、Win10では使えない模様。
よって、開発中止。

97 :
>>96 つづき
何か関係ありそうな内容を探していたら
http://qiita.com/hkuno/items/7b8daa37d9b68e390d7e
という一覧表を見つけた。

バージョンの取得は
http://www.4d.com/jp/blog/get-windows-version.html
参照。
GetFileVersionInfo システムコールは現時点で理解できない。
MSReturnCode = GetVersionExA(@udtOSVersionInfo)
関係情報がMSサイトから消えたので、こちらからの取得はあきらめるしかない模様。
使っていたのが、Win95 → Win2000 に伴うレジストリーの構造の変化だけだったので
NetからWin8を持たないで、Win 10 だけ考えるなら、なくても何とかなりそう。

レジストリエディターで、値をダンプして、検索をかけようとした。
LineInput で読み取ったらば、半角英数として解釈できなかった。
つまり、Shift-JIS コードではなく、Uniコードだった。

98 :
>>97 つづき。レジストリーのダンプリスト関係。
Const InFile1String = "D:\bas\Projects\Kako02\0RegData\1111.reg.txt"
の調子で入力ファイル5つを昨年(2016.09)に作成した。
レジストリー操作がよくわからなくて放置していたが、Read, Write, SubKey検索, Key検索の4ルーチンが入手できたことから、放置していた、データの収集関係を始めることとした。
が、データが膨大で260MB位ある。初期には
エディタで読み取って、検索
検索ソフトで検索
なんてやっていたが、内容によっては膨大な数の入力定数の設定があり、結構間違いが多数発生した。
というわけで、自動化。キー名、キー値、サブキー名で検索して、一覧表を作成、一覧表から読み取りルーチンを作成するようにした。
Dim As String RegPathString, KeyNameString, KeyValString

'Input File No. 0
(略)
'Input File No. 3 D:\bas\Projects\Kako02\0RegData\3333.reg.txt
(略)
RegPathString = "SOFTWARE\Microsoft\Windows Search\Gathering Manager"
KeyNameString = "UserAgent"
KeyValString = RegistryRead02String(HKEY_LOCAL_MACHINE, RegPathString, KeyNameString)
'KeyValString = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT; MS Search 4.0 Robot)"
'Input File No. 4 D:\bas\Projects\Kako02\0RegData\4444.reg.txt
(略)
てな調子で読み取りルーチンが作成されるソフトを作成した。

99 :
>>98
つづき。こんなのも作った。
Dim As String TopSubKeyString, BottomSubKeyString, SubKeyNameString()
Dim Ierror As Long

'Input File No. 3 D:\bas\Projects\Kako02\0RegData\3333.reg.txt

' RegPathString = "SOFTWARE\Microsoft\Advanced INF Setup\IE40.UserAgent\RegBackup"
TopSubKeyString = "SOFTWARE\Microsoft\Advanced INF Setup"
BottomSubKeyString = "\RegBackup"
TakaDammyReturnCode = ReadSubKeyList0(HKEY_LOCAL_MACHINE, TopSubKeyString, SubKeyNameString(), Ierror)
' SubKeyNameString(3) = ["IE CompList", "IE.HKCUZoneInfo", "IE40.UserAgent"]
'**********************\(ちょっと違う)\*******************
というサブキー内にちょっと内容が異なる値が保存されている場合を想定。
UserNameの取得で、導入したユーザー名をかき集めるための物。
(ちょっと違う)ところをSubキーとして検索(Function ReadSubKeyList0(なんたら))して、フルスペルを取得。
個別に各キーの値を取得するための、Subキー一覧を作成するための物

100 :
作成したソフトの中身を眺めた範囲では、
Open InFileString For Input Encoding "utf-16" As #InFileNo
While - Wend で回して、先頭1文字又は先頭3文字で作業内容を決定
一番最初の[]内でルートキーを取得し
その後は[でサブキー名、"や@でキー名、=がない場合にはキー値の追記行として処理
だから、そんな難しいルーチンではないと思う。
サブキー、キー名、キー値の3つがそろったところ、つまり、サブキーの先頭行か、キー名の先頭行で検索する


100〜のスレッドの続きを読む
【モダン推奨】Perlについての質問箱 50箱目
Visual Studio 2012 Part8
Java入門・初心者質問スレ Part.7
Microsoft Silverlight その9
Message Passing Interface (MPI) 統合スレ
自動巡回ソフトというものを作ってみたい
【コボル】COBOL不要論【ただのDSLだよね?】
Swiftアンチスレ part1
D言語 Part34
関数型プログラミング言語Haskell Part32
--------------------
【快挙】モーニング娘。からデブが1人も居なくなるwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
【KENWOOD】ケンウッド カーナビ、オーディオ 58
新規スレッド立てるまでも無い質問@車板527
【test】書き込みテスト【!ninja】
【スパワールド】ホモのジャンボ【禿げてきた】
【悲報】 藤井聡太六段(中卒)、900円のランチを注文してしまう [439232695]
(ヽ´ん`)「コンビニバイトだけはやめとけ」←これはマジ [304868982]
【輸出優遇除外】水面下では対話の試み?韓国駐日大使「首脳会談のために努力」 参院選後に別の水面下での議論が開始されることも
上沼恵美子が言いそうな事
秋篠宮佳子内親王親衛隊 第100師団
【自民】石破氏「災害大国日本、防災省つくって経験蓄積を」
【林檎】カーネーション 3【NHK連続テレビ小説】
【マスク券】福井県が斡旋販売するマスク、購入者が殺到し販売店の半数以上で欠品。県「必ず買える量を確保してるので慌てないで欲しい」 [記憶たどり。★]
東電の株を買え
検証・1979年のTV
(・∀・)イイ!お勧めのPCケース 201台目
高瀬物産 16
国家公務員 公安警察 B
【2702】日本マクドナルド111【にょろさんは病気ですね】
J1浦和は営業収入10億円前後の赤字に…役員報酬は来年1月まで一律15%カット [砂漠のマスカレード★]
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼