crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Вопрос по QtScript и массивам ?
AntonTatu
  опции профиля:
сообщение 5.3.2009, 11:15
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет .

Вот небольшой примерчик:
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
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Такое вот нашел в 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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


мне блин с этим в жизнь не разобраться..... :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_BRE_*
сообщение 5.3.2009, 12:37
Сообщение #4





Гости








    


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
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #6





Гости








    


Цитата(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
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Гость_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
Сообщение #8





Гости








    


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


vec.setProperty( j, (*MyMassive)[i][j] );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 5.3.2009, 16:00
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
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
Сообщение #10





Гости








    


vec.setProperty( j, QScriptValue( scriptEngine, (*MyMassive)[ i ][ j ] ) );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 20:39