Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с указателями на массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
osa
Здравствуйте , мне необходимо
1) создать массив
2) установить его указатели на массив и на след элемент (создать список указателей на массив и на следуюющий элемент еще в сегменте данных)
3) и поменять эти указатели

П.С.
эсли 1) и 2) я представляю как сделать то 2) да еще и в сегменте данных я не представляю .
volvo
osa, поточнее можно? Что значит
Цитата
указатели на массив и на след элемент
? На следующий за чем элемент?

Если уже
Цитата
1) и 2) я представляю как сделать
, то почему бы не привести пример, что именно нужно, а то не вполне понятен смысл задания...
osa
Цитата(volvo @ 10.04.05 12:00)
osa, поточнее можно? Что значит ? На следующий за чем элемент?

Если уже , то почему бы не привести пример, что именно нужно, а то не вполне понятен смысл задания...

Опечатался 1 и 3 представляю .
А затем что это как бы будет список ! который я смогу потом свободно перебирать ! я понял что тут не понятно ! не на следующий элемент массива а на следующий елемент списка
volvo
Я так и не понял, какой выигрыш дает использование списка вместо массива, но вообще-то обращаться через указатель к элементу массива (да еще и расположенного в сегменте данных, а не в хипе) - это просто извращение.
Код
Type
 pArrType = ^arrType;
 arrType = array[1 .. 2000] of integer;
Var
 x: arrType;
 p: pArrType;
begin
 p := @x;
 p^[1] := ...; { и работаем через указатель }
end;

Если нужно работать со списками - то сначала сюда: FAQ: Динамические структуры данных (списки)

А вообще-то приведи пример, КАК ты хочешь обращаться к массиву (ну, или списку), и я помогу тебе это реализовать.
osa
смотри нам нужно создать список не динамически, а в сегменте данных ! а в списке должны храняться указатели на массив ! ну и на следующий элемент списка
volvo
Ты толком объяснить можешь? У тебя есть список... Само собой, что каждый элемент списка содержит адрес следующего элемента списка, но ведь кроме этого он тоже что-то содержит !!! Так вот я и хочу узнать, ЧТО ИМЕННО должен содержать каждый элемент списка??? Допустим, первый - содержит адрес массива, а второй? А третий? Четвертый? ...

Вот так задается список:
Код

type tlist = record
 data: ... { <--- вот тут что хранится будет ???}
 next: ^tlist; { тут-ясно, что след. элемент списка }
end;

Неужели тебе надо просто рядом с массивом оформить еще и список, который будет содержать адреса соответствующих элементов массива?

Это же как минимум 4-х кратный проигрыш в размере !!!
osa
!Смотри 0 элем списка указывает указывает на 1 ; 1 на 2ой и тд вплоть до последнего ! ясно что в списке будет даные даные указывайт на елемент массива , т е в 1 елементе списка храниться адресс 1 ячейки массива ... и т.д. !
впроть до последнего там понятно nil.

! Как задаеться переменные списка я знаю мне бы надо чтобы в данных он уже был полностью создан ! тоесть у меня массив из 8 елементов
и был бы список из 10 эелементов
BegL -> 1 -> 2 -> 3 -> 4 -> ... 8-> EndL
@A[1] @A[2] @A[3] @A[4] @A[8]

Цитата(volvo @ 10.04.05 12:46)
Неужели тебе надо просто рядом с массивом оформить еще и список, который будет содержать адреса соответствующих элементов массива?

Это же как минимум 4-х кратный проигрыш в размере !!!

А на память мне все равно! вернее этим способом я освобождаю как минимум
в 2 раза память ! чем я бы использовал другой метод !
volvo
Цитата(osa @ 10.04.05 13:03)
вернее этим способом я освобождаю как минимумв 2 раза память ! чем я бы использовал другой метод !

А вот теперь я тебе покажу, КАК это делается, а ты мне приведешь пример того, как при этом ИЗВРАТЕ ты в 2 раза минимум освобождаешь память... Не забудь, что в DS хранится И массив И список, что уже забирает лишнюю память. Кстати, это почему у тебя при массиве длинной 8 элементов длина списка = 10? Это тоже часть твоей суперстратегии?
Код
const
 n = 10;
 arr: array[1 .. n] of integer =
   (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

type
 pint = ^integer;
 plist_rec = ^list_rec;
 list_rec = record
   data: pint;
   next: plist_rec;
 end;

var
 list: array[1 .. n] of list_rec;
 p, head: plist_rec;
 i: integer;
begin
 head := @list[1];

 for i := 1 to n do begin
   list[i].data := @arr[i];
   if i <> n then
     list[i].next := @list[succ(i)]
   else list[i].next := nil;
 end;

 p := head;
 while p <> nil do begin
   writeln(p^.data^);
   p := p^.next
 end;

end.

Теперь твоя очередь... Каким образом ЭТО экономит память по сравнению с простым использованием массива?
osa
Я может не так обьясняю ) Дело в том что например как создать динамический массив я знаю !
Но а как его создать статически ???
Вот этим способом ты взял и по ходу выполнения програмы записал в ячейки данных списка адресса массивов! А мне надо это сделать еще до выполнения программы ! т е до начала БЕГИНА в сегменте данных !
osa
А начет памяти ! дело в том что мне надо написать свои процедуры Рид Врайт Для паскаля ! и там есть 4 способа их реализации ! так вот я выбрал как бы самый эфективный... просто можно создать массив и динамически ! но это не правельно ..
volvo
Что-то я совсем запутался. Что значит "Статически" в твоем понятии? До Begin? Это не называется "Статически", это называется "На этапе компиляции", и это просто невозможно...

А вот "Статически" я как раз и сделал - хип (динамическая память) не использовался.
osa
Понятно ! ты знаешь если честно я тоже думал что это нельзя сделать ... у нас препод старый уже (это лаба такая) и постоянно хочет такого что невозможно.
Это уже не первый раз.
Просто я решил полазить по форумам может кто - то более умнее и скажет что - то новое

п.с.
Спасибо за потраченое время
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.