Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2013, 06:42   #1
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию Pascal Вывод массива указателей на запись и очистка динамической памяти

Блин( Так стыдно это спрашивать, но не могу я понять, как правильно написать( Помогите, пожалуйста.

Код:
{$mode objfpc}
const N=3;
type TSortedArray=array of pointer;
type pchelovek=^chelovek; //тип запись
  chelovek = record  //запись
    n: string[15];
    f: string[20];
    o: string[20];
    v: integer;
  end;
Var Area:TSortedArray;
      h:integer;
      pch: pchelovek;
Begin
setlength(Area,N);
for h:=0 to N-1 do
  begin
   new(pch);
   writeln ('введите сведения о',h,'-м студенте');
   writeln ('введите имя');
   readln (pch^.n);
   writeln ('введите фамилию');
   readln (pch^.f);
   writeln ('введите отчество');
   readln(pch^.o);
   writeln ('введите возраст');
   readln(pch^.v);
   area[h]:=pch;
  end;
   writeln ('ввод закончен');
   writeln ;

// вывод записи

// очистка памяти в цикле с помощью dispose

End.
Решетова Алена вне форума Ответить с цитированием
Старый 07.03.2013, 08:06   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Делаете второй такой же цикл, в котором выводите, куда нужно, и освобождаете память.
s-andriano вне форума Ответить с цитированием
Старый 07.03.2013, 09:18   #3
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

Напишите, пожалуйста, код(((
Решетова Алена вне форума Ответить с цитированием
Старый 07.03.2013, 09:18   #4
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

Видимо, я что-то делаю не так. Где-то ошибка.
Решетова Алена вне форума Ответить с цитированием
Старый 07.03.2013, 15:14   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Решетова Алена Посмотреть сообщение
Видимо, я что-то делаю не так. Где-то ошибка.
Посмотрел внимательнее, действительно.

Вместо этого:
Код:
type TSortedArray=array of pointer;
следует написать
Код:
type TSortedArray=array of pchelovek;
и, естественно, поместить это после определения pchelovek.
Код:
      pch: pchelovek;
можно вообще исключить. Тем более, что как раз здесь у Вас ошибка - Вы многократно выделяете память одному и тому же указателю.
И теперь вместо pch везде писать area[h].
соответственно, убрать:
Код:
   area[h]:=pch;
и в конце цикл по выводу, как и куда Вы собираетесь выводить, не знаю, поэтому код написать не могу.
Но После вывода в этом же цикле
Код:
dispose(area[h]);
А освобождению памяти:
Код:
SetLength(Area,0);
И еще совет: если Вы используете единственную переменную цикла - называйте ее "i" - есть такая традиция.

Последний раз редактировалось s-andriano; 07.03.2013 в 15:19.
s-andriano вне форума Ответить с цитированием
Старый 11.03.2013, 07:22   #6
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

Спасибо)) Про традицию знаю)) Переменная, увы, не единственная, поэтому задействовала i,j,h
Решетова Алена вне форума Ответить с цитированием
Старый 11.03.2013, 07:45   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Решетова Алена Посмотреть сообщение
Спасибо)) Про традицию знаю)) Переменная, увы, не единственная, поэтому задействовала i,j,h
В этом случае принято разбивать программу на процедуры, в каждой из них описывать свою локальную i - ее и использовать.
s-andriano вне форума Ответить с цитированием
Старый 11.03.2013, 11:03   #8
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

А потом я запутаюсь, если везде i будет. Как хочу так и делаю.
Решетова Алена вне форума Ответить с цитированием
Старый 11.03.2013, 11:54   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Вопрос: а зачем Вам массив указателей, если вы определяете его размерность константой? И это не придирка - скорее всего у вас этот вопрос будет при сдаче, поскольку основной причиной использования динамических структур является как-раз возможность изменения размерности массива по ходу выполнения программы.

Поэтому, я бы на Вашем месте, формировал бы нормальную очередь или стек, а вывод сделал бы в типизированный файл. И переменные i, j, k там вообще не понадобятся...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 19.03.2013, 18:51   #10
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

а это далеко не конечный вариант лабораторной. это промежуточная часть, в которой я пытаюсь разобраться с простым выводом записи на консоль. вот, например, ещё один вопрос по этой лабораторной, но он уже решен) http://www.programmersforum.ru/showthread.php?t=230565
Решетова Алена вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размещение массива строк в динамической памяти с++ Ruko! Помощь студентам 0 05.12.2012 19:36
массив указателей для для динамической памяти petro.chelsea1234 Общие вопросы C/C++ 0 04.12.2012 01:38
Очистка памяти массива (С++) Сольвейг Помощь студентам 3 11.12.2011 22:37
Использование указателей и динамической памяти Black_butterfly Помощь студентам 3 02.05.2011 18:07
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16