Russian Qt Forum
Ноябрь 24, 2024, 12:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Передача массива в метод класса  (Прочитано 10190 раз)
StatuS74
Гость
« Ответ #15 : Февраль 29, 2012, 13:46 »

А нет другого варианта передать весь массив сразу ?
Записан
mutineer
Гость
« Ответ #16 : Февраль 29, 2012, 13:47 »

QList нормальный и безопасный вариант. Шаблонный параметр ему укажи только. Или QStringList юзай
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Февраль 29, 2012, 14:33 »

А нет другого варианта передать весь массив сразу ?

Код
C++ (Qt)
typedef QString Arr121[11][11];
 
connect (t,SIGNAL(sig_update(QString * )),SLOT(UpdateData(QString *)),Qt::QueuedConnection);
 
Arr121 * src = new Arr121[1];
Arr121 & arr = *src;
...
// emit
emit sig_update(&arr[0][0]);
 
// slot
void MyClass::UpdateData(QString * src)
{
Arr121 & arr = *(Arr121 *) src;
qDebug() << arr[2][2];
...
delete [] &arr;
}
 
Философия люмпена была хорошо описана М. Горьким в его ранних рассказах  Улыбающийся
« Последнее редактирование: Февраль 29, 2012, 17:05 от Igors » Записан
mutineer
Гость
« Ответ #18 : Февраль 29, 2012, 14:53 »

Пробрасывать через QEventLoop указатель на массив, созданный на стеке в методе? мда...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Февраль 29, 2012, 15:26 »

Пробрасывать через QEventLoop указатель на массив, созданный на стеке в методе? мда...
Не вижу в теме упоминания о QEventLoop/QueiedConnection. А вот передача 121 элемента по значению - ото действительно "мда" (говнокод убивающий машину)
Записан
mutineer
Гость
« Ответ #20 : Февраль 29, 2012, 15:29 »

Пробрасывать через QEventLoop указатель на массив, созданный на стеке в методе? мда...
Не вижу в теме упоминания о QEventLoop/QueiedConnection. А вот передача 121 элемента по значению - ото действительно "мда" (говнокод убивающий машину)

Прямо в приведенном тобой коде коннект происходит через Qt::QueuedConnection. Да и в исходном сообщении тоже.
Если че, то QStringList не копирует данные при передаче, там SharedData
« Последнее редактирование: Февраль 29, 2012, 15:31 от mutineer » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Февраль 29, 2012, 16:57 »

Прямо в приведенном тобой коде коннект происходит через Qt::QueuedConnection. Да и в исходном сообщении тоже.
Точно, это я не доглядел. Подправил, спасибо

Если че, то QStringList не копирует данные при передаче, там SharedData
С QueuedConnection - дело темное. Как бы не копирует дважды. Во всяком случае не видно никакой необходимости в передаче таких данных по значению
Записан
mutineer
Гость
« Ответ #22 : Февраль 29, 2012, 17:10 »

При передаче указателя через QEventLoop возникает вопрос - а что будет, если эти данные удалят до того, как слот вызовется? С QStringList никаких проблем не будет (как не будет и копирования 121 строки до тех пор, пока они не меняются)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Февраль 29, 2012, 18:54 »

При передаче указателя через QEventLoop возникает вопрос - а что будет, если эти данные удалят до того, как слот вызовется? С QStringList никаких проблем не будет (как не будет и копирования 121 строки до тех пор, пока они не меняются)
Нужен 2-мерный массив, поэтому QVector <QStringList> > или QList <QStringList> >, а его нужно будет регистрировать, устанавливать размеры на 11 - в общем, мелкие заботы, хотя конечно это цивильное решение. Возня с 11х11 была бы понятна со старым С кодом/структурами но если элемент QString - то явно не в масть.

Насчет "никаких проблем не будет" - не уверен. Нужно как-то хранить аргумент поданный по значению до тех пор пока не вызовется слот. А как это сделать в общем виде? Не изучал подробно но полагаю что он сериализуется, а перед вызовом слота де-сериализуется. И это совсем не так дешево как обычный implicit sharing

А главное - ну зачем лезть в этот огород если проще и лучше установить соглашения типа "кто создает и кто удаляет".
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.