Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Работа с динамическими и открытыми массивами

Автор: Rocket 3.06.2007 20:53

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

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

Автор: мисс_граффити 3.06.2007 21:04

По-моему, тебе сюда:
http://forum.pascal.net.ru/index.php?showtopic=6730

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

Цитата
функцию для изменения количества элементов заданной строки;

Автор: Rocket 3.06.2007 21:16

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

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


А вот это как замутить?

Автор: volvo 3.06.2007 21:19

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

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

Автор: Rocket 3.06.2007 21:31

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

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

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


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

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

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

Где здесь именно то ,что мне нужно? Вы не могли написать примерный вариант этого пункта. Также включив описание массива указателей на функции. yes2.gif

Автор: volvo 3.06.2007 22:13

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

Автор: Rocket 3.06.2007 23:54

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

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

Да,я это понимаю.... Но всё-таки, вы не могли показать примерный вариант этого меню?

Автор: Rocket 4.06.2007 22:54

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

Автор: Rocket 5.06.2007 23:26

Ребята!Пожалуйста, помогите очень нужно!!! Я чёт вообще не вкурю wacko.gif

Автор: Rocket 12.06.2007 22:39

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


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 13.06.2007 20:38

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

Автор: мисс_граффити 14.06.2007 0:56

что бы это значило?...

Цитата
TDynMatrix = Array[1 .. 1] of PVector;

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

Автор: hardcase 14.06.2007 5:33

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

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

Автор: volvo 14.06.2007 6:00

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

Автор: Rocket 14.06.2007 17:54

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

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

Я заполняю массив элементамиЂ,вывожу на экран,всё нормально. Потом очищаю память и вывожу массив на экран, а он полностью выводится как и был заполнен....

Автор: volvo 14.06.2007 18: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;

Автор: Rocket 15.06.2007 15:05

Цитата(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;


Большое Вам Спасибо!!!