Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 11.02.2009
Сообщений: 57
1

Правильное динамическое выделение памяти.

01.12.2009, 22:27. Показов 1302. Ответов 7
Метки нет (Все метки)

помогите пожалуйста, спасете человек 6...
Преподаватель спросил как сделать программу без этого участка
C++
1
2
3
4
5
6
7
8
9
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Rows = StrToInt (Edit1->Text);
Vect0 = new double [Rows];
Vect1 = new double [Rows];
Vect2 = new double [Rows];
 
}
и как исправить что бы она работала(правильно работала)
Потом пришли к вводу что работоспособность зависит от того где объявлены double *Vect0, *Vect1, *Vect2; int Rows;
Если сделать вот так должно было работать, но оказалось что она работает всегда...
Ктонибудь может сказать какая разница в том где идет объявление или посоветовать чтонибудь....очень нужно...
C++
1
2
3
4
5
6
7
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double *Vect0, *Vect1, *Vect2; int Rows;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)

исходный код
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
/---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Rows = StrToInt (Edit1->Text);
Vect0 = new double [Rows];
Vect1 = new double [Rows];
Vect2 = new double [Rows];
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Rows = StrToInt (Edit1->Text);
StringGrid1->RowCount = Rows + 1;
delete [] Vect0;
delete [] Vect1;
delete [] Vect2;
Vect0 = new double [Rows];
Vect1 = new double [Rows];
Vect2 = new double [Rows];
MyRand (Vect0);
MyRand (Vect1);
MyVectToGrid (Vect0, 0);
MyVectToGrid (Vect1, 1);
Button2->Enabled=true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 MyGridToVect (Vect0, 0);
 MyGridToVect (Vect1, 1);
 for (int i=0; i<Rows; ++i)
 Vect2 [i] = pow(Vect0 [i] + Vect1 [i],2);
 MyVectToGrid (Vect2, 2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
try
 { if (StrToInt(dynamic_cast<TEdit*>(Sender)->Text)<=0) throw 1;}
  catch(...)
 { ShowMessage("не целое положительное число ");
 dynamic_cast<TEdit*>(Sender)->SetFocus(); }
}
//---------------------------------------------------------------------------
h файл
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TStringGrid *StringGrid1;
    TButton *Button1;
    TEdit *Edit1;
    TButton *Button2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
        void __fastcall Edit1Exit(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    double *Vect0, *Vect1, *Vect2; int Rows;
 
    void __fastcall TForm1::MyVectToGrid (double* vec, int col)
    { for (int i = 0; i < Rows; ++i)
    StringGrid1->Cells [col][i+1] = FloatToStrF(vec [i], ffFixed, 8, 2); }
 
    void __fastcall TForm1::MyGridToVect (double* vec, int col)
    { for (int i = 0; i < Rows; ++i)
      vec [i]= StrToFloat(StringGrid1->Cells [col][i+1]); }
 
    void __fastcall TForm1::MyRand (double* vec)
    {
    for (int i = 0; i < Rows; ++i) vec [i] = random (10); }
};
 
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2009, 22:27
Ответы с готовыми решениями:

Динамическое выделение памяти
В одном источнике прочитал следующее Т.е. блок выделяемой памяти должен быть кратен параграфу?...

Динамическое выделение памяти под строку
Проблема в том, что при выделении памяти под строку temp-&gt;data.other, происходит изменение...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде...

Как использовать динамическое выделение памяти для новых массивов фиксированного размера?
как использовать динамическое выделение памяти для новых массивов фиксированного размера?

7
Супер-модератор
8766 / 2501 / 142
Регистрация: 07.03.2007
Сообщений: 11,851
01.12.2009, 22:51 2
Sagamor, да в принципе он вам и не нужен, так как вы и так выделяете память при клике на кнопку, вам осталось убрать из конструктора код и перед очисткой памяти проверять - выделена ли она вообще...

а вот место объявления переменных очень важно, так как определяет их область видимости, это во-первых, а во-вторых, объявление их в разделе public делает их свойствами класса формы, а, следовательно, доступ к ним организовать можно с помощью создания объекта формы, а вот если объявить просто в cpp, тогда они доступны только коду, что расположен ниже...
0
0 / 0 / 0
Регистрация: 11.02.2009
Сообщений: 57
01.12.2009, 22:53  [ТС] 3
Спасибо попробую.
А в чем разница между динамической памятью, объявленной в классе формы и той же памятью объявленной как глобальные переменные?
0
Супер-модератор
8766 / 2501 / 142
Регистрация: 07.03.2007
Сообщений: 11,851
01.12.2009, 23:07 4
Sagamor, отличие простое - глобальные переменные доступны согласно своей области видимости. а вот объявленные в классе доступны только в экземплярах (объектах) данного класса...
0
0 / 0 / 0
Регистрация: 11.02.2009
Сообщений: 57
01.12.2009, 23:25  [ТС] 5
Lord_VoodooСпасибо. Извинюсь за повторный вопрос, по запаре не доконца прочитал ответ.
Я организовал проверку так:
if (myVector0!=NULL) //т.к они идут все 3 вместе.
{
delete [] myVector0;
delete [] myVector1;
delete [] myVector2;
}
0
Супер-модератор
8766 / 2501 / 142
Регистрация: 07.03.2007
Сообщений: 11,851
01.12.2009, 23:31 6
Sagamor, вообще я бы для каждого массива делал свою проверку
1
0 / 0 / 0
Регистрация: 11.02.2009
Сообщений: 57
01.12.2009, 23:33  [ТС] 7
понял, спасибо)
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
03.12.2009, 17:50 8
Цитата Сообщение от Sagamor Посмотреть сообщение
Я организовал проверку так:
if (myVector0!=NULL) //т.к они идут все 3 вместе.
{
delete [] myVector0;
delete [] myVector1;
delete [] myVector2;
}

На будущее: так нельзя делать. Как сказал Lord_Voodoo, нужно для каждого указателя делать свою проверку. Простой пример: для первых двух векторов myVector0, myVector1 память выделена, а для myVector2 - нет, например, не хватает ресурсов=>Следовательно и очищать не нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2009, 17:50

Динамическое распределение памяти
void __fastcall TForm1::Button1Click(TObject *Sender) { int const col = StrToInt(Edit1-&gt;Text);...

Выделение памяти
MyClass&amp; DXI =* new MyClass(); Это корректный код для выделения памяти, чтобы к переменной можно...

Выделение памяти
Пишу программу в C++ Borland Builder 6. Если пытаюсь выделить сколь угодно много памяти с помощью...

Выделение динамической памяти
Задан граф в виде матрицы смежности вершин. Найти число компонент связности в этом графе....


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

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

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