質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

4回答

1591閲覧

VBScriptの関数について

退会済みユーザー

退会済みユーザー

総合スコア0

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2020/02/06 12:27

前提・実現したいこと

初心者です。VBScriptで逆ポーランド記法を使った簡易電卓を作っている途中です。
PopとPushを関数で表したいのですが、Private Function Push(a, b)でPushの関数を作り、UBoundをつかって1番上に乗せていく?という方向性で作っていくのがいいのかな、と考えたところで行き詰まってしまいました。ご教授頂けますでしょうか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

配列をスタック代わりにするのを無理やりやるとこんな感じでどうでしょう。

VBscript

1class STACK_OBJECT 2 private STACK 3 4 private sub class_Initialize 5 init_stack 6 end sub 7 8 ' STACK の初期化 9 private sub init_stack() 10 STACK = array() 11 ' この時点で UBound(STACK) = -1 となる(これをしないとUBoundがエラー) 12 end sub 13 14 ' STACK の拡張 15 private sub expand_stack() 16 if UBound(STACK) = -1 then 17 Redim STACK(0) 18 else 19 Redim preserve STACK(UBound(STACK)+1) 20 end if 21 end sub 22 23 ' STACK の縮小 24 private sub reduce_stack() 25 select case UBound(STACK) 26 case -1 27 ' 既に空配列(この場合何をしたいかは要件次第) 28 case 0 29 init_stack 30 case else 31 Redim preserve STACK(UBound(STACK)-1) 32 end select 33 end sub 34 35 36 37 38 ' 引数をSTACKに積む 39 sub push(a) 40 expand_stack 41 STACK(UBound(STACK)) = a 42 end sub 43 44 ' STACKの最後の要素を取得し、要素を詰める 45 function pop() 46 Dim tmp 47 tmp = STACK(UBound(STACK)) 48 reduce_stack 49 50 pop = tmp 51 end function 52 53 ' STACK の状態を出力するデバッグ関数 54 sub debug() 55 Dim tmp, i 56 57 for i = LBound(STACK) to UBound(STACK) 58 tmp = tmp & "STACK(" & i & ")" & " : " & STACK(i) & vbCrLf 59 next 60 61 msgbox tmp 62 end sub 63 64end class 65 66 67' テストコード 68 69Dim OBJ 70 71Set OBJ = new STACK_OBJECT 72 73' push 74obj.push 1 75obj.push 2 76obj.push 3 77obj.debug 78 79' pop 80msgbox obj.pop 81 82' pop後 83obj.debug 84 85Set OBJ = Nothing

投稿2020/02/06 14:50

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

.NET のスタックが COM 公開されているので使えます。

実験記録 No.02 : VBSでキュー(Queue)、スタック(Stack)を使う

投稿2020/02/06 13:20

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

UBoundは、宣言されたサイズ(=指定可能な最大の添え字)を返しますので、その目的には使えません。
データを格納した最大添え字を変数で管理してください。

投稿2020/02/06 13:07

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Stackの簡単な実装をVBScriptでやるなら、Stack用配列を用意し、

PushでRedim Preserve Stack(Ubound(Stack)+1)
Pop でRedim Preserve Stack(Ubound(Stack)-1)

でいいんじゃないかな?

VBScript

1Dim Stack() 2Const MaxStackPointer = 32767 3ReDim Stack(0) 4 5SUB Push(obj) 6 If UBound(Stack) >= MaxStackPointer Then 7 Err.Raise vbObjectError + 1, "Push", "Stack Overflow." 8 End If 9 10 ReDim Preserve Stack(UBound(Stack)+1) 11 Stack(UBound(Stack)) = obj 12END SUB 13 14Function Pop() 15 If UBound(Stack) <= 0 Then 16 Err.Raise vbObjectError + 1, "Pop", "Stack Underflow." 17 End If 18 19 Pop = Stack(UBound(Stack)) 20 ReDim Preserve Stack(UBound(Stack)-1) 21END Function 22 23WScript.Echo "Init:" & " - StackPointer:" & UBound(Stack) 24WScript.Echo "" 25 26Push("2") 27WScript.Echo "Push:" & "2 - StackPointer:" & UBound(Stack) 28Push("3") 29WScript.Echo "Push:" & "3 - StackPointer:" & UBound(Stack) 30Push("4") 31WScript.Echo "Push:" & "4 - StackPointer:" & UBound(Stack) 32Push("100") 33WScript.Echo "Push:" & "100 - StackPointer:" & UBound(Stack) 34 35WScript.Echo "" 36 37WScript.Echo "Pop:" & Pop() & " - StackPointer:" & UBound(Stack) 38WScript.Echo "Pop:" & Pop() & " - StackPointer:" & UBound(Stack) 39WScript.Echo "Pop:" & Pop() & " - StackPointer:" & UBound(Stack) 40WScript.Echo "Pop:" & Pop() & " - StackPointer:" & UBound(Stack) 41 42WScript.Echo "Pop:" & Pop() & " - StackPointer:" & UBound(Stack) 43

console

1C:\temp>cscript Stacktest.vbs 2Init: - StackPointer:0 3 4Push:2 - StackPointer:1 5Push:3 - StackPointer:2 6Push:4 - StackPointer:3 7Push:100 - StackPointer:4 8 9Pop:100 - StackPointer:3 10Pop:4 - StackPointer:2 11Pop:3 - StackPointer:1 12Pop:2 - StackPointer:0 13C:\temp\Stacktest.vbs(17, 9) Pop: Stack Underflow.

投稿2020/02/07 04:52

Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2020/02/10 09:48

あぁ何か間違ってましたか。 バグ箇所のご指摘コメントで頂きたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問