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

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


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


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

Выпуск № 242
от 11.02.2004, 14:30

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


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

Ayl
Статус: Профессиональный
Общий рейтинг: 116.6
[Подробней >>]
Boriss
Статус: Профессиональный
Общий рейтинг: 152.43
URL: Программирование на Паскале
[Подробней >>]
Tancho
Статус: Профессиональный
Общий рейтинг: 150.6
Телефон: сл. 0359 0391 65 631; 0359 0391 53 105
[Подробней >>]
 
vitya
Статус: Профессиональный
Общий рейтинг: 108.6
[Подробней >>]
Pawel
Статус: Опытный
Общий рейтинг: 163.8
[Подробней >>]
sir henry
Статус: Профессиональный
Общий рейтинг: 159.83
[Подробней >>]
 
Andy
Статус: Опытный
Общий рейтинг: 101.56
[Подробней >>]


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

Вопрос № 414. Можно ли в PASCALе задать массив a:array[1..i,1..j]of real; где i,j-не константы, а переменные.Хотя ... (ответов: 7)

Вопросов: 1, ответов: 7


 Вопрос № 414

Можно ли в PASCALе задать массив a:array[1..i,1..j]of real; где i,j-не константы, а переменные.Хотя бы в начале программы, когда известно, что массив есть, но еще не ясно какого размера.Например, вычисляем i и j, и создаем такой массив, а дальше i и j - const.



Вопрос отправлен: 08.02.2004, 14:26
Отправитель: thirteenth (gluk-@mail.ru)

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

Отвечает Ayl

Добрый день, thirteenth!
Нет, конечно, и это самая большая проблема Паскаля.
Выход - завести тип "по-максимуму", точнее 2 типа:

Type
TArray1 = array [1..maxJ] of Real;
TArray2 = array [1..maxI] of Pointer;

и указатели на них:
PArray1 = ^TArray1;
PArray2 = ^TArray2;

Вводишь 2 нетипизированных указателя:
p : Pointer;

Далее в программе вычисляешь i и j и пишешь следующий код:
GetMem (p, i * SizeOf (Pointer));
for k := 1 to i do
GetMem (PArray2 (p)^ [k], j * SizeOf (Real));

Доступ к элементу (k, m) осуществляется так:
PArray1 (PArray2 (p)^ [k])^ [m]

В конце программы не забудь освободить память:
for k := 1 to i do
FreeMem (PArray2 (p)^ [k], j * SizeOf (Real));
FreeMem (p, i * SizeOf (Pointer));

Контроль за выходы индекса за пределы массива придется осуществлять тебе самому.

Ответ отправлен: 09.02.2004, 10:58
Отправитель: Ayl


Отвечает Boriss

Доброе время суток, thirteenth!
Нет :(( "Обычный" Паскаль таккого не разрешает, так как до выполнения первого оператора уже все должно быть известно.
Выход! Разместить массив в динамической памяти (GetMem) и написать функции для работы с ним, то есть, передаете индексы массива, а подпрограмма отыскивает в памяти элемент.
Для надежной работы лучше организовать все это в виде объекта.
Можно посмотреть пример, который писал я http://www.borlpasc.narod.ru/Boris/1.htm

Ответ отправлен: 09.02.2004, 10:41
Отправитель: Boriss


Отвечает Tancho

Доброе время суток, thirteenth!
Саммый простой случай - когда в a:array[1..i,1..j] of real,
i,j переменные, но известный их горные границый т.е. заранее известно что индексый не превосходять какие там чисель. Тогда все просто.Смотри в Приложении.

Приложение:

Ответ отправлен: 10.02.2004, 17:45
Отправитель: Tancho


Отвечает vitya

Здравствуйте, thirteenth!
1. плохой вариант. Если массив всегда будет меньше определенного числа - тогда объявляешь константу N и задаешь массив array[1..N,1..N] of real. Потом просто используешь переменную для хранения настоящего размера.
2. вариант получше - создаешь указатель на real. Выделяешь n*n*sizeof(real) байт памяти и пишешь несложную функцию для доступа к [i, j] - ому элементу. Потом не забудь высвободить память.
3. ИМХО, лучший вариант - на основе ООП создаешь класс(объект) который инкапсулирует понятие матрицы - и работаешь с ним

Ответ отправлен: 08.02.2004, 14:34
Отправитель: vitya


Отвечает Pawel

Доброе время суток, thirteenth!
Конкретно так a:array[1..i,1..j]of real указать нельзя.
Толко с константами.
Можно выделить память вручную.
Можно описать свой тип, но это сложно.

Ответ отправлен: 08.02.2004, 18:46
Отправитель: Pawel


Отвечает sir henry

Приветствую Вас, thirteenth!
Нет, так нельзя. Любые переменные, описаные в глобальном var'e, должны иметь заранее известный размер.
Для Вашего случая подходят динамические списки или коллекции (TCOllection). Я предлагаю использовать именно коллекции, т.к. с ними проще работать, поскольку все методы (практически) для работы с ними уже определены, в то время как для динамических списков Вам понадобится самому описывать и разрабатывать их.

Ответ отправлен: 09.02.2004, 05:36
Отправитель: sir henry


Отвечает Andy

Здравствуйте, thirteenth!
Ну прям так явно обьявить не получится, а вот создать динамический массив легко. Читай хелп по GetMem.

Ответ отправлен: 09.02.2004, 05:41
Отправитель: Andy



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

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

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (25)
C / C++ (14)
Perl (2)
Builder / Delphi (19)
Pascal (19)
Basic / VBA (8)
Java / JavaScript (4)
PHP (13)
Криптография (5)
WinAPI (10)
Радиоэлектроника (6)
Пользователю
Windows 95/98/Me (45)
Windows NT/2000/XP (59)
"Железо" (36)
Поиск информации (17)
Администратору
Windows NT/2000/XP (32)
Linux / Unix (12)
Юристу
Гражданское право (16)
Семейное право (11)
Трудовое право (13)
КоАП (11)

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




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


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

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

В избранное