Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
#1

Непонятки с C++Builder - C++ Builder

09.06.2011, 05:21. Просмотров 494. Ответов 3
Метки нет (Все метки)

Господа, приветствую всех.
Вкратце постараюсь обрисовать суть проблемы - есть статистическая задача в виду курсовой, можете даже не вникать в ее суть, однако проблема в том - что в консольном приложении Visual Studio, и консольном приложении C++ Builder (Rad 2010) - код работает нормально.

А вот в приложении форм C++ Builder, этот же код дает совсем неверный результат.
Опять же вкратце "суть нерабочести" - при n изменяющемся (1..2...3.) (мало) и при m = (10,100,1000, 100..00) должна повышаться точность решения, и выводиться будут фактически "Qmin+=step".
C++
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
 
#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <tchar.h>
//---------------------------------------------------------------------------
 
#pragma argsused
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 
 
    int n;                             //число элементов в наборе
    cout<<"Please, input n";
    cin>>n;
        int Qmin;                         //левая границы интервала оцениваемого параметра
    cout<<"Please, input Qmin";
    cin>>Qmin;
    int Qmax;                         //правая
    cout<<"Please, input Qmax";
    cin>>Qmax;
    float step;                     // шаг приращения изменения параметра
    cout<<"Please, input step";
    cin>>step;
    int m;                       /* фактически число запусков программы. т.е. столько раз будет считаться оценка в каждой точке, а потом находиться их среднее арифметическое. */
    cout<<"Please, input m";           
    cin>>m;
 
 
    float qcounter=0;
    int sch=0;
    int sch_1=0;
    int Qrealcount=0;
 
    for(qcounter = Qmin; qcounter<=Qmax; qcounter+=step )
    {
        Qrealcount++;   // подсчет числа параметров
    }
 
///////////////////////////////Генерация массива///////////////////////////////
 
    float*** z;
 
    float Qmintemp=Qmin;
 
    z=(float***)malloc(m*sizeof(float**));
    for(int mCount=0; mCount<m; mCount++ )
    {
        *(z+mCount)=(float**)malloc(Qrealcount*sizeof(float*));
        for(sch = 0; sch<Qrealcount; sch++ )
        {
            *(*(z+mCount)+sch)=(float*)malloc(n*sizeof(float));
            for(sch_1=0; sch_1<n; sch_1++)
            {
                *(*(*(z+mCount)+sch)+sch_1)=(((rand())/(float)RAND_MAX*Qmintemp));
            }
            Qmintemp+=step;
        }
        Qmintemp=Qmin;
    }
 
//////////////////////////////
    Qmintemp=Qmin;
    float* arrQ;   //Массив значений параметров
    arrQ=(float*)malloc(Qrealcount*sizeof(float));
 
    for(sch = 0; sch<Qrealcount; sch++ )
    {
        *(arrQ+sch)=Qmintemp;   // Запишем в него текущий параметр =)
        Qmintemp+=step;
    }
////////////////////////////////////// Метод Оценки параметра(удвоенное среднее арифметическое набора)
 
    float** arr_Q3;
    arr_Q3=(float**)malloc(m*sizeof(float*));
    float Sraf = 0;
 
    for(int mCount=0; mCount<m; mCount++ )
    {
        *(arr_Q3+mCount) = (float*)malloc(Qrealcount*sizeof(float));
 
        for(sch = 0; sch<Qrealcount; sch++ )
        {
            for(sch_1=0; sch_1<n; sch_1++)
            {
               Sraf+= *(*(*(z+mCount)+sch)+sch_1); //сумма всех чисед
 
            }
            *(*(arr_Q3+mCount)+sch)= (Sraf/(float)n)*2; // делится на их число
            Sraf = 0;
        }
    }
 
 ////////////////////////  Нах.Ср.Ариф.Общ.Оценок///////////////////////////
 
    float Q_33=0;
    float* Q__3;
    Q__3=(float*)malloc(Qrealcount*sizeof(float));
 
 
    for(sch = 0; sch<Qrealcount; sch++)
    {
        for(int mCount = 0; mCount<m; mCount++ )
        {
            Q_33 += *(*(arr_Q3+mCount)+sch);
        }
 
        *(Q__3+sch) = Q_33/(float)m;
        Q_33 = 0;
    }
 
 
////////////////Вывод
 
 
    for(int j = 0; j<Qrealcount; j++)
    {
    cout<<"Q[j]= "<<(j,*(Q__3+j))<<endl;
    }

И вот эта же программа в визуальной среде. массив вывожу TChartom;
C++
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
include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Chart"
#pragma link "Series"
#pragma link "TeEngine"
#pragma link "TeeProcs"
#pragma resource "*.dfm"
#define RAND_MAX 32767
 
TForm1 *Form1;
int n;
int m;
float Qmin,Qmax;
float step;
int Qrealcount;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  Qmin=Edit1->Text.ToInt();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender)
{  Qmax=Edit2->Text.ToInt();
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3Change(TObject *Sender)
{
     step=Edit3->Text.ToDouble();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit4Change(TObject *Sender)
{     n=Edit4->Text.ToInt();
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit5Change(TObject *Sender)
{    m=Edit4->Text.ToInt();
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 
    float qcounter=0;
    int sch=0;
    int sch_1=0;
    int Qrealcount=0;
 
    for(qcounter = Qmin; qcounter<=Qmax; qcounter+=step )
    {
        Qrealcount++;   // подсчет числа параметров
    }
 
///////////////////////////////Генерация массива///////////////////////////////
 
    float*** z;
 
    float Qmintemp=Qmin;
 
    z=(float***)malloc(m*sizeof(float**));
    for(int mCount=0; mCount<m; mCount++ )
    {
        *(z+mCount)=(float**)malloc(Qrealcount*sizeof(float*));
        for(sch = 0; sch<Qrealcount; sch++ )
        {
            *(*(z+mCount)+sch)=(float*)malloc(n*sizeof(float));
            for(sch_1=0; sch_1<n; sch_1++)
            {
                *(*(*(z+mCount)+sch)+sch_1)=(((rand())/(float)RAND_MAX*Qmintemp));
            }
            Qmintemp+=step;
        }
        Qmintemp=Qmin;
    }
 
 
 
    Qmintemp=Qmin;
    float* arrQ;   //Массив значений параметров
    arrQ=(float*)malloc(Qrealcount*sizeof(float));
 
    for(sch = 0; sch<Qrealcount; sch++ )
    {
        *(arrQ+sch)=Qmintemp;   // Запишем в него текущий параметр =)
        Qmintemp+=step;
 
 
    }
 
 
float** arr_Q3;
    arr_Q3=(float**)malloc(m*sizeof(float*));
    float Sraf = 0;
 
    for(int mCount=0; mCount<m; mCount++ )
    {
        *(arr_Q3+mCount) = (float*)malloc(Qrealcount*sizeof(float));
 
        for(sch = 0; sch<Qrealcount; sch++ )
        {
            for(sch_1=0; sch_1<n; sch_1++)
            {
               Sraf+= *(*(*(z+mCount)+sch)+sch_1); //сумма всех чисед
 
            }
            *(*(arr_Q3+mCount)+sch)= (Sraf/(float)n)*2; // делится на их число
            Sraf = 0;
        }
    }
 
 ////////////////////////  Нах.Ср.Ариф.Общ.Оценок///////////////////////////
 
    float Q_33=0;
    float* Q__3;
    Q__3=(float*)malloc(Qrealcount*sizeof(float));
 
 
    for(sch = 0; sch<Qrealcount; sch++)
    {
        for(int mCount = 0; mCount<m; mCount++ )
        {
            Q_33 += *(*(arr_Q3+mCount)+sch);
        }
 
        *(Q__3+sch) = Q_33/(float)m;
        
        Q_33 = 0;
    }
 
   ////////////////////////////////Отрисовка///////////////////////////////////
 
        for(int j = 0; j<Qrealcount; j++)
    {
        Series5->AddXY(*(arrQ+sch),*(Q__3+sch));
        }
 
}

И вот записывает он и как следствие выводит всякую хрень=((( Очень левые числа.
Ради бога помогите, ломаю голову третью неделю, как один и тот же код дает разные результаты.
Заранее извиняюсь за неадекватную индексацию, это вырезки из большой программы..
http://www.cyberforum.ru/cpp-builder/thread1936098.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2011, 05:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Непонятки с C++Builder (C++ Builder):

Можно ли использовать C++ Builder v11 если купить Embarcadero C++Builder XE8
День добрый! Есть старый проект С++. Он компилируется на CodeGear™...

Как использовать компоненты скомпилированные для C++ Builder 2007 в C++ Builder 2010?
Народ! Такая проблема... Есть набор компонентов т.н. Dicom VCL. Сайт...

Как заставить проект Builder 6 загруженный в Builder 2007 отображать новые кнопки
Люди добрые, кто нибудь встречался с такой проблемой: Я установил Builder...

Какой компилятор C++ Builder использовать? Rad Studio 2009 глючит. C++ Builder 6 старый
Много раз замечал непонятки с компилятором. Масла в огонь подлил Какой...

Как заставить проект сделанный на C++ Builder 6.0 работать на компьютере на котором не установлен этот самый Builder
вопрос абсолютно нубский,но очень волнует...но как заставить проект сделанный...

3
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
11.06.2011, 03:39  [ТС] #2
И никто ничего сказать не может, хоть в CodeGear пиши...Не дело это, голубчики, не дело..=(
0
Maluda
1217 / 549 / 104
Регистрация: 18.08.2009
Сообщений: 783
Завершенные тесты: 1
11.06.2011, 20:18 #3
Цитата Сообщение от prootq Посмотреть сообщение
z=(float***)malloc(m*sizeof(float**));
В Эмбаркадеро на это посмотрят и заплачут (или работать пригласят )

Добавлено через 6 минут
prootq, кстати ты слышал про такое понятие как "отладка"? Ставь точки останова и трассируй программу. А лучше всего запускай консольное приложение и своё визуальное параллельно, и смотри разницу.

Добавлено через 8 минут
Цитата Сообщение от prootq Посмотреть сообщение
C++
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
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  Qmin=Edit1->Text.ToInt();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender)
{  Qmax=Edit2->Text.ToInt();
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3Change(TObject *Sender)
{
         step=Edit3->Text.ToDouble();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit4Change(TObject *Sender)
{     n=Edit4->Text.ToInt();
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit5Change(TObject *Sender)
{    m=Edit4->Text.ToInt();
 
}


И переносишь это всё сюда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n;
int m;
float Qmin,Qmax;
float step;
int Qrealcount;
 
try {
     Qmin=Edit1->Text.ToInt();
     Qmax=Edit2->Text.ToInt();
     step=Edit3->Text.ToDouble();
     n=Edit4->Text.ToInt();
// О ВОТ И ОШИБКУ НАШЁЛ, НАВЕРНОЕ
     m=Edit4->Text.ToInt(); // ПОЧЕМУ ЗНАЧЕНИЯ ИЗ ОДНОГО И ТОГО ЖЕ ЕДИТА БЕРУТСЯ
} catch(...) {
         ShowMessage("Вместо int или float в Едите написал текст!");
}
         // ну и дальше суперматиматика твоя
}
Добавлено через 1 минуту
C++
1
2
3
     n=Edit4->Text.ToInt();
// О ВОТ И ОШИБКУ НАШЁЛ, НАВЕРНОЕ
     m=Edit4->Text.ToInt(); // ПОЧЕМУ ЗНАЧЕНИЯ ИЗ ОДНОГО И ТОГО ЖЕ ЕДИТА БЕРУТСЯ
Добавлено через 1 минуту
Цитата Сообщение от prootq Посмотреть сообщение
C++
1
2
3
4
//--------------------------------------------------------------------------- 
void __fastcall TForm1::Edit5Change(TObject *Sender) { 
     m=Edit4->Text.ToInt(); 
}
Видишь и не надо в Embarcadero писать, голубчик
1
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
11.06.2011, 21:17  [ТС] #4
Черт побери, СПАСИБО!!!!!!!!!!!!!!!!!
Я уже успел в Visual Studio в CLR разобраться за пару дней, и сделать программу там, матеря при этом каждую секунду Embarcardero, обещая себе что больше никогда в жизни не свяжусь с VCL.


громадное спасибо еще раз.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 21:17
Привет! Вот еще темы с решениями:

Ошибка E2316 (переход с Builder 6, на Builder 2010)
В общем проект создавался на Builder 6, теперь я его пытаюсь скомпилировать на...

Перевод проекта с Builder 2010 на Builder 10 Seattle
Добрый день. Перевожу проект написанный на С++ с Builder 2010 на Builder 10...

История активности файла. (C++ Builder 6, C++ Builder XE2)
Здравствуйте. Пришла идея написать программу для выявления истории активности...

можно ли в С++ Builder 2006 писать программы на С++ Builder 6?
подскажите, пожалуйста... если программка написана на С++ Builder 2006, могу...


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

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

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