Страница 1 из 2

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

Добавлено: 06 дек 2007, 20:45
Monopo
Задание: транспонировать матрицу(строку сделать столбцом, а столбец-строкой).
Был вариант решения: ввести матрицу 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
Помогите выявить и устранить ошибки, пожалуйста?

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

Добавлено: 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]);
?

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

Добавлено: 07 дек 2007, 14:14
Monopo
Сделал с процедурой, проswapил, получил тот же рез почему-то..

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

Добавлено: 07 дек 2007, 16:03
BBB
По-моему, дело в этом:

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

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.

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

Добавлено: 07 дек 2007, 16:16
Monopo
Да, скорее всего, так оно и есть.. (( Подскажите, как быть тогда? Как задать другим способом динамический массив, please?

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

Добавлено: 07 дек 2007, 17:04
Duncon
type TMas=array of integer;
Все массив динамический.. :)

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

Добавлено: 07 дек 2007, 18:36
Monopo
И фсе? 0_о А поймет, что двумерный то?

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

Добавлено: 07 дек 2007, 22:58
Duncon
Сорри не доглядел, тогда так
type TMas = array of array of integer;

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

Добавлено: 08 дек 2007, 00:31
annihilator
Duncon писал(а):Сорри не доглядел, тогда так
type TMas = array of array of integer;
не конает, пишет ошибку синтаксиса. Может компилятор не понимает, но факт остаётся фактом (поинтеры то пашут...)

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

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