Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возвращение массива из скрипта 
V
    Опции темы
raks123
Дата 2.10.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2011

Репутация: нет
Всего: нет



Есть такая задача: передаем строку в скрипт, а выводим из него численный массив. Я делаю так:

    QScriptEngine engine;

    QString fileName(":/script.js");
    QFile scriptFile(fileName);
    scriptFile.open(QIODevice::ReadOnly);
    QTextStream stream(&scriptFile);
    QString contents = stream.readAll();
    scriptFile.close();

- Ну тут все понятно, открываем скрипт. читаем и обозначиваем объект движка

QString stroka ("12345123");

- Вот строка. взял её так просто, нужно понять принцип, а потом усложнять

QScriptValue add = engine.globalObject().property("add");

Я завожу глобальный объект, который после будет обращаться в скрипт по имени функции

QDebug () <<add.call (QScriptValue (), QScriptValueList () <<stroka) toVariant ().

Вот я вызываю функцию и передаю строку в скрипт. Ниже простой скрипт:

function add(stroka) {
   arr = Array;

    for (i=0; typeof(stroka)!=="undefined"; i=i+1){
        arr=stroka;
    }
    return arr;
}

Дело в том, что выводит следующее:

QVariant(QVariantMap, QMap(("0", QVariant(QString, "1") ) ( "1" ,  QVariant(QString, "2") ) ( "2" ,  QVariant(QString, "3") ) ( "3" ,  QVariant(QString, "4") ) ( "4" ,  QVariant(QString, "5") ) ( "5" ,  QVariant(QString, "1") ) ( "6" ,  QVariant(QString, "2") ) ( "7" ,  QVariant(QString, "3") ) ( "isArray" ,  QVariant(QVariantMap, QMap(("length", QVariant(double, 1) ) ( "name" ,  QVariant(QString, "isArray") ) )  ) ) ( "length" ,  QVariant(double, 1) ) ( "name" ,  QVariant(QString, "Array") ) ( "prototype" ,  QVariant(QVariantList, () ) ) )  ) 

Я дописывал в строку toMap (). -
QDebug () <<add.call (QScriptValue (), QScriptValueList () <<stroka) toVariant () toMap ()..;
и начало выводить следующее:

QMap(("0", QVariant(QString, "1") ) ( "1" ,  QVariant(QString, "2") ) ( "2" ,  QVariant(QString, "3") ) ( "3" ,  QVariant(QString, "4") ) ( "4" ,  QVariant(QString, "5") ) ( "5" ,  QVariant(QString, "1") ) ( "6" ,  QVariant(QString, "2") ) ( "7" ,  QVariant(QString, "3") ) ( "isArray" ,  QVariant(QVariantMap, QMap(("length", QVariant(double, 1) ) ( "name" ,  QVariant(QString, "isArray") ) )  ) ) ( "length" ,  QVariant(double, 1) ) ( "name" ,  QVariant(QString, "Array") ) ( "prototype" ,  QVariant(QVariantList, () ) ) )  

Я посмотрел еще упрощение и дописал значения (). -
QDebug () <<add.call (QScriptValue (), QScriptValueList () <<stroka) toVariant () toMap () values ()...;
И выводит следующее:


Вот тут я и застрял, так как дальнейшее преобразование у меня просто не получается, да и в теле функции оно будет лишнее. Нужна помощь в переписании самого скрипта и получении из него только значений в массив, а не бесполезной кучи, которую надо преобразовывать.
PM MAIL   Вверх
bsa
Дата 3.10.2011, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Напиши ручками цикл, который выведет массив в нужном виде.
PM   Вверх
raks123
Дата 3.10.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2011

Репутация: нет
Всего: нет



Нашел решение))) скрипт остался таким же, а основную функцию пришлось подправить:

    QScriptValue variant;

    engine.evaluate(contents); 

    QScriptValue add = engine.globalObject().property("add");
  
   variant = add.call(QScriptValue(), QScriptValueList() << stroka ); 

   QScriptValueIterator it(variant);

   while(it.hasNext()){
       it.next();
       if (!(it.flags() && QScriptValue::SkipInEnumeration))
      {
        qDebug()<<it.name()<<": " <<it.value().toInteger();
       }
   }

Наконец то начало выводить следующее: 
"0" :  1 
"1" :  2 
"2" :  3 
"3" :  4 
"4" :  5 
"5" :  1 
"6" :  2 
"7" :  3 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.