• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Есть ли такая функция?

Gabarityanin

Новые
Регистрация
10 Авг 2012
Сообщения
27
Реакции
1
Баллы
0
Есть ли такая функция?

Доброго времени суток всем. Прошу не кидать тухлыми помидорами, но последняя программка на Паскале родилась у меня лет 15 назад, все подзабыл. Сейчас пробую написать программу, озадачился вопросом, как задать массив вида NxN, вводя данные с клавиатуры. Хочется сделать это в общем виде, т.е. не

For i:=1 to 10 do

а примерно
Write('Введите размерность массива N ->'); ReadLn(N);
....

Понятно, что ручками больше 10x10 массив трудно вводить (да и 10x10 затруднительно), но я, как математик, хочу все сделать в общем виде. Программку пишу на PascalABC, нашел функцию для одномерного массива SetLength(X,N). Для двумерного она, есессно, не работает. Есть аналог для двумерного массива, или как-то по другому придется?
Если будет совсем сложно, за помощью, кэшна, обращусь, но ведь хочется сначала самому...
 
Хочется сделать это в общем виде, т.е. не For i:=1 to 10 do а примерно Write('Введите размерность массива N ->'); ReadLn(N); ....
Ну, если Вас устроят статические массивы, то нет ничего проще. В начале задаете в виде константы максимально возможное значение размерности массива, например
Код:
Const
 Nmax=25;
Далее в разделе описания переменных:
Код:
Var
 N:Integer;
 A:Array[1..Nmax,1..Nmax];
 ...
Ну а потом собственно в теле программы
Код:
Begin
 write('N= ');
 readln(N);
 for i:=1 to N do
  for j:=1 to N do
   begin
     write('A[',i:2,',',j:2,']= ');
     readln(A[i,j]);
   end;
 ...
Но если Вы хотите использовать динамическую адресацию, то тут всё много сложнее и запутаннее: придется разворачивать двумерный массив в одномерный путем пересчета индексов. Иначе никак.
Подробнее этот вопрос рассмотрен мною здесь:
http://www.tehnari.ru/f43/t42627/
 
Спасибо большое, Владимир. Как создавать статистический массив я помню еще со времен старика Бейсика:) Интересовал именно динамический массив. Наверное, слишком замудрено. Придется обойтись статическим. Еще раз большое спасибо.
 
дельфи поддерживает динамические массивы.
нужно объявить просто переменную без длины.
Код:
var arr: array of integer;

потом использовать функцию
Код:
SetLength(arr,n);
можно ипользовать и двумерные массивы.
обхявляется как
Код:
 var arr: array of array of integer;
SetLength ну и в передавать уже три параметра.

как-то так
 
в делфи можно пользоваться статическими массивами.
 
Вообще-то топикстартера изначально интересовал механизм использования динамических массивов под PascalABC, спрашивается, при чем тут Delphi? Разве что упор сделан на ObjectPascal.

Однако согласен, что можно объявить массив именно так, как предложил Андрей, без явного объявления размерности.
 
Вообще-то топикстартера изначально интересовал механизм использования динамических массивов под PascalABC
ое-ей. точно. что-то я протупил. у меня как динамический массив так дельфи))) (из паскалевских)
 
Однако согласен, что можно объявить массив именно так, как предложил Андрей, без явного объявления размерности.
Дорогие коллеги, еще раз обращаю внимание на одну тонкость. Это очень важно. Да, пожалуйста - можете задать двумерный массив без объявления размерности, не в этом суть. А вот попробуйте запустить программу отсюда: http://www.tehnari.ru/f43/t42627/#post423390 . Там двумерный массив изначально задан одноэлементным - ради Бога, при динамической адресации это не важно. Важно другое - оператор присваивания (и обращения к элементу) вида
A^[i,j]:=
устроен так, что не учитывает порядка расположения индексов, т.е. A^[2,3] и A^[3,2] указывают на ОДНУ И ТУ ЖЕ область памяти. Поэтому при последовательном заполнении двумерного массива введенное значение A^[2,3] будет потеряно, как только дойдем до A^[3,2]. Причем никаких сообщений об ошибках, предупреждений и т.п. выдано не будет! Вот на что я хочу обратить особое внимание. А как его там задать-описать - это не проблема.
 
Важно другое - оператор присваивания (и обращения к элементу) вида
A^[i,j]:=
устроен так, что не учитывает порядка расположения индексов, т.е. A^[2,3] и A^[3,2] указывают на ОДНУ И ТУ ЖЕ область памяти.

В дельфи эту проблему как-то обошли...
 
Назад
Сверху