Я использую этот javacpp для сборки компилятора с LLVM на Java.Я смог сгенерировать код для ввода и вывода.
INPUT: Сначала у меня есть LLVMValueRef, который является символом, скажем, целевая переменная, которая будет получать входные данные.Тогда у меня есть LLVMValueRef, который является функцией scanf.Я устанавливаю аргументы и создаю функцию, передающую вызов тогда.Это работает просто отлично.
LLVMValueRef valueRef = symbol.getLlvmValueRef();
LLVMValueRef scanfFunction = LLVMGetNamedFunction(moduleRef, "scanf");
LLVMValueRef[] scanfArgs = { str, valueRef };
LLVMBuildCall(builderRef, scanfFunction, new PointerPointer(scanfArgs), 2, "scanf");
ВЫХОД: Точно так же я могу распечатать любую строку, какую захочу.У меня есть printt, который я могу получить с помощью LLVMGetNamedFunction, и после этого я создаю вызов fuction, передавая все аргументы, составляющие строку для печати.
LLVMValueRef printFunction = LLVMGetNamedFunction(moduleRef, "printf");
LLVMBuildCall(builderRef, printFunction, new PointerPointer(args), printArgs.size(), "printf");
МОЯ ПРОБЛЕМА:
ЕслиУ меня есть printf перед scanf, scanf всегда на первом месте.Я думаю, что это имеет что-то с буфером, похожим на эту проблему: C / C ++ printf () перед выпуском scanf ()
Поэтому я пытался fflush после сборки каждый вызов printf.Например:
LLVMValueRef[] fflushArgs = { LLVMConstNull(LLVMPointerType(LLVMInt8Type(), 0)) };
LLVMValueRef fflushFunction = LLVMGetNamedFunction(moduleRef, "fflush");
LLVMBuildCall(builderRef, fflushFunction, new PointerPointer(fflushArgs), 1, "fflush");
Я собираюсь вызвать fflush (null).
Однако я получаю эту ошибку:
LLVM ERROR: Попытка выполнить неизвестный внешнийфункция: fflush
Итак, у меня есть доступ к printf и scanf, но я не могу использовать fflush
Как я могу использовать FFLUSH?Есть ли другой способ очистить этот буфер?Что я могу сделать, чтобы printf и scanf выполнялись в правильном порядке?Спасибо за вашу помощь.