Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2014, 00:35   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос TP7. Странно заполняет динам. массив

Доброго времени суток!

Есть некий динам. массив 1..M x 1..N
M = 2
N = 2

заполняю:
1 2
1 2


Выводит:
1 1
1 2


Код:
Код:
type
  TDynArray = array[1..1,1..1] of Integer;
  TOneDynArray = array[1..1] of Integer;
var
  op,N,M:Integer;
  mass:^TDynArray;
  rmass:^TOneDynArray;
  i,j,d,iNum:Integer;
  sM,sN:string;
begin
 WriteLn('N = ');
 ReadLn(N);
 WriteLn('M = ');
 ReadLn(M);
 GetMem(mass,SizeOf(Integer)*N*M);
 GetMem(rmass,SizeOf(Integer)*M);
 
 for i:=1 to M do
 begin
  rmass^[i]:=0; //Обнуляю массив результата
 end;
 
 //Заполняю массив польз. вводом
 for i:=1 to M do
 begin
   for j:=1 to N do
   begin
   WriteLn('Vvedite element '+IntToStr(i)+' stroki,'+IntToStr(j)+' stolbca: ');
   iNum:=0;
   ReadLn(iNum);
   mass^[i,j]:=iNum;
   end;
 end;

 //Вывод заполненного массива:
 for i:=1 to M do
 begin
   for j:=1 to N do
   begin
     WriteLn('mass['+IntToStr(i)+','+IntToStr(j)+'] = '+IntToStr(mass^[i,j]));
   end;
 end;
M = 2
N = 2

Я заполняю так:
mass[1,1] = 1
mass[1,2] = 2
mass[2,1] = 1
mass[2,2] = 2

На печать выводит так:
mass[1,1] = 1
mass[1,2] = 1
mass[2,1] = 1
mass[2,2] = 2

Почему так, чт я делаю не так?
Человек_Борща вне форума Ответить с цитированием
Старый 29.01.2014, 06:43   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Это точно TP?
IntToStr в нем не было..

И массив у Вас 1 на 1.. а Вы его хотите N на M сделать.. вот он и косячит..

И не плохо было бы память освободить..
Цитата:
Код:
rmass^[i]:=0; //Обнуляю массив результата
Если у Вас нет процедур\функций, то можно и так оставить.. переменные будут локальные и сразу получат 0..

Последний раз редактировалось Poma][a; 29.01.2014 в 07:39.
Poma][a вне форума Ответить с цитированием
Старый 29.01.2014, 09:06   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И массив у Вас 1 на 1.. а Вы его хотите N на M сделать.. вот он и косячит..
Так он у него динамический:mass:^TDynArray;
А там действительно можно так написать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.01.2014, 09:47   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

См. в #7 как работать с двумерным динамическим в паскале
http://www.programmersforum.ru/showthread.php?t=47171
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2014, 10:18   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Poma][a, я Str под IntToStr замаскировал.
Да, в Borland Pascal нет динам. массивов, компилятор не умеет этого, зато я умею.
Создал массив 1.1, дал памяти, вот и новый массив.

Самое странное, что мли сделать так:
Код:
 //Заполняю массив польз. вводом
 for i:=1 to M do
 begin
   for j:=1 to N do
   begin
   WriteLn('Vvedite element '+IntToStr(i)+' stroki,'+IntToStr(j)+' stolbca: ');
   iNum:=0;
   ReadLn(iNum);
   mass^[i,j]:=iNum;
   WriteLn('mass['+IntToStr(i)+','+IntToStr(j)+'] = '+IntToStr(mass^[i,j]));
   end;
 end;

 //Вывод заполненного массива:
 for i:=1 to M do
 begin
   for j:=1 to N do
   begin
     WriteLn('mass['+IntToStr(i)+','+IntToStr(j)+'] = '+IntToStr(mass^[i,j]));
   end;
 end;
то, по ходу ввода, в массиве лежат правильные числа. При повторном выводе массива, уже не правильные.

Смотрю пост 7 по ссылке. Ячего-то не понимаю, но там вроде одномерный массив, а мне надо M на N, т.н. M,N устанавливает пользователь.
Человек_Борща вне форума Ответить с цитированием
Старый 29.01.2014, 10:22   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Там двумерный и для каждой строки отдельно выделяется память

ADD можно упростить примерно так

Код:
type TDynStroka = array[1..1] of Integer;
     TDynArray = array[1..1] of ^TDynStroka;
var N,M: Integer;
    mass: ^TDynArray;
    i,j: Integer;
begin
  N:=2;
  M:=2;
  GetMem(mass,SizeOf(TDynStroka)*M);
  for i:=1 to M do GetMem(mass^[i],SizeOf(Integer)*N);

  for i:=1 to M do
    for j:=1 to N do mass^[i]^[j]:=i*10+j;

  for i:=1 to M do
    for j:=1 to N do
      WriteLn('mass['+IntToStr(i)+','+IntToStr(j)+'] = '+IntToStr(mass^[i]^[j]));

  for i:=1 to M do FreeMem(mass^[i]);
  FreeMem(mass);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.01.2014 в 10:59.
Аватар вне форума Ответить с цитированием
Старый 29.01.2014, 14:32   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

В чем актуальность ТР7?

Цитата:
я Str под IntToStr замаскировал.
Для Write преобразование в строку не требуется.

Цитата:
Странно заполняет динам. массив
Ну так все верно, у вас же: TDynArray = array[1..1,1..1] of Integer;
То есть матрица 1*1. А для того, чтобы найти ячейку памяти, где будет элемент [i,j], надо ((i-1)*n+j-1)*2, где n - кол-во столбцов, 2 - размер в байтах для типа Integer. Так вот компилятору это n не известно, точнее, оно равно 1 исходя из размерностей матрицы.

Цитата:
по ходу ввода, в массиве лежат правильные числа. При повторном выводе массива, уже не правильные.
Адреса ячеек рассчитываются неправильно. Но так как вывод происходит из той же неправильной ячейки, то кажется, что все правильно.

Последний раз редактировалось Arigato; 29.01.2014 в 14:37.
Arigato вне форума Ответить с цитированием
Старый 29.01.2014, 15:28   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Кстати можно обойтись и одномерным массивом как в #1 обявлено, но обращаться чуть по хитрей
Код:
for i:=1 to M do
  for j:=1 to N do
    mass^[(i-1)*M+j]
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2014, 15:42   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
В чем актуальность ТР7?
В преподе предмета наверное.

Цитата:
Кстати можно обойтись и одномерным массивом как в #1 обявлено, но обращаться чуть по хитрей
Для студента 1го курса это сильно мощно)
Вариант Аватара работает как должно.
Человек_Борща вне форума Ответить с цитированием
Старый 29.01.2014, 15:49   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Вот тоже самое на фряхе(тыц), но работает правильно (т.к. массив от 1 до 2..)
Так что.. не уверен, что так объявлять можно..
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динам.массив sven4ik Общие вопросы Delphi 1 02.06.2013 15:59
Программа заполняет массив из 10 записей с 3-мя полями (фамилия, имя, полное число лет) из файла. PasDeNom Паскаль, Turbo Pascal, PascalABC.NET 3 10.04.2012 14:27
Странно выводится массив... Romantik (Dima) Общие вопросы C/C++ 3 16.12.2010 18:52
динам.память.массив. Ам тя Помощь студентам 0 22.03.2010 19:23
Конструктор, двумерный динам массив ammaximus Общие вопросы C/C++ 7 08.02.2009 19:28