Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177

Выделение памяти под массив класса (конструктор класса)

25.12.2011, 15:00. Показов 3394. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте программисты. Не могу понять, почему при использовании объекта класса возникает ошибка.
Вот код объявления массива объектов класса:
C++
1
array<Neuron^>^ Neurons;
Вот код выделения памяти под массив и под отдельный элемент:
C++
1
2
3
4
5
6
7
8
Perseptron(int QuantOfNeurons, int NumOfInputs, int ThLevel)
    {
        Neurons = gcnew array<Neuron^>(QuantOfNeurons);
        for(int i = 0; i < QuantOfNeurons; i++)
        {
            Neurons[i] = gcnew Neuron(NumOfInputs, ThLevel);
        }
    }
Вот код где вылетает ошибка:
C++
1
2
3
4
for(int k = 0; k < 400/*(int)NumberOfInputs*/; k++)
        {
            Neurons[i]->X[k] = Input[k]; // error
        }
Код самой ошибки:
HTML5
1
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Буду очень благодарен за помощь в отладке.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2011, 15:00
Ответы с готовыми решениями:

Выделение динамической памяти под массив из класса
Допустим, есть class c, и он включает в себя char-массив a: class c { private: char a; public: c(); c(char* a); }

Выделение памяти под шаблон класса
Здравствуйте, надеюсь это последняя тема от меня. А то что-то много вопросов последнее время. Очень надеюсь на помощь. Собственно, есть 2...

Динамическое выделение памяти под объект класса
Помогите динамически выделить память под объект класса.

18
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 15:33
для начала дайте код с самим классом Neuron
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 15:38  [ТС]
Конструктор класса Neuron:
C++
1
2
3
4
5
6
Neuron(int NumberOfInputs, int ThLevel)
    {
        Weight = gcnew array<Int32^>(NumberOfInputs);
        X = gcnew array<Int32^>(NumberOfInputs);
        ThresholdLevel = ThLevel;
    }
Часть переменных используемых в конструкторе:
C++
1
2
3
    array<Int32^>^ Weight;
    array<Int32^>^ X;
    Int32^ ThresholdLevel;
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 15:59
опять же
C++
1
2
3
4
5
6
Neuron(int NumberOfInputs, int ThLevel)
        {
                Weight = gcnew array<Int32>(NumberOfInputs);
                X = gcnew array<Int32>(NumberOfInputs);
                ThresholdLevel = ThLevel;
        }
C++
1
2
3
       array<Int32>^ Weight;
        array<Int32>^ X;
        Int32 ThresholdLevel;
Класс Neuron объявлен как ссылочный?
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 16:13  [ТС]
AnDrew_LP, класс Neuron объявлен вот так:
C++
1
public ref class Neuron
Класс Perseptron вот так:
C++
1
public ref class Perseptron
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 16:45
C++
1
2
3
4
for(int k = 0; k < 400/*(int)NumberOfInputs*/; k++)
                {
                        Neurons[i]->X[k] = Input[k]; // error
                }
Input - это что?
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 16:56  [ТС]
AnDrew_LP, Input – это одномерный массив. Он передаётся как параметр функции. Массив полностью проинициализирован. Я сам проверял.
А вот Neurons[i] как говорит компилятор «Значение не определено».
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 17:21
Ну не знаю...
C++
1
array<Int32>^ X;
Объявлен public членом?
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 17:26  [ТС]
AnDrew_LP, да.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public ref class Neuron
{
public:
    Neuron(array<Int32^>^ Input, int NumberOfInputs, int ThLevel)
    {
        Weight = gcnew array<Int32^>(NumberOfInputs);
        X = gcnew array<Int32^>(NumberOfInputs);
        ThresholdLevel = ThLevel;
        for(int i = 0; i < NumberOfInputs; i++)
        {
            X[i] = Input[i];
        }
    }
    Neuron(int NumberOfInputs, int ThLevel)
    {
        Weight = gcnew array<Int32^>(NumberOfInputs);
        X = gcnew array<Int32^>(NumberOfInputs);
        ThresholdLevel = ThLevel;
    }
    array<Int32^>^ Weight;
    array<Int32^>^ X;
...
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 17:40
так Вы не исправили
C++
1
array<Int32^>^ X;
на
C++
1
array<Int32>^ X;
?
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 17:53  [ТС]
AnDrew_LP, Скажите, а какие изменения это действия принесёт? Тогда я получается сделал неправильно весь класс?
Я внёс изменение и получил вот эти ошибки:
http://saveimg.ru/show-image.p... 01e8a0182a
Я их исправил. Но я хочу понять, почему так нужно делать?

Я скомпилировал и получил ту же самую ошибку.
Вот ссылка на скрин: http://saveimg.ru/show-image.p... 8d732e62d0
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 17:57
Основные отличия C# от C++ CLI
пункт 3
Я скомпилировал и получил ту же самую ошибку.
Вот ссылка на скрин: http://saveimg.ru/show-image.p... 8d732e62d0
Потому, что везде надо исправить Int32^ на Int32
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 18:03  [ТС]
AnDrew_LP, Ага, понятно. Я использую «управляемый ссылочный тип» в моём классе.
Но ошибка как была, так и есть. Странно, что она проявляется только при выполнении.

Повторюсь, я в своих классах использую «ссылочную кучу». То есть класс имеет вид:
C++
1
2
3
ref class MyClass // управляемый ссылочный тип
{
};
А переменные инициализируются вот так:
C++
1
MyClass^ obj = gcnew MyClass ;
и я не нахожу смысла что либо менять.
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 18:04
так вы исправили array<Int32^>^ Input на array<Int32>^ Input ?
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 18:07  [ТС]
AnDrew_LP, я не вижу смысла.
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 18:09
дайте код всего метода, в котором ошибка
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 18:10  [ТС]
AnDrew_LP,
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
void Perseptron::NetworkStart(array<Int32^>^ Input)
{
    for(int i = 0; i < 10/*(int)QuantityOfNeurons*/; i++)
    {
        for(int k = 0; k < 400/*(int)NumberOfInputs*/; k++)
        {
            Neurons[i]->X[k] = (int)Input[k]; // error
        }
        //Y[(int)QuantityOfNeurons] = Neurons[i]->Transfer();
        Y[i] = Neurons[i]->Transfer();
    }
}
void Perseptron::ToTrain(array<Int32^>^ X, array<Int32^>^ D)
{
    NetworkStart(X);
    for(int i = 0; i < (int)QuantityOfNeurons; i++)
    {
        if(Y[i] == D[i])
        {
            continue;
        }
        if(Y[i] == (Int32^)0 && D[i] == 1)
        {
            for(int k = 0; k < (int)NumberOfInputs; k++)
            {
                (int)Neurons[i]->Weight[k] = (int)Neurons[i]->Weight[k] + (int)X[k];
            }
        }
        if(Y[i] == 1 && D[i] == (Int32^)0)
        {
            for(int k = 0; k < (int)NumberOfInputs; k++)
            {
                (int)Neurons[i]->Weight[k] = (int)Neurons[i]->Weight[k] - (int)X[k];
            }
        }
    }
}
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
25.12.2011, 19:39
Neurons инициализируется раньше,чем вызывается метод Perseptron::ToTrain ?
1
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.12.2011, 19:49  [ТС]
AnDrew_LP, спасибо за помощь, проблему я решил.
Проблема была в том, что я не инициализировал обьект класса Perseptron хотя думал, что сделал это.

Я когда доделаю, то повозу вас на релиз. Ок? )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2011, 19:49
Помогаю со студенческими работами здесь

Влияет ли конструктор на выделение памяти под объект?
Прочёл в книге Р.Лафоре &quot;Объектно-ориентированное программирование в С++:&quot; Подобно конструкторам, деструкторы не возвращают значения и...

Конструктор класса не видит конструктор по умолчанию другого класса
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Выделение памяти в методах класса
День добрый. Вроде встречала, что через new память выделяется до конца работы программы. Вот два примера. class A { public: ...

Динамическое выделение памяти для объекта класса
Скажите в чем отличие между A *ptr=new A() и A *ptr=new A;

Объявление класса и выделение памяти для его полей
Читаю Троелсена, вижу такое объявление класса: class Rectangle { private Point topLeft = new Point(); ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru