IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Работа с динамическими и открытыми массивами, Лабораторная работа
Rocket
сообщение 3.06.2007 16:53
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Задание:
1. Создать функции для:
• выделения памяти под двумерный целочисленный массив (размер массива запросить через ввод с клавиатуры);
• изменения размера массива;
• изменения количества элементов заданной строки;
• заполнения массива элементами;
• просмотра элементов массива на экране (приближенно в виде матрицы);
• уничтожения выделенной для массива памяти.
В функциях просмотра элементов и уничтожения массива организовать необходимые проверки на правильность указателей (не Nil). Отладить написанные функции.
2. Организовать тестирование при помощи меню, для чего создать два массива:
• массив строк, содержащий названия пунктов меню;
• массив указателей на функции, для выполнения соответствующих видов работ.
Для упрощения работы целочисленный массив и переменную, задающую размер массива описать на глобальном уровне.
3. Переделать описанные функции для работы с помощю открытых массивов.

Уважаемые Форумчане! Помогите сделать эту лабу,пожалуйста! smile.gif Подскажите что тут, да как делается....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 3.06.2007 17:04
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


По-моему, тебе сюда:
Динамические массивы и матрицы

хотя в Делфи возможен другой вариант реализации. Но не представляю, как в нем выполнить это:
Цитата
функцию для изменения количества элементов заданной строки;


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 3.06.2007 17:16
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(Rocket @ 3.06.2007 17:53) *

Организовать тестирование при помощи меню, для чего создать два массива:
• массив строк, содержащий названия пунктов меню;
• массив указателей на функции, для выполнения соответствующих видов работ.
Для упрощения работы целочисленный массив и переменную, задающую размер массива описать на глобальном уровне.


А вот это как замутить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.06.2007 17:19
Сообщение #4


Гость






А вот это - см. здесь:
http://volvo71.narod.ru/menus.htm

(правда у меня там нет описания массива указателей на функции, но это добавляется в течении нескольких секунд)
 К началу страницы 
+ Ответить 
Rocket
сообщение 3.06.2007 17:31
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(Rocket @ 3.06.2007 17:53) *

Переделать описанные функции для работы с помощю открытых массивов.

Где можно про это почитать?


Добавлено через 14 мин.
Цитата(volvo @ 3.06.2007 18:19) *

А вот это - см. здесь:
http://volvo71.narod.ru/menus.htm

(правда у меня там нет описания массива указателей на функции, но это добавляется в течении нескольких секунд)

Где здесь именно то ,что мне нужно? Вы не могли написать примерный вариант этого пункта. Также включив описание массива указателей на функции. yes2.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.06.2007 18:13
Сообщение #6


Гость






Именно то, что тебе нужно можешь написать только ты сам... Не хочешь пользоваться тем что есть - пиши с нуля...
 К началу страницы 
+ Ответить 
Rocket
сообщение 3.06.2007 19:54
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 3.06.2007 19:13) *

Именно то, что тебе нужно можешь написать только ты сам... Не хочешь пользоваться тем что есть - пиши с нуля...

Да,я это понимаю.... Но всё-таки, вы не могли показать примерный вариант этого меню?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 4.06.2007 18:54
Сообщение #8


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Так как всё-таки это организовать:.
тестирование при помощи меню, для чего создать два массива:
• массив строк, содержащий названия пунктов меню;
• массив указателей на функции, для выполнения соответствующих видов работ.??? Подскажите,плиз!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 5.06.2007 19:26
Сообщение #9


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Ребята!Пожалуйста, помогите очень нужно!!! Я чёт вообще не вкурю wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 12.06.2007 18:39
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот создал процедуру для выделения памяти, просмотра элементов и уничтожения выделенной памяти:


Program LabN2part1;
{$APPTYPE CONSOLE}
uses
SysUtils;

Type
  TType = Word;

Type
  PVector = ^TVector;
  TVector = Array[1 .. 1] of TType;

  PDynMatrix = ^TDynMatrix;
  TDynMatrix = Array[1 .. 1] of PVector;

Var
  mxDynamic: PDynMatrix;
  n, i, j, command: Word;

procedure InitMa3x(var mxDynamic: PDynMatrix);
 Begin
  Write('n = '); ReadLn(n);
  GetMem(mxDynamic, n * SizeOf(PVector));
  For i := 1 To n Do
  GetMem(mxDynamic^[i], n * SizeOf(TType));
  end;

procedure ShowMa3x(var mxDynamic: PDynMatrix);
begin
   For i := 1 To n Do
    For j := 1 To n Do
      mxDynamic^[I]^[J]:=I*J;

  For i := 1 To n Do Begin
    WriteLn;
    For j := 1 To n Do
       Write(mxDynamic^[I]^[J]:4);
   end;
  End;

procedure KillMa3x( var mxDynamic: PDynMatrix);
begin
  For i := 1 To n Do
    FreeMem(mxDynamic^[i], n * SizeOf(TType));
    FreeMem(mxDynamic, n * SizeOf(PVector));
End;

  begin
  { TO]DO -oUser -cConsole Main : Insert code here }
 command:=0;
 repeat
  writeln;
  writeln('     MENU');
  writeln('1.Init Ma3x');
  writeln('2.Show Ma3x');
  writeln('3.Kill Ma3x');
  writeln('4.Exit');
  readln(command);
  case command of
  1: begin InitMa3x(mxDynamic); end;
  2: begin ShowMa3x(mxDynamic); end;
  3: begin KillMa3x(mxDynamic); end;

  end;
 until command=4;
 readln;
end.


Проблема возникла с удаление. В чём ошибка? Подскажите,пожайлуста!

И ещё,всё-таки как реализовать изменение количества элементов заданной строки???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 13.06.2007 16:38
Сообщение #11


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Так где всё-таки ошибочка? blink.gif

Сообщение отредактировано: volvo - 14.01.2009 10:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 13.06.2007 20:56
Сообщение #12


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


что бы это значило?...
Цитата
TDynMatrix = Array[1 .. 1] of PVector;

array из 1 элемента...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hardcase
сообщение 14.06.2007 1:33
Сообщение #13


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(мисс_граффити @ 13.06.2007 21:56) *
что бы это значило?...

array из 1 элемента...
Это си-подобная конструкция, таким способом в С объявляют структуры переменной длины, например, динамические массивы.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.06.2007 2:00
Сообщение #14


Гость






Цитата
Так где всё-таки ошибочка?
В чем выражается эта "ошибочка"? Я попробовал - ничего не ошибается, все работает...
 К началу страницы 
+ Ответить 
Rocket
сообщение 14.06.2007 13:54
Сообщение #15


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 14.06.2007 3:00) *

В чем выражается эта "ошибочка"? Я попробовал - ничего не ошибается, все работает...

Я заполняю массив элементамиЂ,вывожу на экран,всё нормально. Потом очищаю память и вывожу массив на экран, а он полностью выводится как и был заполнен....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.06.2007 14:04
Сообщение #16


Гость






А что ты хотел, чтобы произошло? Ты просто удалил области памяти из списка свободных блоков, теперь если ты попытаешься запросить еще раз память через GetMem, то могут быть выделены те области, в которых раньше находилась твоя матрица, вот тогда действительно данные запортятся. Пока же дополнительно память не выделяется, старые данные сохраняются.

А вообще-то неплохо было бы:
procedure KillMa3x( var mxDynamic: PDynMatrix);
begin
  For i := 1 To n Do
    FreeMem(mxDynamic^[i], n * SizeOf(TType));
  FreeMem(mxDynamic, n * SizeOf(PVector));
  mxDynamic := nil; // теперь при чтении "удаленных" данных будет AV ...
End;
 К началу страницы 
+ Ответить 
Rocket
сообщение 15.06.2007 11:05
Сообщение #17


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 14.06.2007 15:04) *

А что ты хотел, чтобы произошло? Ты просто удалил области памяти из списка свободных блоков, теперь если ты попытаешься запросить еще раз память через GetMem, то могут быть выделены те области, в которых раньше находилась твоя матрица, вот тогда действительно данные запортятся. Пока же дополнительно память не выделяется, старые данные сохраняются.

А вообще-то неплохо было бы:
procedure KillMa3x( var mxDynamic: PDynMatrix);
begin
  For i := 1 To n Do
    FreeMem(mxDynamic^[i], n * SizeOf(TType));
  FreeMem(mxDynamic, n * SizeOf(PVector));
  mxDynamic := nil; // теперь при чтении "удаленных" данных будет AV ...
End;


Большое Вам Спасибо!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 18.07.2025 1:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"