TCL C API Создание и регистрация нового канала

Я использую Tcl 8.6 (Windows) и не могу зарегистрироваться и использовать новые каналы

std::ofstream file("1.txt");

Tcl_Channel kanal = Tcl_CreateChannel(Type, "myChann", file, TCL_WRITABLE);
Tcl_RegisterChannel(interp, kanal);

file.close();

и тип

Tcl_ChannelType* Type = new Tcl_ChannelType();
Type->closeProc = closeProc;
Type->inputProc = inputProc;
Type->outputProc = outputProc;
Type->typeName = "My own chann";
Type->version = TCL_CHANNEL_VERSION_2;

функции просты, у них есть только std::cout

я запускаю интерпретатор со скриптом

"chan puts myChan whatever"

и ничего не произошло, ни ошибок интерпретатора, ни вывода (консоль, файл). я не знаю, как это укусить, это первая цель, создать новый канал и использовать его, вторая - заменить TCL_STDOUT моим собственным каналом (это может быть std::ofstream), чтобы когда я запускаю интерпретатор с

"puts WhatEver"

эта строка переходит в std::ofstream


person Jan3Sobieski    schedule 24.07.2013    source источник


Ответы (1)


Вероятно, вы не сбросили вывод.

Это можно сделать с

flush myChan

Вы также можете настроить свой канал так, чтобы он очищался в конце строки или всякий раз, когда на него что-либо записывается:

chan configure myChan -buffering line

(или none). stdout по умолчанию настроен с -buffering line

person Johannes Kuhn    schedule 24.07.2013
comment
когда я сбрасываю myChann, я получаю бесконечный цикл, который запускает outputProc из Tcl_ChannelType *, когда я возвращаю 0. и ничего не происходит, когда я возвращаю int toWrite - person Jan3Sobieski; 24.07.2013
comment
прогресс, моя функция была собрана, но файл все еще пуст. как я могу получить этот std::ostream? - person Jan3Sobieski; 24.07.2013
comment
@user Вам нужно правильно реализовать outputProc, возвращая количество фактически записанных байтов. Если вы всегда возвращаете 0, код сброса просто попытается повторить попытку. :-) - person Donal Fellows; 24.07.2013
comment
как я могу получить правильный std::ostream? потому что, когда я создаю канал, я выбираю в ClientData std::ofstream, могу ли я получить этот std::ostream в outputProc? maby из ClientData, но я не могу... - person Jan3Sobieski; 24.07.2013
comment
приведите его к std::ostream. - person Johannes Kuhn; 24.07.2013
comment
единственный способ вызвать эту ошибку без компилятора - это reinterpret_cast‹std::ostream&›, но тогда я получаю ошибку чтения местоположения нарушения доступа из памяти - person Jan3Sobieski; 24.07.2013