Динамические массивы(2d)

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

06 дек 2007, 20:45

Задание: транспонировать матрицу(строку сделать столбцом, а столбец-строкой).
Был вариант решения: ввести матрицу a[i,j], затем каждый элемент присвоить итоговой матрице b[j,i]:=a[i,j]. Предварительно выделить память под каждую из них.
Решение правильное, но нерациональное в плане памяти.
Теперь пробую работать с динамическим массивом(раньше никогда и не слышал о них):

type TMas=array [0..0,0..0] of integer;
var i,j,n:integer;
p:^TMas:
begin
write('Vvedite n=');read(n);
getmem(p,n*n*sizeof(integer));{нужно, чтобы память зависела от размера квадратной матрицы}
for i:=1 to n do
for j:=1 to n do
read(p^[i,j]);
writeln('Rezultat>');
for i:=1 to n do
begin
for j:=1 to n do
write(p^[j,i],' ');
writeln;writeln;
end;
freemem(p,n*n*sizeof(integer));
end.
На матрицу:
1 2 3
1 2 3
1 2 3
любыми способами переписывания кода программы выдает
1 1 1
1 1 2
1 2 3
Помогите выявить и устранить ошибки, пожалуйста?
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

07 дек 2007, 10:59

А не проще написать процедуру, которая будет менять содержимое двух переменных местами (например, swap), а потом сделать что-то вроде

Код: Выделить всё

for i:=1 to n-1 do 
  for j:=i+1 to n do
     swap (a[i,j], a[j,i]);
?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

07 дек 2007, 14:14

Сделал с процедурой, проswapил, получил тот же рез почему-то..
Юный Падаван
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

07 дек 2007, 16:03

По-моему, дело в этом:

Код: Выделить всё

type TMas=array [0..0,0..0] of integer;
var p:^TMas;
Дальше задаем вопрос, во что таком объявлении типа преобразуется обращение:

Код: Выделить всё

p^[i,j];
Ведь чтобы спозиционироваться на элемент массива, скажем, p^[5,10], компилятор, по сути вычисляет смещение нужного элемента как (учитывая, что индексы считаются от 0):

5 * N + 10
где N - размерность первого индекса. А она, согласно объявлению типа (0..0), равна единице !

То есть, если у тебя юзер ввел размерность (n=) 3, и ты полагаешь, что P^[3,1] покажет на 7-й элемент (1-й в 3-й строке), то фиг вам! Компилятор вычислит это как 4-й элемент массива.

Ну и плюс еще "школьная" ошибка. Индексы в обявлении типа указаны от 0, а в циклах счет столбцов/строк идет от 1.
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

07 дек 2007, 16:16

Да, скорее всего, так оно и есть.. (( Подскажите, как быть тогда? Как задать другим способом динамический массив, please?
Юный Падаван
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

07 дек 2007, 17:04

type TMas=array of integer;
Все массив динамический.. :)
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

07 дек 2007, 18:36

И фсе? 0_о А поймет, что двумерный то?
Юный Падаван
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

07 дек 2007, 22:58

Сорри не доглядел, тогда так
type TMas = array of array of integer;
Аватара пользователя
annihilator
Сообщения: 30
Зарегистрирован: 27 ноя 2007, 00:22

08 дек 2007, 00:31

Duncon писал(а):Сорри не доглядел, тогда так
type TMas = array of array of integer;
не конает, пишет ошибку синтаксиса. Может компилятор не понимает, но факт остаётся фактом (поинтеры то пашут...)
Вот представьте себе: чистое поле - ни кустика, ни деревца, и вдруг из-за угла выезжает танк!
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

08 дек 2007, 06:24

тут тема такая, что ОБЯЗАТЕЛЬНО нужно определиться - где вы пытаетесь это откомпилировать!! Динамические массивы появились только в Delphi
в TurboPascal этот код и не будет компилироваться!!
Ответить