Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.03.2013
Сообщений: 45

Динамический массив и его элементы

22.03.2013, 13:29. Показов 724. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня возникла проблема при инициализации динамического массива типа AnsiString. Вот часть кода,которая по идеи должна правильно работать. Первый элемент инициализируется,а вот на втором выдает ошибку:"First chance exception at $50041AE2. Exception class $C0000005 with message 'access violation at 0x50041ae2: read of address 0x74706f4c'. Process Project2.exe (6292)". \
Несколько оговорок. При запуске программы nT=0,nN-количество будущих объектов(их пользователь вводит сам.Интересно то что при 1,2 -программы выдает ошибки на этапе инициализации массива tType,а вот при 3 и более все нормально,только когда я вывожу на экран введенные данные последний выбивает какими то непонятными символами). Существует один класс -родитель и три-наследника. Есть объявление Create* CreateOb[100]. Вроде все.Подскажите что не так.

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
if(RadioGroup2->ItemIndex==2)
   {
     if(nT==0)
     {
        for(int i=0;i<NumberOfOb;i++)
        tType=new AnsiString[i];
     }
     Memo1->Lines->Add(IntToStr(nT));
     tType[nT]=Edit1->Text;
     Memo1->Lines->Add("Тип объекта "+tName[nT]+":"+tType[nT]);
     if(tType[nT]=="int")
     {
         CreateOb[nT]=new intOb(tName[nT],1);
     }
     if(tType[nT]=="float")
     {
         CreateOb[nT]=new floatOb(tName[nT],1);
     }
     if(tType[nT] =="double")
     {
         CreateOb[nT]=new doubleOb(tName[nT],1);
     }
 // Memo1->Lines->Add("Тип объекта "+tType[nT]+":"+1);
  Sleep(1000);
  if(nT<nN)
  {
    Memo1->Lines->Add("Введите количество перменных для следующего объекта.");
    nT++;
  }
  else
  Memo1->Lines->Add("Задание данных для объектов оконченно!");
  }
}
Добавлено через 19 минут
Хочу сделать поправочку. При вводе нечетных чисел все отлично работает.Блин,аномалия какая та. Не могу понять почему именно так.

Добавлено через 1 минуту
и еще в строке 26 if(nT<nN) , написано так if(nT<nN-1) .Простите за опечатку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2013, 13:29
Ответы с готовыми решениями:

Динамический массив и его элементы
Здравствуйте. У меня возникла проблема при инициализации динамического массива типа AnsiString. Вот часть кода,которая по идеи должна...

Создать динамический массив и заполнить его элементы определёнными значениями
Здравствуйте! Подскажите пожалуйста в чём может крыться ошибка (суть задачи состоит в том, чтобы создать динамический массив и заполнить...

Создать динамический массив. Заполнить его числами от 1 до n и записать его в файл.
создать динамический массив. Заполнить его числами от 1 до n и записать его в файл.

6
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.03.2013, 13:48
Цитата Сообщение от VVani Посмотреть сообщение
for(int i=0;i<NumberOfOb;i++)
tType=new AnsiString[i];
Как Вы думаете, что здесь происходит? Я отвечу - на каждой итерации создается массив строк, и при этом предыдущий выделенный массив остается висеть в памяти (утечка). Если хотите выделить массив строк, чтобы потом сравнения (строки 12,16,20) работали адекватно, то нужно писать так:
C++
1
tType=new AnsiString[NumberOfOb];
Никакие циклы не нужны.
1
0 / 0 / 0
Регистрация: 22.03.2013
Сообщений: 45
22.03.2013, 13:55  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
for(int i=0;i<NumberOfOb;i++)
tType=new AnsiString[i];
здесь создается дин.массив. один раз,на количество введеных пользователем,т.к. nT=0,только при первом выборе RadioButton'а,а потом nT++ и все, выделение повторно не происходит. Утечка не происходит.
nT служит для того ,чтобы при каждом выборе RadioButton можно было инициализировать лишь один элемент и так происходит поочередно. Вы думаете все таки здесь ошибка? Сейчас попробую Ваш вариант и отпишусь.

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
Как Вы думаете, что здесь происходит? Я отвечу - на каждой итерации создается массив строк, и при этом предыдущий выделенный массив остается висеть в памяти (утечка). Если хотите выделить массив строк, чтобы потом сравнения (строки 12,16,20) работали адекватно, то нужно писать так:
C++
1
tType=new AnsiString[NumberOfOb];
Никакие циклы не нужны.
Спасибо. Вы действительно правы. А можно тогда последний вопрос, чтобы развеять туман. Когда использовать цикл,вроде с помощью него тоже можно создавать дин.массив. ,почему в данной ситуации это не срабатывает?
Просто у меня есть часть кода ,которая правильно работает и с компилятор не выдает никаких ошибок. Вот он
C++
1
2
3
4
5
6
7
8
9
10
11
12
if(RadioGroup2->ItemIndex==1)
   {
    if(nN==0)
    {
        for(int i=0;i<NumberOfOb;i++)
        tName=new AnsiString[i];
    }
    tName[nN]=Edit1->Text;
    Memo1->Lines->Add("Имя объекта["+IntToStr(nN)+"]:"+tName[nN]);
    nN++;
 
    }
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.03.2013, 14:04
Цитата Сообщение от VVani Посмотреть сообщение
здесь создается дин.массив.
Откуда такая уверенность? Циклы давно изучали?
Цикл выполняется NumberOfOb раз, каждую итерацию выполняется тело цикла, т.е. выделение памяти для массива строк.
Допустим, если NumberOfOb = 3, то у выделится сначала массив по 0 элементов, потом под 1, и потом под 2. Память, выделенная по первым двум итерациям будет утеряна.

Добавлено через 2 минуты
Цитата Сообщение от VVani Посмотреть сообщение
которая правильно работает и с компилятор не выдает никаких ошибок
Если компилятор не выдает ошибок, это не значит, что код правильно работает.
Просто стоит разделять ошибки как минимум на: ошибки времени компиляции и ошибки времени выполнения и логические ошибки.
1
0 / 0 / 0
Регистрация: 22.03.2013
Сообщений: 45
22.03.2013, 14:07  [ТС]
Спасибо за помощь. Пойду повторю циклы.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.03.2013, 14:10
Цитата Сообщение от VVani Посмотреть сообщение
Пойду повторю циклы.
Успехов
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
22.03.2013, 14:34
И вообще рекомендуется использовать готовый контейнер строк TStringList или вектор строк
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2013, 14:34
Помогаю со студенческими работами здесь

Дан массив а1,а2,,…,аn. Переставить его элементы так, чтобы в начале массива расположились все его неотрицательные элементы, а в конце – отрицательные
Помогите плиз написать программу: Дан массив а1,а2,,…,аn. Переставить его элементы так, чтобы в начале массива расположились все его...

Дан массив а1+ a2+…+an Переставить его элементы так чтобы в начале массива расположились все его неотрицательные элементы, а в конце - отрицательные
Дан массив а1+ a2+…+an помогите переставить его элементы так чтобы в начале массива расположились все его неотрицательные элементы, а в...

Дан массив с 50 именами, используя сортировку, преобразовать его в динамический массив и использовать бинарный поиск
Помогите пожалуйста! Дан массив с 50 именами, используя сортировку, преобразовать его в динамический массив и использовать бинарный поиск...

Дан массив целых чисел. Переписать его нечетные элементы в другой массив такого же размера: а) расположив элементы на те
Дан массив целых чисел. Переписать его нечетные элементы в другой массив такого же размера 1. расположив элементы на тех же местах, что...

Массив: Выбрать в массиве все отрицательные элементы, сформировать новый массив и выдать его элементы.
1. Написать программу, в которой вначале по запросам вводятся: а) размерность (с проверкой правильности) и б) элементы одномерного...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru