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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не получается задать размер массиву  (Прочитано 10982 раз)
voodoo
Гость
« : Май 29, 2012, 01:10 »

Вообщем, суть проблемы. Есть массив точек m_points, объявленный как: QVector<QPoint> m_points;
Мне нужно создать массив такой же размерности как и m_points, но вместо этого ему постоянно присваивается значение 0. Помогите разобраться, уже и так, и сяк, и не работает хоть убей.
Код:
 void PointsToVector()
    {
        QString path;
        int vetka[6];
        qreal angle[6];
        int j = 0;
        m_vector ptv_vector[m_points.size()-1];
        QVectorIterator<QPoint> m_pointsiter(m_points);
        int i=0;
        QPoint begin,end;
        end = m_pointsiter.next();
        while(m_pointsiter.hasNext())
        {
            begin = end;
            end = m_pointsiter.next();
            ptv_vector[i].x1 = begin.x();
            ptv_vector[i].y1 = begin.y();
            ptv_vector[i].x2 = end.x();
            ptv_vector[i].y2 = end.y();
            i++;
        }
        for(int i=0; i<m_points.size(); i++) //узнаём рёбра которые выходят из точки
            if((qAbs(ptv_vector[i].x1 - m_startpoint.x()) < 5)
                && (qAbs(ptv_vector[i].y1 - m_startpoint.y()) < 5))
            {
                vetka[j] = i;
                j++;
            }
        //Узнаём наклоны рёбер
        for(int i=0; i<j; i++)
        {
            angle[i] = atan(qRound(qAbs(ptv_vector[vetka[i]].x1 - ptv_vector[vetka[i]].x2)
                            /qAbs(ptv_vector[vetka[i]].y1 - ptv_vector[vetka[i]].y2)));
        }
    }
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 29, 2012, 01:36 »

Код
C++ (Qt)
m_vector ptv_vector[m_points.size()-1];
полагаю это и есть проблемная строчка.
Код
C++ (Qt)
QPoint *ptv_vector = new QPoint[m_points.size()];
...
delete [] ptv_vector;
изучать C++ надо прежде всего.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
sidsukana
Гость
« Ответ #2 : Май 29, 2012, 06:09 »

Код
C++ (Qt)
m_vector ptv_vector[m_points.size()-1];
полагаю это и есть проблемная строчка.
Код
C++ (Qt)
QPoint *ptv_vector = new QPoint[m_points.size()];
...
delete [] ptv_vector;
изучать C++ надо прежде всего.

Для STL контейнеров существует resize(size);
Записан
voodoo
Гость
« Ответ #3 : Май 29, 2012, 09:08 »

Тьфу, забыл добавить что массив объявляется как структура:
 
Код:
struct m_vector
    {
       int x1,y1,x2,y2;
       //bool checked;
    };
    QPoint m_st
kambala, я делал раньше так как вы описали, выделял память, но увы - опять таки ошибка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 29, 2012, 09:23 »

Там много чего неправильно, вдаваться в критику - пустая трата времени. Скажите что Вам нужно, как я понял найти все наклоны - углы ребер исходящих из m_startpoint в точки на расстоянии не более (5, 5) ?
Записан
voodoo
Гость
« Ответ #5 : Май 29, 2012, 09:32 »

Вообщем, это дипломная работа - рисуешь граф, задаёшь точку для распознавания и погнал.
На данный момент надо: указал точку, определить какие рёбра выходят из этой точки и определить их угол наклона.

Вообщем, вот проект: http://rghost.ru/38346884, правда нужен Qt Creator.

По возможности - напишите свою критику, что где не так. Заранее спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 29, 2012, 10:24 »

Вообщем, это дипломная работа - рисуешь граф, задаёшь точку для распознавания и погнал.
На данный момент надо: указал точку, определить какие рёбра выходят из этой точки и определить их угол наклона.

Вообщем, вот проект: http://rghost.ru/38346884, правда нужен Qt Creator.

По возможности - напишите свою критику, что где не так. Заранее спасибо.
Хмм... ну давайте все-таки ограничимся тем что нужно на данный момент  Улыбающийся
 Вот набросок

Код
C++ (Qt)
 
const float PI = 3.141519f;
const float PI2 = PI * 2;
 
struct CEdge {
СEdge( int index0 = -1, int index1 = -1, float angle = 0.0f )
{
  mIndex[0] = index0;
  mIndex[1] = index1;
  mAngle = angle;
}
 
int mIndex[2];    // индексы вершин
float mAngle;   // угол в радианах
};
 
void FindEdges( const QVector <QPoint> & src,  // вектор всех вершин
                      int baseIndex,                // индекс вершины для которой ищем ребра
                      int deltaX, int deltaY,        // макс размеры ребра (5)
                      QVector <CEqge> & dst )  // выходной вектор ребер
{
const QPoint & base = src[baseIndex];
for (int i = 0; i < src.size(); ++i) {
 if (i == baseIndex) continue;
 QPoint delta = src[i] - base;
 if (qAbs(delta.x()) > deltaX) continue;
 if (qAbs(delta.y()) > deltaY) continue;
 float angle = atan2(float(delta.y()), delta.x());
 if (angle < 0.0f) angle += PI2;
 dst.push_back(CEdge(baseIndex, i, angle));
}
}
 
« Последнее редактирование: Май 29, 2012, 10:27 от Igors » Записан
voodoo
Гость
« Ответ #7 : Май 29, 2012, 11:14 »

Спасибо за пример, но хотелось бы реализовать так - как я вижу это в своём проекте. Так проще для понимания, я только начинаю)
Так почему же ptv_vector не создаётся размерности m_points.size()?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 29, 2012, 12:08 »

Спасибо за пример, но хотелось бы реализовать так - как я вижу это в своём проекте. Так проще для понимания, я только начинаю)
Это вполне нормально/понятно - ведь что-то уже написано и оно "почти работает"  Улыбающийся
Нужно только чуть-чуть доделать - и все. Однако это чуть-чуть оказывается очень и очень долгим.

Граф, ребра - все это вещи хорошо известные, так зачем изобретать велосипед (в данном случае очень паршивый)? Храните ребра как делают все - индексы 2 вершин (которые это ребро соединяет). Плюс доп данные (в данном случае угол). Если Вы только начинаете - не лезьте в глупые итераторы, обходитесь циклом for. Если Вы замечаете что получается длинное/неудобное выражение - делайте метод (таких маленьких методов обычно много у класса "ребро"). Объявляя массив думайте точно ли он нужен и точно ли этой размерности. А пока все Ваши массивы - источники ошибок, которые Вы будете искать очень долго.

Записан
voodoo
Гость
« Ответ #9 : Май 29, 2012, 12:19 »

Ладно, допустим вместо координат - будут индексы, так ещё проще выйдет. Но мне хоть убей нужно объявить массив, размерность которого я знаю  В замешательстве
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Май 29, 2012, 12:29 »

Ладно, допустим вместо координат - будут индексы, так ещё проще выйдет. Но мне хоть убей нужно объявить массив, размерность которого я знаю  В замешательстве
Создайте новый проект, в нем объявите структуру m_vector и выделите массив как указал kambala. Сообщите результат
Записан
voodoo
Гость
« Ответ #11 : Май 29, 2012, 14:00 »

Код
C++ (Qt)
private:
   struct a
   {
       int begin,end;
   };
   QVector<QPoint> m_points;
 
public slots:
   void test()
   {
       m_points.append(QPoint(10,10));
       m_points.append(QPoint(10,10));
       m_points.append(QPoint(10,10));
       a *massive = new a[m_points.size()];
   }
 

Снова печаль  В замешательстве
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Май 29, 2012, 14:04 »

И в чем печаль?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #13 : Май 29, 2012, 14:09 »

Снова печаль  В замешательстве

Какая еще печаль? все нормально создалось же
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Май 29, 2012, 14:11 »

массив надо ещё заполнить нужными элементами - из воздуха они не появятся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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