Правильно перегружая stringbuf для замены суда в файле MEX MATLAB

это не что-то в твоей жизни. Сообщение об ошибке (из вашего комментария):

java.lang.IllegalStateException: Не удалось найти метод buClick (View) в контексте родителя или предка для атрибута android: onClick, определенного в классе представления android.support. v7.widget.AppCompatButton с идентификатором 'bu1

метод onClick, определенный в манифесте для кнопки' bu1 ', но у вас нет соответствующего метода buClick (View) в вашей активности. Просто проверьте документацию и примеры атрибута onClick в Views в манифесте и узнайте, как его реализовать. Это тривиально.

8
задан OmG 25 May 2019 в 22:09
поделиться

3 ответа

Вы действительно не хотите перегружаться std::stringbuf, Вы хотите перегрузиться std::streambuf или std::basic_streambuf (если Вы хотите поддерживать несколько типов символов), также необходимо переопределить водосливный метод также.

Но я также думаю, что необходимо заново продумать решение проблемы.

cout просто ostream, таким образом, если все классы / функции берут ostream затем можно передать в чем-либо, что Вы любите. например. cout, ofstream, и т.д.

Если бы это слишком твердо затем, я создал бы свою собственную версию cout, возможно, названный mycout это может быть определено или во время компилятора или во время во время выполнения (в зависимости от того, что Вы хотите сделать).

Простое решение может быть:

#include <streambuf>
#include <ostream>

class mystream : public std::streambuf
{
public:
    mystream() {}

protected:
    virtual int_type overflow(int_type c)
    {
        if(c != EOF)
        {
            char z = c;
            mexPrintf("%c",c);
            return EOF;
        }
        return c;
    }

    virtual std::streamsize xsputn(const char* s, std::streamsize num)
    {
        mexPrintf("*s",s,n);
        return num;
    }
};

class myostream : public std::ostream
{
protected:
    mystream buf;

public:
    myostream() : std::ostream(&buf) {}
};

myostream mycout;

И версия суда могла просто быть:

typedef std::cout mycout;

Версия среды выполнения является немного большим количеством работы, но легко выполнимый.

9
ответ дан 5 December 2019 в 08:55
поделиться

Shane, большое спасибо за Вашу справку. Вот моя заключительная рабочая реализация.

class mstream : public std::streambuf {
public:
protected:
  virtual std::streamsize xsputn(const char *s, std::streamsize n); 
  virtual int overflow(int c = EOF);
}; 

...

std::streamsize 
mstream::xsputn(const char *s, std::streamsize n) 
{
  mexPrintf("%.*s",n,s);
  return n;
}

int 
mstream::overflow(int c) 
{
    if (c != EOF) {
      mexPrintf("%.1s",&c);
    }
    return 1;
}

...

// Replace the std stream with the 'matlab' stream
// Put this in the beginning of the mex function
mstream mout;
std::streambuf *outbuf = std::cout.rdbuf(&mout); 

...

// Restore the std stream buffer 
std::cout.rdbuf(outbuf); 
9
ответ дан 5 December 2019 в 08:55
поделиться

cout конкретный поток вывода символов. Если Вы хотите a cout это пишет в файл, используйте fstream, особенно ofstream. У них есть тот же интерфейс это cout обеспечивает. Кроме того, если Вы хотите захватить их буфер (с rdbuf) Вы можете.

0
ответ дан 5 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: