Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
1

Программа аварийно завершается при прохождении цикла

04.06.2012, 00:48. Просмотров 1166. Ответов 10
Метки нет (Все метки)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
 
 QVector<int> Set;
    QPair <int,int> Map[8];
    int c=0,Num,;
 
   srand(time(NULL));
    while(c<9){
 
        Num=rand()%9;
//при первом прохождении цикла умирает на этой строчке(т.е. рандом делает и помер)
 
        if (Set.indexOf(Num)==-1){
 
            Set<<Num;
            Obj[c].Number=Num;
            Obj[c].F=Map[Num].first;
            Obj[c].S=Map[Num].second;
            
            QMessageBox::about(0,"",QString::number(Num)+"    "+QString::number(Map[Num].first)+"   "+QString::number(Map[Num].second));
 
            c++;
        }
    }
что не так?
написано в qt
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2012, 00:48
Ответы с готовыми решениями:

Программа завершается крахом при чтении из сокета
Есть структура balance, ее тип ProtocolStruct::RespEnvirState. Есть переменная int nBalance,...

Программа завершается аварийно при вызове функции
Делаю консольное приложение на шестом Билдере. Не могу найти ошибку.Убил день. Прога компилиться...

При открытия файла аварийно завершается программа
Пишу меди плеер , при открытия файла программа завершаться аварийно, вот код программы using...

Программа аварийно завершается
Доброго времени суток! Моя программа аварийно завершается вернув значение &quot;255 (0xFF)&quot; Прошу...

программа завершается аварийно
запускаю компилятор, все запустилось, работает (меню из кучи условий if-else). выбираю любой пункт...

10
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
04.06.2012, 01:41 2
Что такое Obj? может это пустой контейнер, а вы к его элементам по индексу обращаетесь.
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.06.2012, 01:52  [ТС] 3
ихвиняюсь,забыл
вот заголовочный файл
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef OBJ_H
#define OBJ_H
#include <QtGui>
class cObj : public QLabel
{
    Q_OBJECT
 
public:
    int Top,Left,Position,TruePosition,Number,F,S;
    bool Enabled;
    QPixmap Img;
 
    bool IsEnable();
protected:
    virtual void mousePressEvent(QMouseEvent* ev);
    virtual void mouseMoveEvent(QMouseEvent* ev);
   // virtual void mouseReleaseEvent(QMouseEvent *ev;
 
};
 
#endif // OBJ_H
Добавлено через 44 секунды
cObj Obj[8];

с этим все окей
0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
04.06.2012, 01:54 4
это класс, инстансы которого хранятся в Obj. А что такое Obj? Массив, вектор, что-то еще?
Obj[c] - вот это обращение к элементу по индексу.
Если Obj - пустой контейнер, то так делать нельзя.
И неужели в дебаг режиме нельзя прогу запустить и посмотреть где и при каких обстоятельствах падает?
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.06.2012, 01:57  [ТС] 5
ошибка возникает на строке (Set.indexOf(Num)==-1){
0
Demy85
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 221
Завершенные тесты: 1
04.06.2012, 11:54 6
Приведи полный тестовый пример. Потому что строка
C++ (Qt)
1
int c=0,Num,;
явно вызовет ошибку компиляции.
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.06.2012, 12:16  [ТС] 7
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void cLoauding::Random(){
 
    QVector<int> Set;
    QPair <int,int> Map[8];
    int c=0,Num,f=0,s=0,schet=1;
 
    for (int i=0;i<9;i++){
 
        Map[i].first=f;
        Map[i].second=s;
 
        s++;
        if (schet%3==0){
 
            f++;
            s=0;
        }
 
        schet++;
    }
 
    srand(time(NULL));
    while(c<9){
 
        Num=rand()%9;
 
        if (Set.indexOf(Num)==-1){
 
            Set<<Num;
            Obj[c].Number=Num;
            Obj[c].F=Map[Num].first;
            Obj[c].S=Map[Num].second;
 
            QMessageBox::about(0,"",QString::number(Num)+"    "+QString::number(Map[Num].first)+"   "+QString::number(Map[Num].second));
 
            c++;
        }
    }
}
повторюсь,ошибка на функции Set.indexOf точно
0
NoMasters
Псевдослучайный
1912 / 1123 / 90
Регистрация: 13.09.2011
Сообщений: 3,182
04.06.2012, 12:39 8
Цитата Сообщение от spydark91 Посмотреть сообщение
cObj Obj[8];
Цитата Сообщение от spydark91 Посмотреть сообщение
while(c<9){
Что-то мне подсказывает, что с indexOf всё хорошо.
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.06.2012, 15:09  [ТС] 9
меньше 9,следовательно на 8 он занакчивает.

просто я проверял , вставляя сообщения после ранодма и после входа в блок if сообщение после рандома вылазило,а в блоке if нет, следовательно дело в indexOf()
0
Humanoid
Почетный модератор
10033 / 3911 / 354
Регистрация: 12.06.2008
Сообщений: 11,457
04.06.2012, 16:35 10
Цитата Сообщение от spydark91 Посмотреть сообщение
меньше 9,следовательно на 8 он занакчивает.
cObj Obj[8] означает, что элементы могут быть от 0 до 7... а условие while(c<9) означает, что тут "c" может принять значение 8, которое выйдет за пределы массива. Дальнейшее поведение непредсказуемое.
1
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.06.2012, 20:22  [ТС] 11
тупанул ппц
описывается это в Loauding.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef LOAUDING_H
#define LOAUDING_H
#include <string>
#include <QtGui>
#include <Obj.h>
class cLoauding : public QObject {
    Q_OBJECT
public:
    QString OriginalPicturePath;
    QPixmap OriginalPicture;
    QLabel OriginalPict;
    QGridLayout LayoutShavedPicter;
    QGridLayout LayoutMain;
    cObj Obj[8];          //меняю на 9 и программа не запускается!!!!
    int FWidth,FHeight;
    QWidget Form1;
компилируется все нормально
Запускается D:\Soft\OtSDK\Projects\Picture\Match_Picture-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\debug\Match_Picture.exe...
Программа неожиданно завершилась.
D:\Soft\OtSDK\Projects\Picture\Match_Picture-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\debug\Match_Picture.exe завершился с кодом -1073741819


как такое может быть?

Добавлено через 1 час 7 минут
вообще не понимаю в чем дело...
Запускается D:\Soft\OtSDK\Projects\Picture\Match_Picture-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\debug\Match_Picture.exe...
Программа неожиданно завершилась.
D:\Soft\OtSDK\Projects\Picture\Match_Picture-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\debug\Match_Picture.exe завершился с кодом -1073741819

main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QTextCodec>
#include <QtGui>
#include <Loauding.h>
 
int main(int argc, char *argv[])
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QApplication a(argc, argv);
    cLoauding Loading;
 
    Loading.Start();
 
    return a.exec();
}
Obj.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef OBJ_H
#define OBJ_H
#include <QtGui>
class cObj : public QLabel
{
    Q_OBJECT
 
public:
    int Top,Left,Position,TruePosition,Number,F,S;
    bool Enabled;
    QPixmap Img;
 
    void setDark();
 
    bool IsEnable();
protected:
    virtual void mousePressEvent(QMouseEvent* ev);
    virtual void mouseMoveEvent(QMouseEvent* ev);
   // virtual void mouseReleaseEvent(QMouseEvent *ev;
 
};
 
#endif // OBJ_H
Obj.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <Obj.h>
 
 
int x,y,Px,Py;
 
void cObj::mousePressEvent(QMouseEvent *ev){
 
    ::Px=ev->x();
    ::Py=ev->y();
 
 
}
 
void cObj::mouseMoveEvent(QMouseEvent *ev){
 
    setGeometry(Left+ev->x()-::Px,Top+ev->y()-::Py,width(),height());
    //наверз ее,чтоб не мигала
 
}
 
void cObj::setDark(){
 
    QPainter line(&Img);
 
    line.setBrush(QBrush(Qt::black,Qt::Dense5Pattern));
    line.drawRect(0,0,width(),height());
    line.end();
}
Loauding.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef LOAUDING_H
#define LOAUDING_H
#include <string>
#include <QtGui>
#include <Obj.h>
class cLoauding : public QObject {
    Q_OBJECT
public:
    QString OriginalPicturePath;
    QPixmap OriginalPicture;
    QLabel OriginalPict;
    QGridLayout LayoutShavedPicter;
   // QGridLayout LayoutMain;
    cObj Obj[9];
    int FWidth,FHeight;
    QWidget Form1;
 
 
 
 
    void Start();
    void Random();
 
 
 
 
 
public slots:
    void SetPicture();
signals:
    void ShaveSignal();
 
 
 
};
#endif // LOAUDING_H
Loauding.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <Loauding.h>
#include <QDialog>
#include <math.h>
#include <stdlib.h>
#include <time.h>
 
QGridLayout* LayoutMain = new QGridLayout;
 
void cLoauding::SetPicture(){
    OriginalPicturePath="";
    OriginalPicturePath=QFileDialog::getOpenFileName(0,QObject::tr("Выберите картинку"),"","*.jpg *.bmp");
    if (OriginalPicturePath!=""){
      OriginalPicture.load(OriginalPicturePath);
 
      int SH=OriginalPicture.height()/3;
      int SW=OriginalPicture.width()/3;
 
      //---------------------------------------------------------------------------------------------------------------
 
      QPainter line(&OriginalPicture);
      line.setPen(QPen(Qt::red,2,Qt::DashLine));
      line.setRenderHint(QPainter::Antialiasing,true);
      line.drawLine(QPointF(SW,0),QPointF(SW,3*SH));
      line.drawLine(QPointF(2*SW,0),QPointF(2*SW,3*SH));
 
      line.drawLine(QPointF(0,SH),QPointF(3*SW,SH));
      line.drawLine(QPointF(0,2*SH),QPointF(3*SW,2*SH));
 
     // line.setBrush(QBrush(Qt::black,Qt::Dense5Pattern));
     // line.drawRect(0,0,3*SW,3*SH);
 
      line.end();
 
      //---------------------------------------------------------------------------------------------------------------
 
      Form1.setGeometry(Form1.x(),Form1.y(),610,510);
      OriginalPicture=OriginalPicture.scaled(510,510,Qt::KeepAspectRatio,Qt::SmoothTransformation);
      OriginalPict.setPixmap(OriginalPicture);
      OriginalPict.setAlignment(Qt::AlignTop);
 
      SH=OriginalPicture.height()/3;
      SW=OriginalPicture.width()/3;
 
      int c=0;
      for (int i=0;i<3;i++){
          for (int u=0;u<3;u++){
 
            
 
              Obj[c].Img=OriginalPicture.copy(u*SW,i*SH,SW,SH);
              Obj[c].setPixmap(Obj[c].Img);
              Obj[c].setDark();
 
              c++;
          }
      }
 
      Random();
 
      for (int i=0;i<8;i++){
 
          LayoutShavedPicter.addWidget(&Obj[i],Obj[i].F,Obj[i].S,Qt::AlignCenter);
      }
 
    }
    else{
        QMessageBox::critical(0,QObject::tr("Ошибка"),QObject::tr("Открытие файла не возможно.\nНе указан путь."),QMessageBox::Ok);
    }
 
 
 
};
void cLoauding::Start(){
 
    QGridLayout* LayoutButtons = new QGridLayout;
    QPushButton* ButLoaud = new QPushButton(QObject::tr(" Загрузить картинку "));
    QPushButton* ButRefresh = new QPushButton(QObject::tr("Обновить"));
    QPushButton* ButMatchTrue = new QPushButton(QObject::tr("Собрать"));
 
    //---------------------------------------------------------------------------------------------------------------
 
    ButRefresh->setEnabled(false);
    ButMatchTrue->setEnabled(false);
 
    //---------------------------------------------------------------------------------------------------------------
 
    LayoutButtons->addWidget(ButLoaud,0,0,Qt::AlignTop);
    LayoutButtons->addWidget(ButRefresh,0,1,Qt::AlignTop);
    LayoutButtons->addWidget(ButMatchTrue,0,2,Qt::AlignTop);
 
    ::LayoutMain->addLayout(LayoutButtons,0,0,1,2);
    ::LayoutMain->addWidget(&OriginalPict,1,0,Qt::AlignTop|Qt::AlignLeft);
    ::LayoutMain->addLayout(&LayoutShavedPicter,1,1,Qt::AlignTop|Qt::AlignRight);
 
    //---------------------------------------------------------------------------------------------------------------
 
    QObject::connect(ButLoaud,SIGNAL(clicked()),this,SLOT(SetPicture()));
 
 
    Form1.setWindowTitle("Match Picture");                      //нажимаю отладку,стрелочка на эту строчку указывает
    Form1.setLayout(::LayoutMain);
    Form1.setGeometry(Form1.x(),Form1.y(),350,100);
    Form1.move((QApplication::desktop()->width()-Form1.width())/2,(QApplication::desktop()->height()-Form1.height())/2-200);
    Form1.show();
 
 
 
 
}
 
 
 
void cLoauding::Random(){
 
    QVector<int> Set;
    QPair <int,int> Map[9];
    int c=0,Num,f=0,s=0,schet=1;
 
    for (int i=0;i<9;i++){
 
        Map[i].first=f;
        Map[i].second=s;
 
        s++;
        if (schet%3==0){
 
            f++;
            s=0;
        }
 
        schet++;
    }
 
    srand(time(NULL));
    while(c<9){
 
        Num=rand()%9;
 
 
 
 
        if (Set.indexOf(Num)==-1){
 
            Set<<Num;
            Obj[c].Number=Num;
            Obj[c].F=Map[Num].first;
            Obj[c].S=Map[Num].second;
 
            QMessageBox::about(0,"",QString::number(Num)+"    "+QString::number(Map[Num].first)+"   "+QString::number(Map[Num].second));
 
            c++;
        }
 
 
    }
}


только что онормально запускалось..
0
04.06.2012, 20:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2012, 20:22

Работа с матрицами (программа завершается аварийно)
Помогите, на Си, не С++. Выдает другие значения, к тому же аварийно завершает программу Для...

Рекурсия, почему программа завершается аварийно?
Подскажите, почему не работает рекурсия?? #include &lt;iostream&gt; using namespace std; void fn(int...

Программа аварийно завершается после оператора scanf
Такая проблема. Я начинающий. Занимаюсь уже вторую неделю. Написал такой код, запускаю программа....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru