配列の宣言とアクセス方法

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    VBAかじったので忘備録
    数時間いじった程度の知識量

    宣言方法とそれぞれのアクセス方法について例を示しています。
    タイトルのジャグ配列は一番最後です。

    (一次元)配列

    excel_exp_array1.png

    宣言方法1


    Dim x(3) As Variant
    x(0) = "a"
    x(1) = "b"
    x(2) = "c"
    x(3) = "d"

    ※Dim x(i) As Variantで用意されるiは要素数ではなく、要素の添え字なので要素数-1を指定する。

    宣言方法2


    Dim x(0 To 4) As Variant
    x(0) = "a"
    x(1) = "b"
    x(2) = "c"
    x(3) = "d"

    ※Dim x(i To j) As Variantのiは自由に決められる。i=1 j=3とすると、x(1)から3個の要素数を確保する。

    宣言方法3


    Dim x As Variant
    x = Array("a","b","c","d")

    ※動的配列の場合はReDimを使用する

    アクセス方法


    x(1)
    x(3)
    など


    多次元配列

    excel_exp_array.png
    3行4列の二次元配列

    宣言方法1


    Dim x(2,3) As Variant
    x(0,0) = "a"
    x(0,1) = "b"
    ...
    x(2,3) = "i"

    宣言方法2


    Dim x(0 To 3, 0 To 4) As Variant
    初期値の設定方法は宣言方法1と同じなので省略する。

    宣言方法3


    Dim x As Variant
    x = Array(Array("a", "b", "c", "d"), Array("e", ....), .... Array(..., "i"))
    ほぼジャグ配列の考え方、配列の中に配列を宣言する方法。

    ※次元数を増やす場合はDim x(i, j, k ...) As Variant

    アクセス方法1


    宣言方法1,2の場合はこちら
    x(0,0) = "a"
    x(0,1) = "b"
    ...
    x(2,3) = "i"

    宣言方法3の場合はこちら
    x(0)(0) = "a"
    x(i)(j) = k

    ジャグ配列

    excel_exp_jugarray.png

    ジャグ配列は何行何列と言えるのか・・・?
    あえて言うならば3行4列の二次元ジャグ配列

    宣言方法1


    Dim x As Variant
    x = Array(Array("a", "b", "c"), Array("d", "e"), Array("f", "g", "h", "i"))

    宣言方法2(試していないので動作不明)


    事前に配列を複数個宣言しておいて、他の配列に入れるという方法でもよいかもしれない。
    Dim x As Variant
    Dim i As Variant
    i = Array("a", "b", "c")
    Dim j As Variant
    j = Array("d", "e")
    Dim k As Variant
    k = Array("f", "g", "h", "i")
    x = Array(i, j, k)

    アクセス方法


    x(0)(0) = "a"
    x(i)(j) = k


    おまけ


    動的配列の割り当て


    Dim x As Variant
    x = Array("a", "b")

    x(0) -> a
    x(1) -> b

    ReDim x(3)でxの要素数を添え字3個までの4個を確保する
    ただし、注意しなければならないのはこの際これまでの要素をすべて削除し、サイズを変更する点。
    つまり
    x(0) ->
    x(1) ->
    となる。

    要素を引き継ぎつつ、サイズを変更する場合は

    ReDim Preserve x(3)

    とする必要がある。


    要素数を調べる関数


    LBound関数 -> 引数で指定した配列で使用できる最も小さいインデックス番号を返す
    UBound関数 -> 引数で指定した配列で使用できる最も大きいインデックス番号を返す

    使用例
    Dim x As Variant
    x = Array("a","b","c","d")

    LBound(x)とした場合は0
    UBound(x)とした場合は3
    を返す。
    スポンサーサイト

    Adobe Acrobat Reader DCのツールパネルの消し方

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Adobe Acrobat Reader DCになって文章中に注釈などをつけられるようになりかなり便利になった一方でツールメニューが毎度開くので邪魔!と思っていました。

    ついに限界が来てオプションからツールをたたんでおくオプションを探しました。

    「編集」 -> 「環境設定」 -> 「文書」 -> 「ツールパネルをそれぞれのドキュメントに開く」
    のチェックを外す

    adobeacrobatreader_setting1.jpg
    adobeacrobatreader_setting2.jpg

    ちなみに、ツールパネルを開くときは文書の右のスクロールバー横のサンカクマークを押す。

    [覚書] C# 非同期処理の例外処理外エラー個所の特定

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    最近非同期処理を実装したプログラムを書いているのだが、非同期で例外処理をきちんとしていないとエラーがとても厄介なことになると学んだ。
    この場合のエラー個所の特定方法についての覚書。

    まず、非同期処理内で例外処理(try catch)をしていない場合に表示されるエラーについて。

    非同期処理内、例外処理なし
    タイトル「TargetInvocationExceptionはハンドルされませんでした。」
    追加情報「呼び出しのターゲットが例外をスローしました。」
    rainflow_async_error1.jpg


    非同期処理内、例外処理あり
    try{ /// }catch(Exception ex){ ex.ToString(); } とりあえず例外表示するだけ
    rainflow_async_error2.jpg


    同期処理内、例外処理なし
    タイトル「ArgumentOutOfRangeExceptionはハンドルされませんでした。」
    追加情報「インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。」
    rainflow_async_error3.jpg


    今回引っかかったのは、いろいろといじって、いじりすぎて、いざデバッグを実行したところ、”非同期処理内、例外処理なし”のエラーが表示されたが、いじった個所が多すぎてどこが問題なのかわからなかったことだ。
    とりあえず、該当しそうな箇所に try{ /// }catch(Exception ex){ ex.ToString(); } を入れてみたが”非同期処理内、例外処理なし”のエラーしか出ない。

    困ってグーグル先生に聞いたところ
    「トレースログを出力する」
    とよいらしいという情報を得た。
    が、ログを出力するコードを追加したもののログを出力する前にエラーが出ているようで追加の情報は得られなかった。
    (付け焼刃でコードを追加したので追加箇所が正確ではない可能性がある。)

    これは困ったとだめもとで
    ”非同期処理内、例外処理なし”のエラーダイアログの「例外の詳細をクリップボードに追加」を実行した。


    System.Reflection.TargetInvocationException はハンドルされませんでした。
    HResult=-2146232828
    Message=呼び出しのターゲットが例外をスローしました。
    Source=mscorlib
    StackTrace:
    場所 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
    場所 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
    場所 System.Delegate.DynamicInvokeImpl(Object[] args)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
    場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallbacks()
    場所 System.Windows.Forms.Control.WndProc(Message& m)
    場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    場所 System.Windows.Forms.Application.Run(Form mainForm)
    場所 Rainflow.Program.Main() 場所 C:\Users\xxxxxxx\Documents\Visual Studio 2015\Projects\Rainflow\Rainflow\Program.cs:行 19
    場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    場所 System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    HResult=-2146233086
    Message=インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
    パラメーター名:index
    ParamName=index
    Source=mscorlib
    StackTrace:
    場所 System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    場所 System.Collections.Generic.List`1.get_Item(Int32 index)
    場所 Rainflow.DGV.d__3.MoveNext() 場所 C:\Users\xxxxxxx\Documents\Visual Studio 2015\Projects\Rainflow\Rainflow\Control.cs:行 316
    --- 直前に例外がスローされた場所からのスタック トレースの終わり ---
    場所 System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
    InnerException:


    Message=インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
    この情報は大きい!そしてその下の
    場所 Rainflow.DGV.d__3.MoveNext() 場所 C:\Users\xxxxxxx\Documents\Visual Studio 2015\Projects\Rainflow\Rainflow\Control.cs:行 316
    ここが問題だそうだ。

    ということで、修正しました。
    例外処理はちゃんとしようね。
    メッセージ表示するだけでも効果あるある。

    PAYDAY2 LEVEL EDITOR導入方法(とりいそぎ)

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    LASTBULLET作のジョブ、マップエディター

    ※使用はすべて自己責任でお願いします
    ※重要なファイル(セーブデータなど)は定期的なバックアップをしましょう
    PAYDAY2 セーブデータ手動バックアップ(batファイル)
    ※ファイルが破損した、ゲームが動かなくなった場合はまずファイルの整合性をチェック
    PAYDAY2 起動しない・クラッシュ原因について探る

    LASTBULLET PRESENTS LEVEL EDITOR


    http://www.lastbullet.net/r/OoF/

    導入方法


    ①前提MODを導入する


    BLTが必要なので導入しておくこと。
    導入済みの方は次の項目へ。

    PAYDAY2 BLT導入方法

    ②必要なものをダウンロードし解凍する


    Bundle Modder 1.16.3.1
    .pdmodをインストールするためのツール
    BeardLib-Editor.pdmod
    Editor modに必要なファイル
    PAYDAY-2-BeardLib-Editor(緑ボタンのClone or downloadよりDownload ZIP)
    Editor mod本体

    ③Bundle Modder 1.16.3.1を設定する


    PDBundleModPatcher.exeを実行する。(同時にPDBundleModPatcher_Updater.exeが実行される)
    pd2_bundle_1_a.jpg

    警告表示をOKで実行継続する
    pd2_bundle_2_a.jpg

    PAYDAY2のassetsフォルダの位置を設定する
    pd2_bundle_4_a.jpg

    Add modで先ほどダウンロードした BeardLib-Editor.pdmod を追加し、有効化(チェックを入れると緑色に変化)し、Apply changesを実行する
    pd2_bundle_5_a.jpg

    参考:Official Payday 2 and PD:TH Modding Guide How to install mods for Payday 2/Payday: The Heist

    ④PAYDAY-2-BeardLib-Editor-master.zipファイル内のassetsフォルダとmodsフォルダをPAYDAY2ルートフォルダに入れる


    フォルダは統合、ファイルは上書きしない設定でエディタ起動に成功した。(上書きしても大丈夫かも)
    pd2_bundle_modf_a.jpg

    LEVEL EDITORの使い方


    LEVEL EDITORを起動する


    PAYDAY2メインメニュー -> OPTION -> BEARLIB MAIN MENU -> 適当な項目を選択

    既存のLEVELをロード


    BEARLIB MAIN MENU -> LOAD LEVEL -> 適当なLEVELを選択

    視点移動方法はShift+WASD 移動方向はマウス
    あとは感じるままに

    実行画面


    20160713013545_1.jpg
    20160713013744_1.jpg
    20160713013959_1.jpg


    バグ


    マウスの入力を受け付けなくなる


    環境依存の可能性があるが、このツールを実行後、PD2を終了させてもマウスの操作を受け付けない状態が続いた。
    改善方法は、Windows7環境にて
    Ctrl+Alt+Delからタスクマネージャなどを起動する画面に切り替え、Escを押すだけ。

    タイマー式シャットダウン用batファイル v4

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    ダウンロードし、ダブルクリックするとできます。

    終了予定までの時間を分で入力すると、内部で秒に変換してshutdownコマンドを実行します。

    実行してしまった後に、処理を中断したい場合は何かしらのキーを押しキャンセルすることができます。

    batファイルを閉じる場合は右上から閉じるボタンを押してください。キャンセルして閉じる、キャンセルせず閉じるボタンで閉じる、どちらもシャットダウンは中止できます。

    更新履歴

    v1
    12/11/22
    ファイル名をpoweroff.batからpoweroff2.batに変更
    時間に文字列が混入した場合即座にシャットダウンが実行されるため、入力文字列を数値か文字列か判定する処理を追加しました。
    文字列と判定された場合は再度時間入力を求めます。

    v2
    12/11/23
    なぜか正常に動作していないので前のファイルに差し替え。
    数値以外を入力すると即座にシャットダウン処理を始めるので注意

    v3
    13/10/01
    不具合修正完了

    v4
    16/07/04
    通常のシャットダウン処理と強制シャットダウンを選べるように変更。


    ダウンロード

    ソース v4
    @echo off
    :LOOP
    rem /////////
    rem 初期化
    set pushKey=
    set SEC=
    set X=
    set TIME=
    rem /////////
    set MIN=60
    set TIME=0
    set /p SEC="自動シャットダウン予定までの時間(分)を入力してください >"
    set /a X=SEC
    if defined X set X=%X:0=%
    if defined X set X=%X:1=%
    if defined X set X=%X:2=%
    if defined X set X=%X:3=%
    if defined X set X=%X:4=%
    if defined X set X=%X:5=%
    if defined X set X=%X:6=%
    if defined X set X=%X:7=%
    if defined X set X=%X:8=%
    if defined X set X=%X:9=%
    if not defined X set /a TIME+=SEC*MIN
    if %TIME%==0 echo 数列のみ有効です。
    if %TIME%==0 goto LOOP
    rem /////////
    echo %SEC%分後にシャットダウン処理を実行します。
    echo;
    echo 通常のシャットダウン処理を実行する場合は1
    echo アプリケーションを強制的に終了しシャットダウンする場合は2
    set /p pushKey= "処理モード:%pushKey%"
    rem /////////
    if "%pushKey%"=="1" (
    echo 処理を実行します。
    shutdown -s -t %TIME%
    echo 処理を中断する場合は何か押してください。
    pause >nul 2>&1
    rem set /p pause = %pause%
    rem if "%pause%" == ("")
    shutdown -a
    goto LOOP
    rem /////////
    ) else if "%pushKey%"=="2" (
    echo 処理を実行します。
    shutdown -s -f -t %TIME%
    echo 処理を中断する場合は何か押してください。
    pause >nul 2>&1
    shutdown -a
    goto LOOP
    rem ) else if "%pushKey%"=="n" (
    rem echo 処理を中断しました。
    rem goto LOOP
    rem /////////
    )else (
    echo 1/2以外は認識しません。処理を中断しました。
    goto LOOP
    )


    作った経緯
    眠たい、でも累計ログイン時間によるアイテム報酬を受け取りたいというそこのあなたに小技を一つ。

    つけっぱなしは電気の無駄、でも帰りが遅くて12時を回ってしまうかもしれない。

    きちんとログインアイテムを受け取りたい、どうしたらいいの?

    答えは簡単、深夜0時を回って4時間でPCの電源が落ちるように設定して寝ればいいだけです。

    新しくツールを入れる必要はなく、windowsに標準で入っているコマンドプロンプトでコマンドを入力すると簡単にできます。

    コマンドプロンプトを起動する方法は、

    window7,vistaの場合
    [windowsメニュー]→[全てのプログラム]→[アクセサリ]→[コマンドプロンプト]

    検索から実行する場合は
    windows7,vistaの場合
    [windowsメニュー]→[プログラムとファイル検索]→[cmd]と入力してcmd.exeを起動

    シャットダウンするコマンドは

    shutdown

    これに、オプションで、時間(秒)を指定します。

    -t sec

    つまり、

    shutdown -t 60

    を入力し、エンターで実行すると、実行から60秒後にPCがシャットダウン処理を始めます。

    1時間+10分
    shutdown -t 4200

    2時間+10分
    shutdown -t 7800

    3時間+10分
    shutdown -t 11400

    4時間+10分
    shutdown -t 15000

    アイテムは若干時間に誤差があるようなので、上の命令文の時間はX時間+10分の猶予時間が足してあります。

    batファイルを作ったので上の使い方がわからない人用に載せておきます。




    動作環境はXP以降