Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 29.01.2014, 00:35   #1
Человек_Борща
Модератор
Заслуженный модератор
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Адрес: Республика Беларусь, г. Минск
Сообщений: 11,462
Репутация: 2701
Вопрос 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,886
Репутация: 1941
По умолчанию

Это точно 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,957
Репутация: 6832
По умолчанию

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

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

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
Адрес: Северодонецк.ua
Сообщений: 17,765
Репутация: 6211
По умолчанию

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

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
Адрес: Россия РФ Регистрация: 27.07.2008
Сообщений: 14,054
Репутация: 3550
По умолчанию

В чем актуальность ТР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 исходя из размерностей матрицы.

Цитата:
по ходу ввода, в массиве лежат правильные числа. При повторном выводе массива, уже не правильные.
Адреса ячеек рассчитываются неправильно. Но так как вывод происходит из той же неправильной ячейки, то кажется, что все правильно.
__________________
E-Mail: arigato.freelance@gmail.com

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

Кстати можно обойтись и одномерным массивом как в #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,462
Репутация: 2701
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


06:07.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru