2

次のコードを使用してすべてのドライブのデフォルト ディレクトリを取得していますが、_CWD$ は使用したくありません。

これを行うためのより効率的な方法はありますか?

REM get default directory of drives.
ON ERROR GOTO ErrSub
FOR D = 1 TO 26
    D$ = CHR$(D + 64) + ":"
    DataError = 0
    CHDIR D$
    IF DataError = 0 THEN
        PRINT _CWD$
    END IF
NEXT
END

ErrSub:
DataError = ERR
RESUME NEXT
4

3 に答える 3

2

_CWD$ を置き換えるには、次のようにします。

' Need to use DECLARE LIBRARY for the C function getcwd(string, stringSize).
DECLARE LIBRARY ""
    FUNCTION getcwd$ (buffer$, BYVAL buflen)
END DECLARE

' Wrapper function for making usage of getcwd$ more BASIC-like.
DECLARE FUNCTION qb64cwd$ ()

' Print the current working directory.
PRINT qb64cwd$

FUNCTION qb64cwd$ ()
    ' 32768 characters should be more than large enough on any OS.
    REDIM s AS STRING * 32768
    qb64cwd$ = getcwd$(s, 32768)
END FUNCTION

ラッパー関数は実際には必要ありませんが、C 関数では、十分な量の書き込み可能なメモリで文字列を渡す必要があります。つまり、getcwdメモリを割り当てません。十分な量のメモリを渡すことが期待されますが、QB64 の動的サイズのSTRING型ではそれができないため、ラッパーを使用して十分なサイズの固定長文字列を作成し、それを関数に渡します。ほとんどの場合、wrapper はこれで十分です。これは、OS X および Linux (および QB64 が実行される他のほとんどすべての POSIX ライクなシステム、場合によっては Android を含む) でも動作するはずであることに注意してください。これらのシステムではテストしていませんgetcwdが、POSIX 関数なので動作するはずです。

その数が十分に大きくない場合はどうなりますか? QB64 では配列をライブラリ関数に渡すことはできず、is でSTRING * variableない限り使用できません。つまり、文字列を拡大して再試行することはできません。何か問題が発生したことを伝えるためにエラーが発生した場合は、おそらくエラーを発生させる必要があります (例: )。variableCONST variable = ...ERROR 75

于 2016-09-11T17:10:17.513 に答える
0

また、デフォルトのディレクトリが必ずしもファイルが開始されたディレクトリであるとは限らないことにも気付いたので、それぞれを説明するサンプルを次に示します。

' directory file was loaded from
PRINT _CWD$

' declare external libraries.
DECLARE DYNAMIC LIBRARY "kernel32"
    FUNCTION SetCurrentDirectoryA% (f$)
END DECLARE

' force default path
x$ = _STARTDIR$
f$ = x$ + CHR$(0)
x = SetCurrentDirectoryA(f$)

' directory where user is in dos
PRINT _CWD$
于 2016-12-30T02:28:55.687 に答える