Для _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
этого не сделает, поэтому оболочка используется для создания строки с фиксированной длиной достаточного размера и передает ее функции. обертка делает это достаточно хорошо, чтобы хватить в большинстве случаев. Обратите внимание, что это также должно работать на OS X и Linux (и почти любой другой POSIX-подобной системе, на которой работает QB64, возможно, даже включая Android). Я не тестировал эти системы, но должен работать с getcwd
- это функция POSIX.
Что происходит, когда это число недостаточно велико? Ну, QB64 не позволяет передавать массивы библиотечным функциям, и вы не можете использовать STRING * variable
, если variable
не является CONST variable = ...
. Это означает, что вы не можете увеличить строку и повторите попытку. Вероятно, вы должны сделать ошибку, если это скажет вам, что что-то пошло не так (например, ERROR 75
).
Почему вы не хотите использовать '' $ _CWD и что об этом недостаточно эффективно? – BdR
В моем четырехъядерном процессоре не будут запущены последние грязные сборки QB64, только старый диалект QB64, который не поддерживает _CWD $, и это не эффективно для отказов ошибок, когда есть только одна процедура ошибки и 1000 строк кода. – eoredson