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

Уважаемые Форумчане! Помогите сделать эту лабу,пожалуйста! smile.gif Подскажите что тут, да как делается....
мисс_граффити
По-моему, тебе сюда:
Динамические массивы и матрицы

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

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


А вот это как замутить?
volvo
А вот это - см. здесь:
http://volvo71.narod.ru/menus.htm

(правда у меня там нет описания массива указателей на функции, но это добавляется в течении нескольких секунд)
Rocket
Цитата(Rocket @ 3.06.2007 17:53) *

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

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


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

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

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

Где здесь именно то ,что мне нужно? Вы не могли написать примерный вариант этого пункта. Также включив описание массива указателей на функции. yes2.gif
volvo
Именно то, что тебе нужно можешь написать только ты сам... Не хочешь пользоваться тем что есть - пиши с нуля...
Rocket
Цитата(volvo @ 3.06.2007 19:13) *

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

Да,я это понимаю.... Но всё-таки, вы не могли показать примерный вариант этого меню?
Rocket
Так как всё-таки это организовать:.
тестирование при помощи меню, для чего создать два массива:
• массив строк, содержащий названия пунктов меню;
• массив указателей на функции, для выполнения соответствующих видов работ.??? Подскажите,плиз!!!
Rocket
Ребята!Пожалуйста, помогите очень нужно!!! Я чёт вообще не вкурю wacko.gif
Rocket
Вот создал процедуру для выделения памяти, просмотра элементов и уничтожения выделенной памяти:


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.


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

И ещё,всё-таки как реализовать изменение количества элементов заданной строки???
Rocket
Так где всё-таки ошибочка? blink.gif
мисс_граффити
что бы это значило?...
Цитата
TDynMatrix = Array[1 .. 1] of PVector;

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

array из 1 элемента...
Это си-подобная конструкция, таким способом в С объявляют структуры переменной длины, например, динамические массивы.
volvo
Цитата
Так где всё-таки ошибочка?
В чем выражается эта "ошибочка"? Я попробовал - ничего не ошибается, все работает...
Rocket
Цитата(volvo @ 14.06.2007 3:00) *

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

Я заполняю массив элементамиЂ,вывожу на экран,всё нормально. Потом очищаю память и вывожу массив на экран, а он полностью выводится как и был заполнен....
volvo
А что ты хотел, чтобы произошло? Ты просто удалил области памяти из списка свободных блоков, теперь если ты попытаешься запросить еще раз память через 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
Цитата(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;


Большое Вам Спасибо!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.