ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月21日(火) 13:07

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 
作成者 メッセージ
 記事の件名: 自己表示プログラム
投稿記事Posted: 2008年5月31日(土) 16:59 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
自己表示プログラムを書いてみました[hide]
コード:
#console
Sub a(b As String)
 Print b+Ex"\na(Ex\q"+c(b)+Ex"\q)\nSleep(-1)"
End Sub
Function c(a As String) As String
 Dim i As Long,j As Long,k=0 As Long,h As *Byte
 j=Len(a)
 h=calloc(j*2)
 For i=0 To j
  If a[i]=10 then
   h[k]=92
   h[k+1]=110
   k++
  Else If a[i]=34 then
   h[k]=92
   h[k+1]=113
   k++
  Else If a[i]=92 then
   h[k]=92
   h[k+1]=92
   k++
  Else
   h[k]=a[i]
  End If
  k++
 Next
 c=MakeStr(h)
 free(h)
End Function
a(Ex"#console\nSub a(b As String)\n Print b+Ex\q\\na(Ex\\q\q+c(b)+Ex\q\\q)\\nSleep(-1)\q\nEnd Sub\nFunction c(a As String) As String\n Dim i As Long,j As Long,k=0 As Long,h As *Byte\n j=Len(a)\n h=calloc(j*2)\n For i=0 To j\n  If a[i]=10 then\n   h[k]=92\n   h[k+1]=110\n   k++\n  Else If a[i]=34 then\n   h[k]=92\n   h[k+1]=113\n   k++\n  Else If a[i]=92 then\n   h[k]=92\n   h[k+1]=92\n   k++\n  Else\n   h[k]=a[i]\n  End If\n  k++\n Next\n c=MakeStr(h)\n free(h)\nEnd Function")
Sleep(-1)
[/hide]4.23で動作を確認しました。

どうやら定数文字列の文字数に何らかの制限がある模様で、それの回避に苦労しました。

誰かもっと短い奴か、又は異なる方法を用いた奴書いてください(メモリリークを無視するような短縮方法は遠慮してください)

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2008年6月01日(日) 11:11 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 895
住所: 東京都
私も以前やりました:自分自身を出力するプログラム
ただ、当時のAB5用なので、今のAB5ではできませんでした。
というわけで修正版です。
コード:
#console
Dim s = "Print Ex'#console\r\nDim s = \q' + s + Ex'\q, t = \q' + t + Ex'\q' : Print s.Replace(Asc(t), Asc(Ex'\q'))", t = "'"
Print Ex"#console\r\nDim s = \q" + s + Ex"\q, t = \q" + t + Ex"\q" : Print s.Replace(Asc(t), Asc(Ex"\q"))
AB4は文字列置換のサブルーチンがないのがつらいです。上のコードをAB4.24に移してみましたが、まだReplaceChrサブルーチン部分を出力しない不完全な出来です。
コード:
#console
Sub ReplaceChr(ByRef s As String, oldChar As Byte, newChar As Byte)
	Dim i As Long
	For i = 0 To Len(s) - 1
		If s[i] = oldChar Then s[i] = newChar
	Next
End Sub
Dim s As String, t As String
s = "Print Ex'#prompt\r\nDim s As String, t As String\r\ns = \q' + s + Ex'\q\r\nt = \q' + t + Ex'\q' : ReplaceChr(s, Asc(t), Asc(Ex'\q')) : Print s"
t = "'"
Print Ex"#prompt\r\nDim s As String, t As String\r\ns = \q" + s + Ex"\q\r\nt = \q" + t + Ex"\q" : ReplaceChr(s, Asc(t), Asc(Ex"\q")) : Print s


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke