Russian Qt Forum

Qt => Вопросы новичков => Тема начата: StatuS74 от Февраль 27, 2012, 08:22



Название: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 27, 2012, 08:22
Объявил мето дв классе
Код:
void FullTestAdapter (QString [11][11]);

в самом классе делаю следующее

Код:
void test::FullTestAdapter(QString Data[11][11])
{
  DataTester = Data;

}
DataTester это глобальная переменная
Код:
QString DataTester [11][11];
При попытки скомпилировать говорит не соответствие типов (incompatible types in assigment of QString(*)[11] to QString [11][11])

Не могу понять в чем проблема если типы одинаковые


Название: Re: Передача массива в метод класса
Отправлено: Kurles от Февраль 27, 2012, 10:48
Тебе же компилятор подсказывает, где именно проблема.

Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QDebug>
 
void print (QString (*array)[11])
{
   for (int i = 0; i <11 ; ++ i)
       for (int x = 0; x < 11;++x)
           qDebug() << array[i][x];
}
 
int main(int argc, char *argv[])
{
   QString array[11][11];
   for (int i = 0; i <11 ; ++ i)
       for (int x = 0; x < 11;++x)
           array[i][x] = QString("%0 - %1").arg(i).arg(x);
   print(array);
}
А вообще стоит почитать, что представляют собой встроенные массивы в С++.


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 27, 2012, 10:55
А вообще стоит почитать, что представляют собой встроенные массивы в С++.

И использовать контейнеры:)


Название: Re: Передача массива в метод класса
Отправлено: Kurles от Февраль 27, 2012, 11:00
И да, код
Код
C++ (Qt)
void test::FullTestAdapter(QString Data[11][11])
{
 DataTester = Data;
 
}
 

а именно часть
Код
C++ (Qt)
 DataTester = Data;
не пройдет, ибо в с++ возможна лишь поэлементное копирование массивов, так как массив в с++ по сути есть указатель.


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 27, 2012, 11:02
а я думал в с++ можно как в с#  просто один массив к другому приравнять


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 27, 2012, 11:04
а я думал в с++ можно как в с#  просто один массив к другому приравнять

Нельзя


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 29, 2012, 13:20
У меня новая беда с массивами тут.
Делаю коннект,а возвращается мне  false (коннекта нету).
подскажите в чем я ошибся ?
Код:
connect (t,SIGNAL(sig_update(QString[][])),SLOT(UpdateData(QString[][])),Qt::QueuedConnection);


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 13:25
Не передавай в сигнал-слот обычные массивы, используй QList


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 29, 2012, 13:33
А он подойдет для передачи одномерного массива ?


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 13:35
А он подойдет для передачи одномерного массива ?

да


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 29, 2012, 13:37
перепутал,мне многомерный  массив надо передавать.


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 13:38
перепутал,мне многомерный  массив надо передавать.

Разложи в одномерный старым дедовским методом и передавай


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 29, 2012, 13:42
ругается на void UpdateData(QList,int);
Говорит  'QList' is not a type


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 13:43
<QList> подключал?
А шаблонный параметр листу кто указывать будет?


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 29, 2012, 13:44
Конечно подключал


Название: Re: Передача массива в метод класса
Отправлено: StatuS74 от Февраль 29, 2012, 13:46
А нет другого варианта передать весь массив сразу ?


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 13:47
QList нормальный и безопасный вариант. Шаблонный параметр ему укажи только. Или QStringList юзай


Название: Re: Передача массива в метод класса
Отправлено: Igors от Февраль 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;
}
 
Философия люмпена была хорошо описана М. Горьким в его ранних рассказах  :)


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 14:53
Пробрасывать через QEventLoop указатель на массив, созданный на стеке в методе? мда...


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


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

Прямо в приведенном тобой коде коннект происходит через Qt::QueuedConnection. Да и в исходном сообщении тоже.
Если че, то QStringList не копирует данные при передаче, там SharedData


Название: Re: Передача массива в метод класса
Отправлено: Igors от Февраль 29, 2012, 16:57
Прямо в приведенном тобой коде коннект происходит через Qt::QueuedConnection. Да и в исходном сообщении тоже.
Точно, это я не доглядел. Подправил, спасибо

Если че, то QStringList не копирует данные при передаче, там SharedData
С QueuedConnection - дело темное. Как бы не копирует дважды. Во всяком случае не видно никакой необходимости в передаче таких данных по значению


Название: Re: Передача массива в метод класса
Отправлено: mutineer от Февраль 29, 2012, 17:10
При передаче указателя через QEventLoop возникает вопрос - а что будет, если эти данные удалят до того, как слот вызовется? С QStringList никаких проблем не будет (как не будет и копирования 121 строки до тех пор, пока они не меняются)


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

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

А главное - ну зачем лезть в этот огород если проще и лучше установить соглашения типа "кто создает и кто удаляет".