Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ Вопрос по QtScript и массивам ?

Автор: AntonTatu 5.3.2009, 11:15

Всем привет .

Вот небольшой примерчик:

QScriptValue fun = engine.evaluate("function(a,b){return a+b;}"); //вводим функцию непосредственно в коде С++
QScriptValueList args; //список аргументов
args << QScriptValue(&engine, 5) << QScriptValue(&engine, 7);
QScriptValue y = fun.call(QScriptValue(), args); //5+7=12
int result = y.toNumber();


в нем с использованием QtScript в безымянную функцию передается значение переменных a и b, он работает, но....

Вопрос как в такую функцию передать двумерный массив типа Vector
объявляю я его так:
std::vector < std::vector <char> > *MyMassive;
распределяю память так:
MyMassive = new stdvector < std::vector <char> >(i, std::vector<char> j);
заполняю требуемыми значениями так:
(*MyMassive)[i][j] = чему нибудь
передаю и использую в функциях C++ так:

void MyFun(std::vector < std::vector <char> >& MyMassive)
{
//обход массива
for (int i = 0; i<10; i++)
   for (int i = 0; i<10; i++)
      MyMassive[i][j]
}


Спасибо за ответы ! :)

Автор: SABROG 5.3.2009, 11:53

Такое вот нашел в Assistante, может поможет:

Цитата
int qScriptRegisterSequenceMetaType ( QScriptEngine * engine, const QScriptValue & prototype = QScriptValue() )

Registers the sequence type T in the given engine. This function provides conversion functions that convert between T and Qt Script Array objects. T must provide a const_iterator class and begin(), end() and push_back() functions. If prototype is valid, it will be set as the prototype of Array objects due to conversion from T; otherwise, the standard Array prototype will be used.

Returns the internal ID used by QMetaType.

You need to declare the container type first with Q_DECLARE_METATYPE(). If the element type isn't a standard Qt/C++ type, it must be declared using Q_DECLARE_METATYPE() as well. Example:
    Q_DECLARE_METATYPE(QVector<int>)
...
    qScriptRegisterSequenceMetaType<QVector<int> >(engine);
...
    QVector<int> v = qscriptvalue_cast<QVector<int> >(engine->evaluate("[5, 1, 3, 2]"));
    qSort(v.begin(), v.end());
    QScriptValue a = engine->toScriptValue(v);
    qDebug() << a.toString(); // outputs "[1, 2, 3, 5]"

See also qScriptRegisterMetaType().

Автор: AntonTatu 5.3.2009, 12:14

мне блин с этим в жизнь не разобраться..... :(

Автор: BRE 5.3.2009, 12:37

QScriptValue arr = scriptEngine->newArray( 10 );
for( int i = 0; i < 10; ++i )
{
    QScriptValue vec = scriptEngine->newArray( 10 );
    for( int j = 0; j < 10; ++j )
        vec.setProperty( j, MyMassive[i][j] );

    arr.setProperty( i, vec );
}

Автор: AntonTatu 5.3.2009, 13:29

Цитата(BRE @ 5.3.2009, 12:37) *
QScriptValue arr = scriptEngine->newArray( 10 );
for( int i = 0; i < 10; ++i )
{
    QScriptValue vec = scriptEngine->newArray( 10 );
    for( int j = 0; j < 10; ++j )
        vec.setProperty( j, MyMassive[i][j] );

    arr.setProperty( i, vec );
}


а что теперь с этим делать ? как это будет работать в функции ?
QScriptValue fun = engine.evaluate("function(a, B ){return a+b;}");

Автор: BRE 5.3.2009, 13:44

Цитата(AntonTatu @ 5.3.2009, 13:29) *
а что теперь с этим делать ? как это будет работать в функции ?
QScriptValue fun = engine.evaluate("function(a, B ){return a+b;}");


QScriptValue fun = scriptEngine.evaluate("function( arr ) { return arr[ 4 ][ 6 ]; }");
QScriptValueList args;
args << QScriptValue( &scriptEngine, arr );
QScriptValue threeAgain = fun.call( QScriptValue(), args );

Автор: AntonTatu 5.3.2009, 15:37

Гость_BRE, огромное спасибо за помощь, только все равно не компилируется пишет ошибку в строчке:

vec.setProperty( j, MyMassive[i][j] );
где ошибка ?

повторюсь, массив MyMassive создаю вот так:
std::vector < std::vector <char> > *MyMassive;
MyMassive = new std::vector < std::vector <char> >(10, std::vector<char> 10);

для того что бы его заполнить вызываю его вот так:
for( int i = 0; i < 10; ++i )
{
    for( int j = 0; j < 10; ++j )
       (*MyMassive)[i][j] = 5;


спасибо заранее...

Автор: BRE 5.3.2009, 15:40

Цитата(AntonTatu @ 5.3.2009, 15:37) *
огромное спасибо за помощь, только все равно не компилируется пишет ошибку в строчке:
vec.setProperty( j, MyMassive[i][j] );


vec.setProperty( j, (*MyMassive)[i][j] );

Автор: AntonTatu 5.3.2009, 16:00

Цитата
vec.setProperty( j, (*MyMassive)[i][j] );


да я так писал то же причем в коде

QScriptEngine engine;


(*MyMassive)[0][0] = 3;    //---- это работает нормально

//написано ниже

QScriptValue arr = scriptEngine->newArray( 10 );
for( int i = 0; i < 10; ++i )
{
    QScriptValue vec = scriptEngine->newArray( 10 );
    for( int j = 0; j < 10; ++j )
        vec.setProperty( j, MyMassive[i][j] );  // в этом месте ошибка компиляции error c2664 невозможно преобразовать параметр 1 из 'int' в
         // 'const QString &' Ни один конструктор не смог принять исходный тип, либо разрешение перегру
         // зки конструктора неоднозначно

    arr.setProperty( i, vec );
}

еще один момент в место scriptEngine->newArray я использую engine->newArray

Автор: BRE 5.3.2009, 16:06

vec.setProperty( j, QScriptValue( scriptEngine, (*MyMassive)[ i ][ j ] ) );

Автор: AntonTatu 5.3.2009, 16:11

Цитата(BRE @ 5.3.2009, 15:40) *
vec.setProperty( j, MyMassive[i][j] );


в общем начало сделать получилась вот так что бы заработало:
QScriptEngine engine;
QScriptValue arr = scriptEngine->newArray( 10 );
for( int i = 0; i < 10; ++i )
{
    QScriptValue vec = scriptEngine->newArray( 10 );
    for( int j = 0; j < 10; ++j ){
        
        QScriptValue temp(&engine, (*MyMassive)[i][j]);
        vec.setProperty( j, temp );  
          }

    arr.setProperty( i, vec );
}


но теперь ругается на:

args << QScriptValue( &engine, arr );

ошибка: Ни одна из 9 перегрузок не может преобразовать все типы аргументов, как здесь исправить ?

Автор: BRE 5.3.2009, 16:16

args << arr;

Автор: AntonTatu 5.3.2009, 17:44

Цитата(BRE @ 5.3.2009, 16:16) *
args << arr;


СПАСИБО ОГРОМНОЕ ВСЕ РАБОТАЕТ !!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)