Всем привет и пожелания хорошего настроения В свое время был вопрос 315 от от читателя Константин о сортировке двумерного массива методом вставки. Что-то я не увидел ответов на него, и самому ответить было некогда - заушники завалили. Вот немного времени появилось. Написал вариант. (На основе вопроса сделал пример к лекции) Адреса Константина не знаю. Помещаю здесь, может пригодится кому. Два варианта и оба работают. Один для простачков - классическими циклами, второй - через адреса элементов в памяти (проблема перехода к предыдущему или следующему элементу) Примечание для тех, кто захочет использовать для вещественных типов и строк - нужно будет пользоваться Move, а не MemW и т.д. Возможно, что сразу нужно было так делать?
Доброго времени суток. Можно ли в Паскале создать динамический массив чисел с переменной верхней границей (как в С++), пробовал через массив указателей, указывающих на эти самые числа, но он (парадокс) тоже получается с константной верх. гранью. Что посоветуете? Если можно с примером.
Добрый день, Charodey! По моему в паскале это не предусмотрено а в делфях есть динам. массивы Ответ отправлен: 20.10.2003, 18:29 Отправитель: Cybernetic Creature Отвечает Ayl
Приветствую Вас, Charodey! Не получится. Нет такого типа данных в Паскале. Следовательно, придется извращаться. Например, как в Приложении.
Приложение: Ответ отправлен: 22.10.2003, 13:38 Отправитель: Ayl Отвечает samum2000
Приветствую Вас, Charodey! Ответ на свой вопрос смотри в ответах на 318 вопрос. В кратце повторю, что необходимо использовать динамическую память, но не указывать Паскалю явно, что у тебя массив из n элементов m-ного типа. Пример прилагается. const size_of_elements=2; {размер в байтах одного эл-та массива} var n,i,x: integer; p : pointer; {ссылается на начало массива в памяти} pi : ^integer; {Указатель на элемент того же типа, что и элементы массива} begin readln(n); {читаем количество элементов в массиве} getmem(p,size_of_elements*n);{резервируем память на все n элементов} new(pi);{выделяем память под pi} for i:=1 to n do begin readln(x); {читаем новый элемент} pi:=ptr(seg(p^),ofs(p^)+(i-1)*size_of_elements);{указатель pi должен ссылаться на тот же сегмент, что и p, а смещение высчитываем
исходя из того, какой по счету элемент мы будем записывать} pi^:=x;{записываем элемент в массив} end; for i:=1 to n do begin pi:=ptr(seg(p^),ofs(p^)+(i-1)*size_of_elements); writeln(pi^); end; dispose(pi); {освобождаем pi...} freemem(p,size_of_elements*n);{...и p} end. Таким образом, у тебя массив с плавающей верхней границей и, при необходимости, ты можешь добавить ему ещё элементов (Getmem). Ответ отправлен: 20.10.2003, 11:52 Отправитель: samum2000 Отвечает sir henry
Здравствуйте, Charodey! Приблизительным аналогом динамического массива будет объект TCollection (Модуль Objects). В нем можно хранить даже переменные разных типов. Начальное количество элементов не задается. От него есть несколько производных объектов. Пример работы с TCollection поставляется вместе с BP7. Ответ отправлен: 20.10.2003, 07:04 Отправитель: sir henry Отвечает Tancho
Доброе время суток, Charodey! Подобный вопрос уже бывал на рассылку!Эсли не ошибаюсь 318! Что можно сказать в добавку? Динамические структурый обрабатываються через их адресов - изпользуется указателей и встроенны тип Pointer для нетипизированный тип указатели. Читай учебники и практикумов по Turbo Pascal'е их много в Интернете.Есть и много примеров. Рекомендую "Turbo Pascal.Учебник" С.А.Немнюгина и "Turbo Pascal.Практикум" того же автора изд."Питер" 2002г. Ответ отправлен: 22.10.2003, 18:12 Отправитель: Tancho Отвечает vitya
Приветствую Вас, Charodey! p : ^integer; ... p := getmem(iSize * 2); {выделяет место для iSize элементов} ^p := 5; далее перемещаешься по массиву операциями +/-. В конце выделенную память надо высвободить.
Ответ отправлен: 20.10.2003, 08:19 Отправитель: vitya Отвечает Boriss
Здравствуйте, Charodey! Для массива строк есть объект TStringCollection в модуле Object. Очень удобен. Для целых чисел лучше использовать его идею (или объекты в TCollection): создается место для хранения в виде связанного списка по, скажем, 20 элементов. Обращение к массиву производится только через функцию или процедуру. Они, если обращаещься к 21-элементу добавляют еще одну группу, и т.д. Это длительно, неэффективно. Обязательно эту структуру надо инициализировать, удалять из памяти по использовании. Всегда есть риск прямого обращения пользователя к несуществующему элементу массива. Для решения всех таких проблем и придуманы ОБЪЕКТЫ. Ниже пример дубовой реализации без них. Если нужно с объектами, то пиши bsurin@mail.ru Удачи
Приложение: Ответ отправлен: 22.10.2003, 09:30 Отправитель: Boriss
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.