したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

■■■20レス以内で済むF-BASICの質問はこちらへ■■■

664598:2015/11/11(水) 06:54:30
サンプルです。動くかどうかは謎ですが。実行時間26秒
(TEST2_SETSTATEサンプル必須)
なお、処理時間最優先のため、実行経過の表示はありません。
#include "windows.bi"

var FRUN as long,FEND as long
var TT&(50), RR$(4-1, 50) as string * 13 'データ保管領域確保
var TIMER1 as object
var CM$, R$(4-1), CNT1&, CNT2&, I&
TIMER1.ATTACH GETDLGITEM("TIMER1")
TIMER1.SETINTERVAL 50 ' (10ms単位)

baud 0,9600
CM$="COM0:(S7N2N7NNN)"
open CM$ for output as #2 : open CM$ for input as #1
TEST2_SETSTATE 2 '←ファイル番号の対応COM設定を強制変更する
wait 100
if not eof(1) then R$(0)=input$(lof(1),#1):R$(0)="" '最初の(00h)を捨てる
while CHECKEVENT :CALLEVENT :wend
TIMER1.ENABLE -1 'タイマー通知開始

*LOOP1
'イベント発生して処理されるまで待つ(かつ変数FRUNでタイマーイベントを待つ)
while FRUN=0 :WAITEVENT :wend
if FEND then *ENDING '中止して終了する
CNT1&=CNT1&+1
print#2,"D";chr$(13);
TT&(CNT1&)=millitime ' 00:00:00からの通算時間の値(1ms単位)

if CHECKEVENT then CALLEVENT
wait 10 '受信データ作成待ち
while eof(1) and FEND=0 :CALLEVENT :wend ' 受信開始までループ
if FEND then *ENDING

if lof(1) < 14 and FEND=0 then wait 5 :CALLEVENT ' 1行受信までもう少し待つ
if CHECKEVENT then CALLEVENT
if lof(1) < 14 then
print "!!データ受信エラー!!";lof(1)
R$(0)="":if lof(1) <> 0 then R$(0)=input$(lof(1),#1)
R$(1)="":R$(2)="":R$(3)=""
else
line input#1,R$(0) :if CHECKEVENT then CALLEVENT
line input#1,R$(1) :line input#1,R$(2) :line input#1,R$(3)
endif
RR$(0,CNT1&)=R$(0):RR$(1,CNT1&)=R$(1):RR$(2,CNT1&)=R$(2):RR$(3,CNT1&)=R$(3)
CNT2&=CNT2&+1

while CHECKEVENT :CALLEVENT :wend '未処理イベントの処理
FRUN=0 '次のタイマー通知へ
if CNT1& < 50 then *LOOP1 '繰り返し

*ENDING
if CHECKOBJECT(TIMER1) then TIMER1.ENABLE 0 'タイマー停止
if CHECKEVENT then CALLEVENT
if CHECKOBJECT(TIMER1) then TIMER1.DETACH 'オブジェクトと切り離し
close

gosub *SAVEDATA 'データ保存の作業
erase TT&, RR$ :CNT1&=0:CNT2&=0
while CHECKEVENT :CALLEVENT :wend
stop:end

*SAVEDATA
'**このサブルーチンでデータを保存 例:バイナリ形式で
'**for I&=1 to CNT2&:fwrite #3,TT&(I&)
'**fwrite #3,RR$(0,I&)
'**fwrite #3,RR$(1,I&):fwrite #3,RR$(2,I&):fwrite #3,RR$(3,I&):next

'これはテスト:データ画面表示
for I&=1 to 50:print TT&(I&),RR$(0,I&);RR$(1,I&);RR$(2,I&);RR$(3,I&):next
return

'================================================================
' タイマーイベント プロシージャ
declare sub TIMER1_TIMER edecl ()
sub TIMER1_TIMER()
shared FRUN as long, FEND as long
shared TIMER1 as object
var RES as long
'print "Test:タイマー";time$
if FRUN then
TIMER1.ENABLE 0 'タイマー停止
FRUN=-1:FEND=-1 '終了
RES=MESSAGEBOX("TIMER1","処理時間があふれました!",0,0)
exit sub
end if
FRUN=-1 'タイマー通知があった
end sub
'================================================================
' メインフォーム が閉じられようとしている
declare sub MAINFORM_QUERYCLOSE edecl ( CANCEL%, byval MODE% )
sub MAINFORM_QUERYCLOSE( CANCEL%, byval MODE% )
shared FRUN as long, FEND as long
FRUN=-1
FEND=-1 '処理終了させる
end sub

665名無しさん:2015/11/11(水) 10:22:32
ありがとうございます。

いきなり本題に入るのは敷居が高いので、作成していただいたプログラムに入る前に準備をしてみたいと思い、下記を参考にしてフォームを作ってみました。これはOK.
http://www.fmworld.net/product/soft/fbasic/gpib/

次に時計マークのアイコン(タイマーコントロール)を選択してフォームに貼りつけ。
[TIMER]と書かれたアイコンがフォームに表示されます。
これをダブルクリックすると、ウィンドウが開いて、プログラムが書けるようになりました。
ここに print "hello" としても画面に表示されない。
ちょっとマニュアルを探して勉強してみます。早く参考書も探さなくては。

666名無しさん:2015/11/12(木) 04:31:17
>>665
>ここに print "hello" としても画面に表示されない。

 ヘルプの「タイマーコントロールへの操作」にあるようにATTACHやENABLEをしているなら
たぶんイベントチェックのループを実行していないから。
 いちから作成する場合は、プロジェクト ウィザードで作成すると一通り新規作成されます。
(メニュー:プロジェクト(P)-ウィザード(W)) 注:既存の.BASファイルとかつぶさないように。
ヘルプで「イベント駆動処理プログラムの作成手順」を検索して参照。

#include "windows.bi"

while 1:WAITEVENT:wend

これが作成されたイベントチェックするループです。これを見て疑問に思うでしょう。
『あれ、無限にループしているのにこれを実行するとタイマーが動くの?』
WAITEVENTは、WAIT“I”命令(割り込み処理発生まで停止する)に似ています。

 イベントチェックのループ(メッセージ処理)とは何か、たとえ話をすると、

 あなたはWindowsさんからのはがき(タイマー通知)が郵便配達されてくるのを待っています。
でもいつ到着するかなんてわかりません。郵便受けの前で待ちつづけるわけには・・。
 そこである人(イベントチェックするループ)に依頼します。
「郵便受けで待って届いたら持ってきて。」その人は根気よく待ちました。
やがて配達人がきてあちこちの郵便受けに、はがきを一枚づつ投函していきます。
 自分の郵便受け(自分が作成したプログラム)の中にはがきの束を見つけたので、
その人はその束を持って戻り、はがきの到着した順番に宛て名を見て、皆に配り始めました。
(*順番にとはいっても「至急」とスタンプされたものは優先し、「新装開店」だとか
後まわしでいいようなものは最後にしたり、「同じ割引券のはがき」は一つにまとめたりと、
この人、できる秘書さんかも)
「これはAさん..これはBさん、これはまたAさん宛てです・・」やがてあなたの前にきて、
「はがき(タイマー通知)が届いてました、速やかに処理してください。」あなたははがきを
待ってはいたのですが、いろいろとほかにやることがあるのでその後で見ようとしました。
 ですが、この人はあなたの前から一歩も動こうとしません。不思議に思い理由を問うと
『あなた様がはがきを読んだことをしかと確認し、必要であればご返事をいただくまでが
私の役目です。速やかに処理してください。』と言われてしまいした。
その強い意思に射抜かれあわてる、あなた。
モタモタしていると、向こうの方からCさんやDさんたちの声が漏れてきました。
「まだはがきがあるじゃないか、おれたち宛てのものはあるのないの、どうなってるの!?」

667名無しさん:2015/11/16(月) 08:32:19
こんにちは

返信が遅くなって申し訳ありません。
そして、わかりやすいイベントチェックのループのたとえ話ありがとうございます。

>いちから作成する場合は、プロジェクト ウィザードで作成すると一通り新規作成されます。
これでやってみます。

とりあえず、少しまとまった時間が取れれば。ダイアログにタイマーの設定時間:1/100単位と実行回数を書き換えられるようにして、実行ボタンを押せばtime$を画面に表示するプログラムを作ろうと思います。

668名無しさん:2015/11/16(月) 09:20:25
>>667
タイマー間隔をシビアにした場合、画面に表示することが、
時間間隔の乱れの要因になることがあるかもしれません。
フォームを作成したF-BASIC/Winのテキスト表示は遅い
ということもありますし。
(画面表示速度改善については586番,592番あたり参照)

669名無しさん:2015/11/17(火) 02:09:42
ハード・ソフト両面で環境の差の影響が大きいのですが、参考値として
PRINT命令でMILLITIME関数で取得する数値に影響する度合いを
試してみました。条件はフォームを作成してフォント変更・サイズを大きくします。
80桁24行の互換モードで画面のグラフイックの機能設定はONのまま。
PRINT命令で4文字出力(改行なし)を連続実行してどの程度で
MILLITIME関数の値が変わるかテスト。
なおテストした環境でのMILLITIME関数の計測分解能は10msでした。

テスト結果、最大でも、PRINT命令 70回程度。平均としてはその半分程度。

なお、テキストのスクロールを発生させた場合は、即影響が出ます。

670k5:2016/01/06(水) 11:51:33
こんにちは

昨年はたいへんお世話になりました。

ずっと他の仕事に追いまくられて、F=BASICのイベント型プログラムに取り掛かれません。
もちろん、頭の切り替えができないという情けない現状もあります。

少しだけ時間ができたので、「ON INTERVAL GOSUB」を使ってみました。
INTERVALを5秒くらいにして実行させてみると、1時間で5〜10秒ほどずれました。

cls

interval 5.0 '60秒毎に割り込みます.
on interval gosub *KAKE
interval on
do
loop
interval off
stop
end
'

*KAKE

print date$,time$

return

これでもいいのですが、もう少し何とかならないだろうかと、こんな簡単なプログラムにしました。
(とても稚拙でお恥ずかしい)


cls

KANKAKU=5.0

OWARI = (date*86400+millitime/1000.0)+KANKAKU

do

NOW =(date*86400)+(millitime/1000.0)

if NOW >= OWARI then print date$,time$,millitime:OWARI=NOW+KANKAKU

loop

input AAA$

stop
end

これで実行すると、前よりはましみたいです。
もう少し、頑張ってみますので、
今年もよろしくお願いします。

671名無しさん:2016/01/08(金) 12:49:18
>>670
>INTERVALを5秒くらいにして実行させてみると、1時間で5〜10秒ほどずれました。

確かにずれていきますね。TIME割り込み命令の方で毎回つぎの5秒後を設定する方法にして
みましたが同じ結果でした。

> NOW =(date*86400)+(millitime/1000.0)

これは単精度変数だと有効桁数が足りないので、数ヵ月後には数値が狂うのでは?
millitimeも秒未満の桁が削れていく?

そこは、こんな感じでしょうか。年越しもできるし。

OWARI =(millitime/1000.0)
do
NOW =(millitime/1000.0):if NOW < OWARI then NOW=NOW+86400
if NOW >= OWARI+KANKAKU then print date$,time$,millitime :OWARI=NOW
loop


5秒で数百万回時計を見にいくというのも・・・ CPU100% ...。

672名無しさん:2016/01/08(金) 13:16:19
>>670
長くなってしまいましたが..。millitimeの時刻読み取りを減らして見ました。
---それでも数万回、時刻読み取りするけど。
(例えるとゴルフでパターを刻んでいくようなもの)
1. interval割り込みで、4秒(以内)待ち。
2. WAITで0.1秒単位待ち。
3. 回数限定無限ループで時間つぶし。(for MUGEN_CC=・・)←※外した方が定時性はあがる。
4. 豪腕でループぶん回してmillitimeを読み続けて時刻合わせ。


deflng A-Z 'ここから暗黙の型を32bit整数型にします。
var KANKAKU, OWARI, NOW
var MUGEN_CC, MUGEN_NN, MUGEN_NN2
var KAISU%

cls
gosub *MUGENSENS

KANKAKU=5
print time$, millitime/1000#
gosub *JUSTTIME
print time$, millitime/1000#

KAISU%=0 :do while KAISU% < 720 '実行回数
gosub *JUSTTIME '時刻合わせ
print date$,time$,millitime

'*** input AAA$

KAISU%=KAISU%+1 :loop
'
stop:end
*KAKE: print date$,time$ :return
'
*JUSTTIME2:return
*JUSTTIME
OWARI=KANKAKU-(time mod KANKAKU)
if OWARI >= 2 then '差が2秒以上あるならば、
interval OWARI-1 '秒単位の割り込み。ただし1秒残す。
on interval gosub *JUSTTIME2
interval on
waiti '設定している割り込みが発生するまで停止します。
interval off
end if
OWARI=1000-(millitime mod 1000)
if OWARI >= 100 then
wait (OWARI \ 100)*10 '1/100秒単位:0.1秒粗く待つ
endif
OWARI=1000-(millitime mod 1000)
if MUGEN_NN then for MUGEN_CC=(MUGEN_NN / 1000)*(OWARI \ 10)*10 to 0 step -1:MUGEN_NN=MUGEN_NN:next

if KANKAKU-((millitime \ 1000) mod KANKAKU)>= 2 then print "Time Over!!"
OWARI=1000-(millitime mod 1000)
MUGEN_CC=0
do 'ループしてmillitimeを秒単位チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime \ 1000) mod KANKAKU
loop until NOW=0
return
'
*MUGENSENS2 :MUGEN_NN=MUGEN_CC :return
*MUGENSENS
interval 1
on interval gosub *MUGENSENS2
MUGEN_CC=0:MUGEN_NN=0
interval on
waiti '1回目発生待ち
for KAISU%=1 to 3
do '2回目以降でループ回数カウント
MUGEN_CC=MUGEN_CC+1
loop until MUGEN_NN
if MUGEN_NN < MUGEN_NN2 or MUGEN_NN2=0 then MUGEN_NN2=MUGEN_NN
MUGEN_NN=0:MUGEN_CC=0
next KAISU%
MUGEN_NN=MUGEN_NN2
interval off
return
end

673k5:2016/01/09(土) 19:59:19
こんにちは

今年もよろしくおねがいします。

>これは単精度変数だと有効桁数が足りないので、
書き込んだ後で、倍精度に直しました。
そうすると、大体1/250秒ほどの精度で時間を取れるようです。

if NOW >= OWARI+KANKAKU
この方法の場合、計測間隔の精度はいいのですが、時間的確度はだんだん正の方にずれて行ってしまいます。やはり、millitimeを基本に計測間隔±0.005秒とかの設定にした方がいいみたいです。ただし、この方法では一度ずれてしまうと、戻らなくなる可能性があります。

考え付くのは、最初に計測間隔と計測のトータル時間を決め、millitimeのリストを作って、±閾値で決めて行く方がいいのかな。あるいは、

if NOW >= OWARI+KANKAKU

のあとで、差分を求めて、その差分を次の間隔から差し引くということです。
つまり、5.1秒だったなら、次は4.9秒にするということです。

>millitimeの時刻読み取りを減らして見ました。
これ頂きます。waitだけ使うともっと簡単になりますね。

>(例えるとゴルフでパターを刻んでいくようなもの)
あ、いい例えですね。

それにしてもBASICは素晴らしい。
これで、USBシリアル変換のケーブルが使えれば、もっといいんですけど。

674671:2016/01/10(日) 04:27:34
>>673
>millitimeを基本に計測間隔±0.005秒とかの設定にした方がいいみたいです

そのようですね。PCの時計は使用状況(連続稼動時間・休止時間)によりますが、
だいたい月差30秒程度だと思うので。

時刻精度はOS・ハード構成によって違うでしょうから。Windows Vista以降だと
ハードウェアで「高精度イベントタイマー」を使えますが。

>millitimeのリストを作って、±閾値で決めて行く ・・・

>if NOW >= OWARI+KANKAKU のあとで、差分を求めて、その差分を次の間隔から差し引く

方法はどちらでもいいと思いますが、
「時刻(定刻)」、「時間(間隔)」のどちらを重視するかということですね。
基準となる時刻はなにを採り、どうやって取得するのか、
取れないのならどうやって近似値を作り出すか。


毎5秒として、つぎのようなパターンは許容できるのか?
・04.99秒・09.99秒(つまりマイナス方向、-0.01)の振れは許容できるのか
(見た目の1秒差:時刻05秒のはずが04秒に)。
・04.99秒・10.01秒(つまりプラスマイナス両振れ、間隔としては0.01の2倍の差)は。
・たとえば日本標準時から「平均的にほぼ一定」で時刻が進んでいくまたは遅れていく。
・仮定として、他の計測データとのなんらかの照合をすると時刻・時間の基準が違うが。
・millitimeを補正した場合、PC上の日付時刻と、補正日付時刻と、二重に日付時刻が生じるが
何らかの証跡として問題ないか。

差分補正はどう処置するのが問題に。
・04.99秒なので次は+0.01補正したのに、09.95秒だった。次は+0.05か+0.06か+0.04補正か。
・04.97秒なので補正していったら09.98秒、15.99秒、次はいきなり20.50秒になった。
-0.50補正を行うのか。
・04.90秒なので補正したらなぜか11.00秒になった。異常値として破棄するのか

○差分補正の欠点は誤差が蓄積されて長時間はもたないこと。誤差をさらに差分補正…。


>USBシリアル変換のケーブルが使えれば
仮想COMポート(COM1からCOM5まで)で割り当てができてハイパーターミナルから使えるもの
なら使えるかもしれない。

675k5:2016/01/10(日) 10:00:10
>「時刻(定刻)」、「時間(間隔)」のどちらを重視するかということですね。
定刻を基本に、間隔が揃っているのが好ましいです。

たとえば、初期値として「時間(間隔)」と計測期間(回数)を与えると、計測するべき時刻(定刻)」は自ずから決まってくるので、それをmillitimeで見ればいいかなと。この場合、時間の触れが+方向に限定されるのが少し気になるところ。

millitimeを一日まわして気づいたのですが、時間によってmillitimeの揺らぎ精度が違うみたいです。1/100になったり、1/1000になったり。割り込みやデーモンとの関係があるんでしょうね。やはり、目標値を1/100秒程度がいいところなのかも知れません。あくまでもmillitimeとtime$は同じハードから時刻を得ているというのが前提ですが。

仮想COMポートとしては認識しているんですが、相手側のシリアルコントローラと相性が悪いのか。使えないことがおおいです。電圧値が違うからなんでしょうか。間にレベルコンバーターなどを入れれば動くのかな。

676671:2016/01/11(月) 03:20:15
>>675
>それをmillitimeで見ればいいかなと。この場合、時間の触れが+方向に限定されるのが少し気になる

millitimeを見張って『仮に時刻ぴったり』にできたとしても、
結局それは「過ぎ去りし時間」で+方向にだけぶれるのはいたしかないこと。
マイナス方向もありということは、時刻ぴったりの『少し前』に合わせるようなもの。
では『少し前』とはどうやって定義して決めるのかが課題。


>あくまでもmillitimeとtime$は同じハードから時刻を得ているというのが前提ですが。

millitimeとtimeは取得元は同じです。

WindowsではPCのRTCは精度が悪いので起動後、別のハード機構からの情報で
カウントして算出しているそうです。
タイマ割り込みより、millitimeの方が若干精度が高いということ。

タイマ割り込みはWindowsの互換性維持のため、精度は低いままです。


>millitimeを一日まわして気づいたのですが、時間によってmillitimeの揺らぎ精度が違うみたいです。

非リアルタイム系OSの宿命です。そもそもmillitimeを取得する行為そのもの、そして結果を
画面等に出力すること自体が「ゆらぎ」の発生源のひとつなのですから。

>やはり、目標値を1/100秒程度がいいところなのかも知れません

いかに無限ループでmillitimeを観測しようと、プリエンティブなマルチタスクOSなので、
どこかで実行権を剥奪されるので、タスク切り換え単位以下の精度を維持しつづけることは
できないので、計測時間範囲で平均値を維持するのがやっとのはずです。
まあ極論、OSをWindows Ver.3.1、F-BASIC for Windows (V3.1)にすればということですが。


>割り込みやデーモンとの関係があるんでしょうね
そういうことですね、高精度を維持したければ、
割り込みがかかる不要なハードはすべてドライバ無効化(USBなんぞ禁止)、
不要な「サービス」はすべて停止、スクリーンセーバ等禁止、省電力機能禁止、
ウイルス対策ソフトなど常駐モノは完全にキル。
NTPによる時刻同期も当然禁止。ネットワークもハード(NIC)ごと停止。
メモリ(RAM)が大量にあるならば仮想記憶のスワップファイルをゼロに。

計測中は一切画面に経過表示せず、計測データはディスクに書かずメモリに保持、
「ペンキ塗りたて」ならぬ「マウス・キーボード触るな」
張り紙が必要な精度ですね。

>電圧値が違うからなんでしょうか。間にレベルコンバーターなどを入れれば動くのかな。
うーん、USB変換ケーブルタイプはそんな感じなんですか...
電圧に関して規定がゆるいですからね。
PC/AT機のシリアルポートはケープル長が2m〜3mが限界だとかいう虚弱ぶり。
そんなのをみならっているんでしょうかね。

RS-232なら規格限界値15mだったっけ?

677k5:2016/01/11(月) 11:12:39
LinuxでGPSを使ったNTPサーバーを運用する場合、大まかな時間(1秒)はntpであわせて、それ以下はGPSから来るPPSであわせるので、これが簡単でいいところななのかと思っています。

いろいろと考えてみると、計測間隔は1/100〜1/10程度の精度で時刻は1秒以内という辺りがよさそうです。つまり、3日間連続で計測していても、定刻は秒レベルではあっている。time$で確度、millitimeで精度を確保すると。明日にでもやってみます。

>うーん、USB変換ケーブルタイプはそんな感じなんですか...
>電圧に関して規定がゆるいですからね。
USB変換チップとドライバとシリアル機器側のコントローラの組み合わせみたいですが、F-BASICを使うとほとんど動かないみたいです。実験する時は、古いシリアルポート付のノートPCを使っています。

678名無しさん:2016/01/14(木) 09:03:45
こんにちは

昨日は、times$が更新(10秒ごと)された直後のmillitimeを見てみました。
こんな簡単なプログラムです。

cls

do
if right$(time$,1)="0" then gosub *KAKE
if right$(time$,1)<>"0" then flg=1
loop
stop
end
'

*KAKE

if FLG=1 then print time$,millitime:FLG=0

return

8時間ほど走らせた結果、millitimeの末尾4桁はほとんど0000でした。

14:50:50 53450000
14:51:00 53460000
14:51:10 53470000
14:51:20 53480000
14:51:30 53490000
14:51:40 53500000
14:51:50 53510000
14:52:00 53520000
14:52:10 53530000
14:52:20 53540000
14:52:30 53550000
14:52:40 53560000
14:52:50 53570000
14:53:00 53580000
14:53:10 53590000
14:53:20 53600000
14:53:30 53610000

あくまでもPCのタイマーの表示ですが。F-Basicのmillitimeは貴重な命令ですね。

679名無しさん:2016/01/15(金) 01:56:54
>>678
>8時間ほど走らせた結果、millitimeの末尾4桁はほとんど0000でした。


 millitimeとtimeは取得元は同じで、直近上方に丸めることはないと思いますので、
millitimeの末尾3〜4桁(おそらく最後の1/1000の位は除き)がゼロでないというのは
無いはずです。

この場合、注目すべき点は、 ほ・と・ん・ど が0000であること。
ということは、0000でないものが存在しえたということ。

それは単純に豪腕ループでtime$を常時監視続けただけでは回避できないということ。


timeの時刻精度では1〜2時間でGPS取得との差異が許容誤差範囲を超えるのでは?

680名無しさん:2016/01/15(金) 03:01:18
本当に出会える出会い系ランキング
http://bit.ly/1MVgwpz

681名無しさん:2016/01/15(金) 04:13:42
>>680 :名無しさん :2016/01/15(金) 03:01:18
過疎板には貼っても無意味

682名無しさん:2016/01/15(金) 09:04:48
ちなみにprint文の前にwait100を入れると、末尾4桁は0100になりました。
millitimeでやっても同じみたいです。
if millitime mod 10000 = 0 then gosub *KAKE

ただ、print文を入れるとかなり揺らぐみたいです。
あまり深くは考えずに、間隔はtimeでやって、時刻はRTCとNTPに任せます。

>timeの時刻精度では1〜2時間でGPS取得との差異が許容誤差範囲を超えるのでは?
一日で1秒以内とすると、1/10万程度の精度になるんですね。GPS受信機の内蔵時計の精度が30ns程度と言われていますので、これだと1年で1秒くらいですか。たしかに、GPS受信機の大部分が位置情報ではなく時間同期に使われているというのは納得です。

最近は高精度のクロックが売られるようになったので、これでも使ってみるかな(冗談です)
http://www.microsemi.com/products/timing-synchronization-systems/time-frequency-references/chip-scale-atomic-clock

683名無しさん:2016/01/16(土) 04:24:08
>>682
末尾4桁(0000)とは正確なハード環境みたいですね。

>ただ、print文を入れるとかなり揺らぐみたいです。

テキスト画面のスクロールが発生するとかなりのペナルティをくらいます。(>669)

経過表示を入れるのならスクロールをしないように先頭行に戻して上書きで表示する
方法をとる必要があるでしょう。


>GPS受信機の大部分が位置情報ではなく時間同期に使われているというのは納得です。

GPSは基準時刻との時差そのものがカギ。相対性理論による補正を必要とする世界。
位置情報は新鮮な地図(高低差)と補正がカギ。

684k5:2016/01/16(土) 10:12:44
>末尾4桁(0000)とは正確なハード環境みたいですね。
DELLのワークステーションです。

>経過表示を入れるのならスクロールをしないように先頭行に戻して
>上書きで表示する方法をとる必要があるでしょう。
そうします。

>GPSは基準時刻との時差そのものがカギ。相対性理論による補正を必要とする世界。
特殊と一般、両方使われていますね。私のフィールドでは時差も使いますが、位相差も使います。2台のGPSで同じ信号を受信してその位相差で相対位置を求めます。

Linuxでもbasicが動かないかと調べていたら、freeBasicという処理系があるようです。これはQBコンパチみたいなので、少し期待しています。

685名無しさん:2016/01/16(土) 10:50:20
>>684
>2台のGPSで同じ信号を受信してその位相差で相対位置を求めます。

そういう使いかたがあるんですね。

Linuxの方がタイムスライスの粒度が細かいので、向いているでしょうね。

686k5:2016/03/20(日) 13:03:40
また、相談させてください。

GPSから1秒ごとに出力されるデータを読み込んでPCのディスクに書き込んでいます。
データは文字で90バイトほどの固定長です。
プログラムはこんな感じです。


baud 0,9600
open "COM0:" for input as #1
open "nmea.txt" for create as #2

do

line input #1,GPGGA$
open "nmea.txt" for create as #2
print #2,GPGGA$

loop

しばらく(10分ほど)は動くのですが、読み出すタイミングが悪いのか、やがてプログラムがハングアップしてしまいます。フロー制御も、OFF、xon/off、ハードと試してみたのですが同じです。仕方がないので、teratermのログとして保存していますが、やはりプログラムから直接読めた方が便利です。

計測機器から一定時間で流れてくるデータを読む方法って、やはりイベント駆動型にした方がいいんでしょうか。

687名無しさん:2016/03/20(日) 19:31:46
女に年収バレた結果www
http://bit.ly/1R5A6lq

688名無しさん:2016/03/23(水) 04:14:49
>>686
対症療法としては10分たつ前にCOM0: をcloseして再オープンしてみるとか。


ハングアップするならline input# でしょうから、こんなかんじだとどうでしょうか。
(*改行コード含め90バイトとして。)

CHK_TIME%=((time mod 60)+2) mod 60 'リミットをおよそ2秒後に設定
do while lof(1) < 90
if (time mod 60) = CHK_TIME% then print "**受信エラー**" :exit do
loop
if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)

if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)

689k5:2016/03/23(水) 10:24:09
ありがとうございます。教えていただいたコードを組み込んで実行したところ、30分を経過してもまだ止まっていません。今日一日、ログをとり続けてみます。またご報告します。

690k5:2016/03/23(水) 19:44:23
こんばんは

8時間たっても動いています。
このコードは大切に使わせていただきます。
ありがとうございました。

691名無しさん:2016/03/26(土) 03:05:55
【キャリア】40歳になってようやくわかる8つのこと。
http://bit.ly/22ru7TF

692名無しさん:2016/03/27(日) 04:29:54
プログラム(>672)は
KANKAKUを1秒に設定にすると正常に動作しないので、サブルーチンを修正しておきます。
それから*MUGENSENSおよび*MUGENSENS2サブルーチンは削除します。
処理内容は変更しました。
1. interval割り込みで、2秒未満まで待ち。
2. WAITで0.1秒単位待ち。
3. 指定時刻まで残り時間が0.1秒近くある場合は一回WAITで待って、完了とする。
4. 3の処理をしない場合に限り、豪腕でループぶん回してmillitimeを読み続けて時刻合わせ。

ソフト・ハード両環境によるが、次の1行を順次変更することで精度を上げられるかもしれません。
→→ if OWARI>=30 and OWARI < 100 then wait (1+(OWARI \ 10)) :return
1. if OWARI>=30 and OWARI < 100 then wait (0+(OWARI \ 10)) :return
2. if OWARI>=30 and OWARI < 100 then wait (0+(OWARI \ 10))
3.コメントアウトしてプログラムから外す。
※2、3の変更案は、負荷がかかります。


*JUSTTIME2:return
*JUSTTIME
OWARI=millitime
if (OWARI mod 1000)>=900 and KANKAKU>=2 then
OWARI=1000-(OWARI mod 1000)
wait 1+(OWARI \ 10) 'ここは越えるようにする
endif
OWARI=KANKAKU-((millitime \ 1000) mod KANKAKU)
if OWARI >= 2 then '差が2秒以上あるならば、
interval OWARI-1 '秒単位の割り込み。ただし1秒残す。
on interval gosub *JUSTTIME2
interval on
waiti '設定している割り込みが発生するまで停止します。
interval off
end if
OWARI=1000-(millitime mod 1000)
if OWARI >= 100 then
wait (OWARI \ 100)*10 '1/100秒単位:0.1秒粗く待つ
endif

OWARI=1000-(millitime mod 1000)
if OWARI>= 100 then MUGEN_CC=-1:return '←TIME OVER!!
OWARI=millitime
if KANKAKU-((OWARI \ 1000) mod KANKAKU)>= 2 then
MUGEN_CC=-1 :return '←TIME OVER!!
OWARI=1000-(OWARI mod 1000)
else
OWARI=1000-(OWARI mod 1000)
endif

OWARI=1000-(millitime mod 1000)
MUGEN_CC=0
if OWARI >= 100 then return
if OWARI>=30 and OWARI < 100 then wait (1+(OWARI \ 10)) :return
if KANKAKU < 2 then
do 'ループしてmillitimeを秒未満チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime mod 1000)
loop until NOW<900
else
do 'ループしてmillitimeを秒単位チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime \ 1000) mod KANKAKU
loop until NOW=0
endif
return

693k5:2016/03/30(水) 09:29:23
さっそく、このコードで試してみました、
この精度(確度)で十分です。
ありがとうございました。


deflng A-Z 'ここから暗黙の型を32bit整数型にします。
var KANKAKU, OWARI, NOW
var MUGEN_CC, MUGEN_NN, MUGEN_NN2
var KAISU%

cls
'gosub *MUGENSENS

KANKAKU=5
print time$, millitime/1000#
gosub *JUSTTIME
print time$, millitime/1000#

KAISU%=0 :do while KAISU% < 720 '実行回数
gosub *JUSTTIME '時刻合わせ
print date$,time$,millitime

'*** input AAA$

KAISU%=KAISU%+1 :loop
'
stop:end
*KAKE: print date$,time$ :return
'
*JUSTTIME2:return
*JUSTTIME
OWARI=millitime
if (OWARI mod 1000)>=900 and KANKAKU>=2 then
OWARI=1000-(OWARI mod 1000)
wait 1+(OWARI \ 10) 'ここは越えるようにする
endif
OWARI=KANKAKU-((millitime \ 1000) mod KANKAKU)
if OWARI >= 2 then '差が2秒以上あるならば、
interval OWARI-1 '秒単位の割り込み。ただし1秒残す。
on interval gosub *JUSTTIME2
interval on
waiti '設定している割り込みが発生するまで停止します。
interval off
end if
OWARI=1000-(millitime mod 1000)
if OWARI >= 100 then
wait (OWARI \ 100)*10 '1/100秒単位:0.1秒粗く待つ
endif

OWARI=1000-(millitime mod 1000)
if OWARI>= 100 then MUGEN_CC=-1:return '←TIME OVER!!
OWARI=millitime
if KANKAKU-((OWARI \ 1000) mod KANKAKU)>= 2 then
MUGEN_CC=-1 :return '←TIME OVER!!
OWARI=1000-(OWARI mod 1000)
else
OWARI=1000-(OWARI mod 1000)
endif

OWARI=1000-(millitime mod 1000)
MUGEN_CC=0
if OWARI >= 100 then return
if OWARI>=30 and OWARI < 100 then wait (1+(OWARI \ 10)) :return
if KANKAKU < 2 then
do 'ループしてmillitimeを秒未満チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime mod 1000)
loop until NOW<900
else
do 'ループしてmillitimeを秒単位チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime \ 1000) mod KANKAKU
loop until NOW=0
endif
return

694k5:2016/03/30(水) 09:44:54
最近の計測器でbluetoothで接続するタイプが増えているみたいです。たしかに配線が楽ですからね。windowsの場合はCOMポート接続ができるようです。このCOMポートをF-BASICからアクセスすることができるか、とても興味があります。

誰か、使ったことはありますか?

週末にでもbluetoothが使えるノートPCとbluetooth I/Fの簡単な温度計が借りられるので、F-BASICで使えるかテストしてみます。

695名無しさん:2016/03/30(水) 23:36:54
帰りにロジテックのBluetoothアダプタを買ってきて使ったところ、問題なくcomポートをF-BASICで使うことができました。これはとっても快適です。

購入したBluetoothアダプタはロジテックのLBT-UAN04C2という製品です。
http://bbs.kakaku.com/bbs/K0000373744/

RS-232CをBluetoothで無線化するアダプターが少々高いですが、コードの引き回しや延長距離などを考えると、これはいいです。興味のある方は、ぜひぜひ使ってみて下さい。

696名無しさん:2016/03/31(木) 06:03:14
>>694,695
試用レポート、ありがとうございます。

無線化すると便利だけれどプログラム上は通信エラーの対応処理の省略が
しづらい。

697名無しさん:2016/03/31(木) 09:42:49
そうなんですか、USBシリアル変換ケーブルが全滅状態で、RS232ポートがついているパソコンも少なくなっている時勢に、シリアル通信が出来るのはとても嬉しいです。

あとは、シリアルをBluetoothで無線化するアダプターがもっと安くなればいいなと。今は2万ほどしますからね。安いのは1万ほどであるみたいです。

Linuxを使ってCとかシェルスクリプトでも書いてみたんですが、やはりBASICは慣れているので、細かいところまで融通が利きます。これでまだしばらく、F-BASICが使えそうです。

698名無しさん:2016/04/01(金) 03:30:42
会社クビになって奨学金返済できなくなったんだが契約書にヤバイ文章が見つかった
http://bit.ly/1R5zV9T

699名無しさん:2016/04/01(金) 03:55:31
>>697
まあ、実際は電波を遮る物体が通るとかしなければ、
シリアル通信の速度程度では障害にはならないでしょうから
通信エラーは無視できるリスクでしょう。

物理的なシリアルポートに接続する無線化アダプターでは、
ケーブルなしの直結(ゼロ距離)なので、結果的に
USB-シリアル変換タイプより問題がおきにくいのかもしれません。

ソフトウェア上はBluetoothのシリアル通信のプロファイル(SPP)で
仮想的なシリアルポートとしてやりとりします。

700名無しさん:2016/04/01(金) 08:46:40
Bluetoothは2.4G帯を使うので、電子レンジとかとの干渉はないかと思っているんですが、今のところ大丈夫みたいです。

ただ、Bluetoothのドライバーが作り出す仮想シリアルポートはよくわからなくて、F-BASICではcom5にしないとアクセスできなかったりします。com3とかにすると、その入力装置は使えないというメッセージが出ます。OSやドライバーを作っている会社などの相性があるのも知れません。この辺りは、しばらく手探りが続いてゆきそうです。

701名無しさん:2016/04/02(土) 04:30:59
周波数ホッピングとか軍採用技術が使われているので速度低下ですむかと。

com1からcom4ポートはBIOS設定の関連もあると思います。
オンボードのポートが1つで(Fax)モデムカード等がないなら、
com2, 4ポートが使えるかも。
F-BASICではcom5ポート("COM4:")までしか対応していません。
ps. 仮想COMポートをオープンするのに "\\.\com9" 形式があるらしいの
ですが、オープンはできてもcomポートとしては使えないだろうし。

702名無しさん:2016/04/03(日) 00:16:16
>周波数ホッピングとか軍採用技術が使われているので速度低下ですむかと。
拡散スペクトラムですね。その昔は、話しに聞いているだけでした。身近なところではGPSが一番最初でしたか。CDMAより早かったと思います。

>com1からcom4ポートはBIOS設定の関連もあると思います。
>オンボードのポートが1つで(Fax)モデムカード等がないなら、
>com2, 4ポートが使えるかも。
うーん、この辺り不は不明です。

さきほど、同じプログラムをWindows10(64bit)で動作させましたが、他のポートでも問題なく動いています。このノートPCはbluetoothが標準装備されているので、純正ドライバーによる仮想comポートによる通信が安定しているみたいです。3rdパーティのドライバーとの相性がよくないのかも知れません。本を取り寄せて、bluetoothのお勉強をしなくては。

703名無しさん:2016/04/09(土) 17:17:33
友人関係全部切った結果
http://bit.ly/1Sepcun

704名無しさん:2016/04/11(月) 00:29:31
本当に出会える出会い系ランキング
http://bit.ly/1OgYRt7

705名無しさん:2016/04/11(月) 09:16:26
>688

CHK_TIME%=((time mod 60)+2) mod 60 'リミットをおよそ2秒後に設定
do while lof(1) < 90
if (time mod 60) = CHK_TIME% then print "**受信エラー**" :exit do
loop
if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)

if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)


いつもお世話になります。
せっかくなんで、このコードの意味を解説していただけると勉強になります。
恥ずかしながら、自分なりに読んでみました。

*ここから始まり

CHK_TIME%=((time mod 60)+2) mod 60 'リミットをおよそ2秒後に設定
*現在の通算秒数を分に換算して、そのあまり秒に2秒を足してを待機する上限時間を求める。最後の(mod 60)の意味がよくわかりません。

do while lof(1) < 90
if (time mod 60) = CHK_TIME% then print "**受信エラー**" :exit do
loop

受信バッファが90バイトに達するまで読み込む。
もし、その間に上限時間を超えたらdoープを抜ける

if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)
もし、受信バッファが90バイトに達していなければGPGGA$に入っているだけ代入する。
そうでなければ、、受信バッファから90バイトをGPGGA$に代入する

if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)
GPGGA$の行末コードを削除する

よろしくお願いします。

706688:2016/04/12(火) 02:57:29
問題の有るコードではあるのですが――。疑問点に回答します。

>>705
>最後の(mod 60)の意味がよくわかりません。

これは通算秒数から剰余計算で秒部分(0〜59秒)を取り出した後、
現在時刻が58〜59秒だった場合、2を加算して2秒後を求めただけだと60秒以上になるため。
ラウンドアップへの対処。

>受信バッファが90バイトに達するまで読み込む。

処理1件分のデータが受信バッファにたまるまで『あえて読まずに』待つ。
2秒程度の時間切れ条件判断はもしもの場合の保険。

>もし、受信バッファが90バイトに達していなければGPGGA$に入っているだけ代入する。

補足説明すると、受信データが90バイト固定長以外のデータが受信された場合や途中までしか
送られてこなかったような場合など、とりあえず処理継続することを優先する意図があります。

本来はIF文で場合分けする必要はない(GPGGA$=input$(lof(1), #1)のみですむ)のですが、
問題原因がデータの形式にあった場合などのための対処への意図を含めた結果です。


実際にデータを読み込む処理をしているこの2行についてですが、

>if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)
>
>if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)
>GPGGA$の行末コードを削除する

90バイトそろっているのであれば、
ごく普通にLINE INPUT#1,GPGGA$ ひとつで済ませてもよいとは思いますが、
問題を確実に回避することを優先して、LINE INPUT# を使わないという選択肢をとりました。

707名無しさん:2016/04/12(火) 09:11:22

丁寧な解説、ありがとうございます。

(mod 60)の意味、そうだったんですね。
理解できました。

シリアル通信がbluetoothなどで仮想化されたり、計測器もコントローラーとセンサー部分が無線モデムを使ったシリアル通信をしていると、パケットの衝突などが起きて、データが一定時間流れてこない状況が時たま発生します。伝統的な実物のシリアルケーブルならLINE INPUT#で苦なく読めたデータもこのように工夫しないといけないのですね。教えていただいてとても勉強になりました。今後ともよろしくお願いします。

708688:2016/04/13(水) 02:44:42
>>707
>計測器もコントローラーとセンサー部分が無線モデムを使ったシリアル通信をしていると、
>パケットの衝突などが起きて、データが一定時間流れてこない状況が時たま発生します。

なるほど、昨今そういった状況になっているのですね。

 ただ、「(ある/一定)時間流れてこない」といった状況でLINE INPUT# が使えない
わけではないはずです。COMポートに対してのLINE INPUT#は、改行コードが流れてくるまで、
「F-BASIC内部でいろいろ処理しながら」待ち続けるのが仕様です。
(ただしopen命令でタイムアウト指定をしない場合)
改行コードが文字化けしない限りは問題ないはずなのです。

問題の発生要因は、RS/CSなどの制御線の制御タイミングが関わっていると見るのが妥当です。

シリアル通信プロファイル(SPP)による通信のエミュレートや、計測器側の動作も含め、
相性問題もあるかもしれません。

709名無しさん:2016/04/13(水) 17:40:05

>なるほど、昨今そういった状況になっているのですね。
PCからはシリアルポートがなくなりつつありますが、周辺機器ではまだまだ現役ですからね。

>シリアル通信プロファイル(SPP)による通信のエミュレートや、
>計測器側の動作も含め、相性問題もあるかもしれません。
SPPの品質はスタックの出来次第らしいです。東芝やモトローラーのが評判いいです。もう東芝は外販していないみたいですが、bluetooth付のdynabookは安定していると聞いています。またもうディスコンになった東芝のusbドングルもプレミアがついて驚くほどの高値です。

710名無しさん:2016/04/15(金) 16:54:56
本当に出会える出会い系ランキング
http://bit.ly/1OgYRt7

711名無しさん:2016/04/20(水) 15:28:30
本当に出会える出会い系ランキング
http://bit.ly/1OgYRt7

712名無し:2017/02/24(金) 23:18:46
何方か教えて下さい、長く使用してなかったのですが、思い付きでfbasicをWidows7に入れてみたら結構動くのが解って、
今いろいろ試して楽しんでいます、使ったことの無い Choosefont(****,0,0) 命令の書き方が解りません。
**** の部分にはガイドでは「フォント」と書いてありますが、何方か詳しく教えて頂けませんか、フォント名の変更に
苦労してます。

713名無しさん:2017/02/27(月) 05:38:49
CHOOSEFONTの 「フォント」にはFONT構造体型の変数を指定します。
フォント選択ダイアログで選択されたフォントの情報がFONT構造体に格納されます。

#include "WINDOWS.BI" '-- FONT構造体の定義が読み込まれます。
var FFONT as FONT '---- 変数名FFONTの「FONT構造体」を宣言

 ヘルプ「プログラミングガイド」の [ダイアログボックス] - [コモンダイアログボックス]の
頁の[フォント選択ダイアログボックス]の説明にプログラム例があります。

SETFONT命令などでフォントの設定をしてから描画命令を実行します。

FONT構造体型の内容です(※ヘルプのどこかの頁には誤記があったような気が)。
type FONT

size as single 'フォントサイズ
bold as integer 'ボールド(太字)指定の有無
italic as integer 'イタリック(斜体)指定の有無
underline as integer 'アンダーライン(下線)指定の有無
strikeout as integer '消し線指定の有無
ffname as string * 32 'フォント名

end type

 なお、このFONT構造体はF-BASIC専用です。Windows APIのFONT構造体等とは違いますので、
F-BASICの組込命令を使用せずにフォント選択ダイアログを呼び出したり、
Windows APIでフォント操作をする場合には適用できません。

714名無し:2017/03/10(金) 21:50:57
ご指導有難う御座いました、不在にしてたので遅くなりました。「プログラミングガイド」に
少し記載がありました。いろいろ試してみます。今でもXPで使用してる古いソフトをリニュウアル
してみようと思っています。また解らないことがあったら投稿します。有難う御座いました。

715keinin55:2017/11/21(火) 08:48:57
F-BASICのBinにあるエラー解析ツールFBANZ63.EXEについてご教授ください。
プログラムでエラーが発生した時、解析ツールのレジストリー読込みで表示されるエラー状況の中に
APIエラーという項目がありますが、この値はどこを参照しているのでしょうか
レジストリーの場所?が解れば教えてください。

716名無しさん:2017/11/22(水) 08:13:29
>715 keinin55 様
FBANZ63.EXEのメニュー[レジリストリ(R) - 読み込み(R)]で表示される内容の参照元は
レジストリ“HKCU\Software\FUJITSU\F-BASIC V6.3\RUNTIME\ERROR”キーらしい。

APIERR [DWORD値] - たぶん「APIエラー」の参照元
CODE [DWORD値] - たぶん「エラーコード」のコード値(F-BASICのERR関数の値)
FUNC [DWORD値] - たぶん「内部関数名」を示すコード値、おそらく3Bytes長範囲値
INFO [DWORD値] - たぶん「補足情報値」おそらく1Byte長範囲値

おそらくはFUNC+INFOとランタイムバージョンとで、F-BASICランタイム内部でエラー
トラップした個所が推定できる。

717k5:2018/09/06(木) 17:35:13
こんにちは

相変わらず頑張ってF-BASICを使っています。

今回はWindows10で動くバッチファイルの中でforループから抜け出す判断をF-BASICで作ったプログラムで行おうと思っています。たとれば、このようなバッチファイルの中でhoge.exeというプログラムをF-BASICで作った場合、コマンドの実行結果としての戻り値(終了コード)を出すような関数はF-BASICに用意されていますでしょうか。

setlocal enabledelayedexpansion
for %%f in (*.txt) do (
call hoge.exe %%f
if !ERRORLEVEL! == 1 @echo %%f:ダメです。>> log.log
if !ERRORLEVEL! == 0 @echo %%f:OKです。>> log.log
)
endlocal

https://qiita.com/OutOfServiceExeption/items/031f9b55f35489624a3b

718k5:2018/09/06(木) 17:55:30
すいません、自己解決しました。

endを使えばでいいんですね。

echo off

setlocal enabledelayedexpansion
for /l %%a in (1, 1, 10) do (
call print_env.exe
if !ERRORLEVEL! == 1 @echo 1です。
if !ERRORLEVEL! == 0 @echo 0です。
)
endlocal

print_env.bas

print "hello"
end 1

719k5:2021/02/16(火) 08:36:51
こんにちは、まだF-BASICで頑張っています。

テキストファイルをシーケンシャルモードでopenして何行か読んだ後に、また少し戻って読み直すのって出来ましたでしょうか。

例えば、

open "test.txt" for input as #1

input #1,line1$
input #1,line2$
input #1,line3$
input #1,line4$
input #1,line5$

とした後に、また3行目のline3$を読みたい場合、現在のファイルポイントから3行前に戻るという命令はなかったでしょうか。

720名無しさん:2021/02/21(日) 04:17:41
いくつか方法はあると思いますが、
1.バイナリモードでオープンすればseek命令/関数が使えますが、FREADで読みこむことになります。
2.open for inputを同時に複数オープンしておき、読込処理行数をカウントしながら読み、
戻る必要がある分についてはもう一方のオープンしたほうで遅れて読み進めることで代替。
3.戻る可能性のある行数分の配列変数を用意しておき、配列に格納しながら読み進めることで代替。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板