Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 188
от 22.10.2003, 19:00

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 327
Отправлено ответов: 1150
Активность: 351.6 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Cybernetic Creature
Статус: Профессиональный
Общий рейтинг: 130.78
URL: В разработке
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 117.25
[Подробней >>]
samum2000
Статус: Начальный
Общий рейтинг: 128
[Подробней >>]
 
sir henry
Статус: Опытный
Общий рейтинг: 156.83
[Подробней >>]
Tancho
Статус: Опытный
Общий рейтинг: 151.61
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.03
[Подробней >>]
 
Boriss
Статус: Доверительный
Общий рейтинг: 134.34
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 324. Всем привет и пожелания хорошего настроения В свое время был вопрос 315 от от читателя Константин о ... (ответов: 1)
Вопрос № 325. Доброго времени суток. Можно ли в Паскале создать динамический массив чисел с переменной верхней гра... (ответов: 7)

Вопросов: 2, ответов: 8


 Вопрос № 324

Всем привет и пожелания хорошего настроения
В свое время был вопрос 315 от от читателя Константин о сортировке двумерного массива методом вставки. Что-то я не увидел ответов на него, и самому ответить было некогда - заушники завалили.
Вот немного времени появилось. Написал вариант. (На основе вопроса сделал пример к лекции)
Адреса Константина не знаю. Помещаю здесь, может пригодится кому.
Два варианта и оба работают. Один для простачков - классическими циклами, второй - через адреса элементов в памяти (проблема перехода к предыдущему или следующему элементу)
Примечание для тех, кто захочет использовать для вещественных типов и строк - нужно будет пользоваться Move, а не MemW и т.д.
Возможно, что сразу нужно было так делать?


Приложение:


Вопрос отправлен: 17.10.2003, 13:31
Отправитель: BS

[Следующий вопрос >>] [Список вопросов]

Отвечает Cybernetic Creature

Здравствуйте, BS!
DANKE SCHЦN

Ответ отправлен: 18.10.2003, 19:45
Отправитель: Cybernetic Creature


 Вопрос № 325

Доброго времени суток.
Можно ли в Паскале создать динамический массив чисел с переменной верхней границей (как в С++), пробовал через массив указателей, указывающих на эти самые числа, но он
(парадокс) тоже получается с константной верх. гранью.
Что посоветуете? Если можно с примером.


Приложение:


Вопрос отправлен: 19.10.2003, 18:56
Отправитель: Charodey

[Следующий вопрос >>] [Список вопросов]

Отвечает Cybernetic Creature

Добрый день, 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.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (28)
C / C++ (29)
Perl (5)
Builder / Delphi (22)
Pascal (22)
Basic / VBA (6)
Java / JavaScript (6)
PHP (10)
Криптография (7)
WinAPI (15)
Пользователю
Windows 95/98/Me (49)
Windows NT/2000/XP (62)
"Железо" (35)
Поиск информации (26)
Администратору
Windows NT/2000/XP (37)
Linux / Unix (12)
Юристу
Гражданское право (9)
Семейное право (6)
Трудовое право (6)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное