Skip to main content

Лабораторные работы

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

Нужны лабораторные работы по ОС (специальность АИС, УГТУ).

+ Как перевести Cardinal в String
+ как Узнать занятость памяти в %.
+ вот это:

procedure Mini(P: Pointer); stdcall;
var
i:integer;
min:extended;
begin
min:=1000;
For i:=1 to 15 do
begin
<?> // находим минимум [пока не знаю как обратиться к переменной]
end;
Form1.Memo1.Lines.Add(floattostr(min));
end;

procedure TForm1.Button11Click(Sender: TObject);
var
mas:array [1..15] of extended;
Threads1 : THANDLE; // поток
i : integer;
begin
randomize;

for i:=1 to 15 do
begin
mas[i]:=random(100);
memo1.lines.Add(inttostr(i)+'. '+ floattostr(mas[i]));
end;
memo1.Lines.Delete(15);

hThreads1 = CreateThread(NULL, 0, Mini, &mas, 0, NULL);

// Поток использует процедуру Mini и посылает туда адресс массива mas [@mas]
// Как в процедуре обратиться к элементу этого массива, чтобы найти минимум

end;

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Нужны лабораторные работы по ОС (специальность АИС, УГТУ).

+ Как перевести Cardinal в String
+ как Узнать занятость памяти в %.
+ вот это:

procedure Mini(P: Pointer); stdcall;
var
i:integer;
min:extended;
begin
min:=1000;
For i:=1 to 15 do
begin
<?> // находим минимум [пока не знаю как обратиться к переменной]
end;
Form1.Memo1.Lines.Add(floattostr(min));
end;

procedure TForm1.Button11Click(Sender: TObject);
var
mas:array [1..15] of extended;
Threads1 : THANDLE; // поток
i : integer;
begin
randomize;

for i:=1 to 15 do
begin
mas[i]:=random(100);
memo1.lines.Add(inttostr(i)+'. '+ floattostr(mas[i]));
end;
memo1.Lines.Delete(15);

hThreads1 = CreateThread(NULL, 0, Mini, &mas, 0, NULL);

// Поток использует процедуру Mini и посылает туда адресс массива mas [@mas]
// Как в процедуре обратиться к элементу этого массива, чтобы найти минимум

end;

1.
var cc: Cardinal;
begin
cc:=10;
ShowMessage(inttostr(cc));
end;

2.
var ms:MEMORYSTATUS;
begin
GlobalMemoryStatus(ms);
ShowMessage(inttostr(ms.dwAvailPhys));
end;

3.
ShowMessage(floattostr(PExtended(p)^));

Учись, студент Smile .

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

2.
var ms:MEMORYSTATUS;
begin
GlobalMemoryStatus(ms);
ShowMessage(inttostr(ms.dwAvailPhys));
end;

Так и сделал в системе стоит 512 Mb, а он пишет 1376712 - что не так?

Всё решено : Забыл использоать GlobalMemoryStatus(ms) - кстати что это такое?

Как работать с указателями?
Например перевести pointer в string?

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

SARS что-то не очень получается:
......
for i:=1 to 15 do
begin
mas[i]:=random(100);
// забил массив
end;
hThreads1 = CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
//создал поток
...
procedure Mini(P: Pointer); stdcall;
begin
// как обратиться через p скажем к 5 и 6 элементу mas
end;

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

Так и сделал в системе стоит 512 Mb, а он пишет 1376712 - что не так?
А что тебя смущает? :mellow:

1.
GlobalMemoryStatus - это WinAPI функция, которая предоставляет информацию о физической и виртуальной памяти. Если в системе установлено более 4Гб основной памяти, то необходимо использовать GlobalMemoryStatusEx.

Вот что пишут в MSDN -The GlobalMemoryStatus function obtains information about the system's current usage of both physical and virtual memory. To obtain information about the extended portion of the virtual address space, or if your application may run on computers with more than 4 GB of main memory, use the GlobalMemoryStatusEx function.

2.
Почитай справку в Delphi по теме "Other standard pointer types" (другие стандартные типы указателей). Там есть PString и др. Работать так же как и с PExtended.

Учись пользоваться документацией. Если нет таковой, могу помочь Smile.

Какая группа АИС?

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

АИС-2-03 - 3 курс....
Есть RSDN (MSDN только на руссском)? Короче возьму всё что сможешь дать...

Есть SYS_INFO.lpMaximumApplicationAddress, его тип - Pointer;
как значение этого параметра вывести на экран?

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

SARS что-то не очень получается:
......
for i:=1 to 15 do
begin
mas[i]:=random(100);
// забил массив
end;
hThreads1 = CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
//создал поток
...
procedure Mini(P: Pointer); stdcall;
begin
// как обратиться через p скажем к 5 и 6 элементу mas
end;

Твой пример имеет один большой недостаток, в функцию mini ты передаешь только указатель на массив, из-за этого ты уже ограничил использование этой функции. Лучше всего передавать с указателем еще и размер массива.

Если ничего не менять, то обратиться к любому элементу можно так:
var m:array of extended;
begin
m:=p;
ShowMessage(floattostr(m[5]));
end;

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

procedure Mini(P: pointer); stdcall;
var
i:integer;
min:extended;
m:array of extended;
begin
min:=1000;
m:=p;
For i:=1 to 15 do
begin
if m[i]

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

АИС-2-03 - 3 курс....
Есть RSDN (MSDN только на руссском)? Короче возьму всё что сможешь дать...

Есть SYS_INFO.lpMaximumApplicationAddress, его тип - Pointer;
как значение этого параметра вывести на экран?

RSDN - это не MSDN на русском.
MSDN - оффициальная документация по всему ПО Microsoft.
RSDN - это форум.

Значение из SYS_INFO.lpMaximumApplicationAddress можно получить преобразованием PInteger. Т.к. SYS_INFO.lpMaximumApplicationAddress указатель на адрес памяти, то его тип INT32.

MSDN можешь взять здесь.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

Т.е. так что ли - PInteger(SYS_INFO.lpMaximumApplicationAddress)?
А дальше что?
Как вывести в Edit?
Так что насчёт потока?

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Т.е. так что ли - PInteger(SYS_INFO.lpMaximumApplicationAddress)?
А дальше что?
Как вывести в Edit?

Form1.Edit1.Text:=inttostr(PInteger(SYS_INFO.lpMaximumApplicationAddress)^);

"Shader" пишет:

Так что насчёт потока?

Все работает, единственное только в функции MINI цикл надо гнать от 0 до 14, т.к. объявлен массив array of extended, а в нем нумерация элементов с ноля.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

Form1.Edit1.Text:=inttostr(PInteger(SYS_INFO.lpMaximumApplicationAddress)^);

Здесь точно косяк, когда запускаю программу вылезает сообщение об ошибке:

А насчёт потока: просмотрел значения которые приходят в процедуру - они не те что образуются в массиве mas - что-то не так?
Может даш другое решение?

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Здесь точно косяк, когда запускаю программу вылезает сообщение об ошибке:

Пример кода в студию, где ты используешь SYS_INFO Smile

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

Вуаля:

procedure TForm1.Button12Click(Sender: TObject);
var
SYS_INFO : SYSTEM_INFO;
begin
GetSystemInfo(SYS_INFO);

{ * Минимальный доступный адрес * }
Edit9.text:=inttostr(PInteger(SYS_INFO.lpMaximumApplicationAddress)^);

{ * Максимальный доступный адрес * }
Edit10.Text:=inttostr(Pinteger(SYS_INFO.lpMaximumApplicationAddress)^);
end;

Поток:
MyThreads1 := CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
там где стоит @mas - должен быть указатель на массив - это хоть правильно?

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

А если вот так:
...................................................
type
tmas=array [1..10] of extended;
pmas=^tmas;
....................................................
procedure TForm1.Button11Click(Sender: TObject);
var
mas:tmas;
ThreadID: DWORD;
MyThreads1 : THANDLE;
i : integer;
begin
randomize;
for i:=1 to 15 domas[i]:=random(100);
MyThreads1 := CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
SetThreadPriority(MyThreads1,0);
// 4-я переменная в функции CreateThread есть ничто иное как аргумент потока lpParameter
// т.е. lpParameter: Pointer как видно типа pointer
// Значит я правильно отправляю адресс массива mas
end;
....................................................
// Значит и процедура должна иметь входную переменную типа pointer
....................................................
procedure Mini(P: pmas); stdcall;
// p - указатель на тип tmas
var
i:integer;
min:extended;
begin
min:=1000;
For i:=1 to 10 do Form1.Memo1.Lines.Add(floattostr(p^[i]));
// И когда я вывожу содержание указетеля - ба-бах, опять, ошибка - я заколебался - что не так?
end;
....................................................

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Вуаля:

procedure TForm1.Button12Click(Sender: TObject);
var
SYS_INFO : SYSTEM_INFO;
begin
GetSystemInfo(SYS_INFO);

{ * Минимальный доступный адрес * }
Edit9.text:=inttostr(PInteger(SYS_INFO.lpMaximumApplicationAddress)^);

{ * Максимальный доступный адрес * }
Edit10.Text:=inttostr(Pinteger(SYS_INFO.lpMaximumApplicationAddress)^);
end;

Поток:
MyThreads1 := CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
там где стоит @mas - должен быть указатель на массив - это хоть правильно?

Приношу извинения, за то, что ввел в заблуждение Smile

Правильно будет так:
var
SYS_INFO : SYSTEM_INFO;
begin
GetSystemInfo(SYS_INFO);

//Минимальный доступный адрес
Edit9.text:=inttostr(Cardinal(SYS_INFO.lpMaximumApplicationAddress));

//Максимальный доступный адрес
Edit10.Text:=inttostr(Cardinal(SYS_INFO.lpMaximumApplicationAddress));
end;

Sorry :unsure:

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

for i:=1 to 15 domas[i]:=random(100);
MyThreads1 := CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
SetThreadPriority(MyThreads1,0);
// 4-я переменная в функции CreateThread есть ничто иное как аргумент потока lpParameter
// т.е. lpParameter: Pointer как видно типа pointer
// Значит я правильно отправляю адресс массива mas

Ошибка может быть здесь? Посмотри на границы цикла :rolleyes:.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

Приношу извинения, за то, что ввел в заблуждение Smile

Теперь всё правильно, спасибо....

"SARS" пишет:

Ошибка может быть здесь? Посмотри на границы цикла :rolleyes:.

for i:=1 to 10 do
begin
mas[i]:=...
end;
Ничего не меняется...

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

Поменялось в лучшую сторону только то, что первоевыводимое число из указателя на массив совпадает с истчником - а вот остальные нет...

procedure Mini(P: pmas); stdcall;
var
i:integer;
min:extended;
begin
min:=1000;
For i:=1 to 10 do
begin
Form1.Memo1.Lines.Add(floattostr(p^[i]));
end;
end;

procedure TForm1.Button11Click(Sender: TObject);
var
mas:tmas;
ThreadID: DWORD;
MyThreads1 : THANDLE;
i : integer;
begin
randomize;
Application.ProcessMessages;
for i:=1 to 10 do
begin
mas[i]:=random(100);
memo1.lines.Add(inttostr(i)+'. '+ floattostr(mas[i]));
end;
MyThreads1 := CreateThread(Nil, 0, @Mini, @mas, 0, ThreadID);
SetThreadPriority(MyThreads1,0);
end;

Вывод в memo1:
1. 28
2. 86
3. 37
4. 64
5. 8
6. 6
7. 62
8. 68
9. 76
10. 84
28
2,74175916910542E-4912
-?,?

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

// p - указатель на тип tmas
var
i:integer;
min:extended;
begin
min:=1000;
For i:=1 to 10 do Form1.Memo1.Lines.Add(floattostr(p^[i]));
// И когда я вывожу содержание указетеля - ба-бах, опять, ошибка - я заколебался - что не так?
end;
....................................................

Смотри, проблема в том, что в функцию ты передаешь указатель на массив. Сам указатель не содержит никакой информации о размерности массива и размерности элементов, входящих в него(массив). Если смотреть как было раньше, то получим: по указателю p^[i] мы взяли первый элемент, на следующей итерации указатель сдвигается не на размер Extended, а на размер Pointer, а так как размеры этих типов разные, то мы получаем фигню Smile. Для исправления нам надо просто получить массив типа tmas по указателю. Дальше уже обращаться к этому массиву Smile.

var
i:integer;
min:extended;
temp:tmas;
begin
min:=1000;
temp:=p^;
For i:=1 to 10 do Form1.Memo1.Lines.Add(floattostr(temp[i]));
end;

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

Ты МОНСТР! Всё ПРОСТО COOL
- работает -

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Ты МОНСТР! Всё ПРОСТО COOL
- работает -

Спасибо Laughing out loud

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

SARS, cможешь ещё помочь?!

procedure TForm1.Button15Click(Sender: TObject);
Var
File_1 : THandle;
To_Buffer: ^char;
dwResult1 : dword;
begin
File_1 := CreateFile(PCHAR(extractfilepath(paramstr(Innocent)+'1.txt'), GENERIC_READ, 0, Nil, OPEN_EXISTING, 0, 0);
// открываем на чтение ранее созданный файл, содежание которого составляет 1 слово: Hello!
dwResult1:=0;
To_Buffer := VirtualAlloc(nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if ReadFile(File_1, To_Buffer, 4096, dwResult1, NiL) then showmessage(' ');
// Процедура чтения ReadFile возвращает false - типа не получается произвести чтение - что не так?
end;
Вот пример, но он для С++ - может поможет...

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

SARS, cможешь ещё помочь?!

procedure TForm1.Button15Click(Sender: TObject);
Var
File_1 : THandle;
To_Buffer: ^char;
dwResult1 : dword;
begin
File_1 := CreateFile(PCHAR(extractfilepath(paramstr(Innocent)+'1.txt'), GENERIC_READ, 0, Nil, OPEN_EXISTING, 0, 0);
// открываем на чтение ранее созданный файл, содежание которого составляет 1 слово: Hello!
dwResult1:=0;
To_Buffer := VirtualAlloc(nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if ReadFile(File_1, To_Buffer, 4096, dwResult1, NiL) then showmessage(' ');
// Процедура чтения ReadFile возвращает false - типа не получается произвести чтение - что не так?
end;
Вот пример, но он для С++ - может поможет...

Опять же, читаем документацию, там написано:
File access must be for numbers of bytes that are integer multiples of the volume's sector size. For example, if the sector size is 512 bytes, an application can request reads and writes of 512, 1024, or 2048 bytes, but not of 335, 981, or 7171 bytes,
это значит, что из файла можно читать только блоками, размер которых в 1 кластер. Для этого пример надо переделать так:
var
File : THandle;
Buf: Pchar;
Res, BSize, t : Cardinal;
begin
File := CreateFile(PCHAR(extractfilepath(paramstr(Innocent)+'1.txt'), GENERIC_READ, 0, Nil, OPEN_EXISTING, 0, 0);
//получаем размер кластера файловой системы
GetDiskFreeSpace(PChar(ExtractFileDrive(paramstr(Innocent)), t, BSize, t, t);
Buf:=VirtualAlloc(nil, BSize, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
if ReadFile(File, Buf, BSize, Res, nil) then showmessage(inttostr(Res));

//ну и конечно же добавить обработку возможных исключений Smile
end;

И еще, вопрос, какую цель ты преследуешь, переводя программы с C на Delphi? Если ты пишешь на Delphi, то используй функции Delphi, они нагляднее и расчитаны на применение в нем. В Delphi не очень удобно, но можно, работать с API функциями.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

С этой проблемой уже разобрасался!
Осталась посмледняя лаба...
Пишу на Delphi так как лично мне C++ не нравиться, а примеры дали нам именно для Cшника - и тут ничего не поделаешь. Да и потом все примеры, если ты не заметил, для WINAPI - а его функции и процедуры везде едины... Так что больших проблем не вызывает. Кстати можешь выложить свой msdn на fileservere'е, а то у тебя какие-то обрывы связи случаются и я не могу докачать нормально - а я тебе, чтобы не накладно было, выложу, если надо, MSDN 2005, правда он для C++ в основном.
По рукам?

Цель - научиться Win API и сдать лабы по ОПЕРАИОННым СИСТЕМам до экзамена...

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

С этой проблемой уже разобрасался!
Осталась посмледняя лаба...
Пишу на Delphi так как лично мне C++ не нравиться, а примеры дали нам именно для Cшника - и тут ничего не поделаешь. Да и потом все примеры, если ты не заметил, для WINAPI - а его функции и процедуры везде едины...

Это я заметил Smile. Но в Delphi, его стандартные типы упрощены, а нормальные стандартные, вывернуты наизнанку.

"Shader" пишет:

Так что больших проблем не вызывает. Кстати можешь выложить свой msdn на fileservere'е, а то у тебя какие-то обрывы связи случаются и я не могу докачать нормально - а я тебе, чтобы не накладно было, выложу, если надо, MSDN 2005, правда он для C++ в основном.
По рукам?

А зачем тебе тогда MSDN 2004, July, когда у тебя есть 2005 :huh:.

"Shader" пишет:

Цель - научиться Win API и сдать лабы по ОПЕРАИОННым СИСТЕМам до экзамена...

Это правильно Smile. Кто принимает?

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

... в Delphi, его стандартные типы упрощены, а нормальные стандартные, вывернуты наизнанку.

Я привык.

"SARS" пишет:

А зачем тебе тогда MSDN 2004, July, когда у тебя есть 2005 :huh:.

MSDN 2004 - тоже для C++ ? а для Delphi что-нибудь есть?

"SARS" пишет:

Кто принимает?

А не помню... Может ты знаешь: постоянно шутит про коньяк, microsoft и windows. Молодой, весёлый, наглый...

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Я привык.

Ничего против не имею Laughing out loud

"Shader" пишет:

MSDN 2004 - тоже для C++ ?

Нет, он не для С++, он для всех языков Microsoft.

"Shader" пишет:

а для Delphi что-нибудь есть?

Посмотри здесь, может что-нибудь полезное найдешь.

"Shader" пишет:

А не помню... Может ты знаешь: постоянно шутит про коньяк, microsoft и windows. Молодой, весёлый, наглый...

Затрудняюсь ответить :unsure:, нас он не учил системному ПО.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

Новая проблема возникла!
Суть такова:
нужна функция, которая бы исполняла бы перемножение матриц (квадратые и одинаковые)!

Т.е. ТЗ выглядит так:
..................................................
type
Dmat = array [1..2,1..2] of real;
var
matrix1,matrix2: ^Dmat;
begin
// количество строк и столбцов
x:=strtoint(edit1.text);
// выделяем пространство памяти
getmem( matrix1,x*x*8);
getmem( matrix2,x*x*8);

// забиваем значения
For i:=1 to x -1 do
begin
For j:=1 to x -1 do
begin
matrix1^[i,j]:=strtofloat(stringgrid1.Cells[i,j]);
matrix2^[i,j]:=strtofloat(stringgrid2.Cells[i,j]);
end;
end;
// получаем перемноженные матрицы
matrix1:="что здесь написать?"PowerMatrix(@matrix1, @matrix2); // т.е. в функцию отправляем только указатели на адреса матриц

end;

function PowerMatrix (var "как здесь написать?"):"как здесь написать";
var
.....
begin
.....
"как обратитьсяк конкретному элементу?"
.....
end;

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

Я бы сделал так:

type<br />
  //объявляем тип для удобства, чтобы постоянно не писать array of  array of ...<br />
  DArr = array of array of real;<br />
var<br />
  matrix1,matrix2: DArr;<br />
  n,m: integer;<br />
begin<br />
  // количество строк и столбцов<br />
  x:=strtoint(edit1.text);              <br />
  SetLength(matrix1, x);<br />
  SetLength(matrix2, x);<br />
  for n:=0 to x-1 do<br />
  begin<br />
    SetLength(matrix1[n], x);<br />
    SetLength(matrix2[n], x);<br />
  end;</p>
<p>  //забиваем значения<br />
  For i:=0 to x -1 do                  <br />
  begin<br />
    For j:=0 to x -1 do<br />
    begin<br />
      matrix1[i,j]:=strtofloat(stringgrid1.Cells[i,j]);<br />
      matrix2[i,j]:=strtofloat(stringgrid2.Cells[i,j]);<br />
    end;<br />
  end;</p>
<p>  //получаем перемноженные матрицы<br />
  //Так как в фукцию мы передаем указатели на массивы, то необходимо передавать еще и размер этих массивов<br />
  matrix1:=PowerMatrix(matrix1, matrix2, x);</p>
<p>end;</p>
<p>function PowerMatrix(a:Pointer, b:Pointer, size:integer):Pointer;<br />
var<br />
  //объявляем массивы для доступа к переданным указателям<br />
  tmp_matrix1,tmp_matrix2: DArr;<br />
begin<br />
  tmp_matrix1:=a;<br />
  tmp_matrix2:=b;</p>
<p>  //к элемента обращаемся по-стандартному tmp_matrix1[n][m]<br />
  .....</p>
<p>  //передаем результат обратно из функции<br />
  PowerMatrix:=tmp_matrix1;<br />
end;

Удачи Smile

P.S. Я бы советовал тебе все-таки разобраться с указателями и типами данных

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

Я бы советовал тебе все-таки разобраться с указателями и типами данных

Хорошо, тогда:
1. type array of real является указателем? matrix1 - сам посебе указатель на матрицу?
2. почему к элементам матрицы обращаемся по обычному, а не через ^?
3. тогда зачем вообще нужно использовать @, например, ты просто написал matrix1, где я хотел @matrix1? когда его можно использовать, какой от него толк?

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Хорошо, тогда:
1. type array of real является указателем? matrix1 - сам посебе указатель на матрицу?
2. почему к элементам матрицы обращаемся по обычному, а не через ^?
3. тогда зачем вообще нужно использовать @, например, ты просто написал matrix1, где я хотел @matrix1? когда его можно использовать, какой от него толк?

1. Конечно, нет такого типа - array. В данном случае, matrix1 - это указатель на массив указателей, которые указывают на массивы с элементами real.
2. Оператор ^ - разыменовывает указатель, а так как в функции PowerMatrix мы объявили массив и присвоили ему адрес массива, переданного в параметре, то к нему(массиву) можно обращаться и без ^. Но если это принципиально, то можно переделать и через ^.
3. Оператор @ - получение указателя. Его применяют, например, когда надо передать указатель на структуру (структура может быть больших размеров, и поэтому нет смысла передавать ее целиком). Если ты конечно хочешь использовать @ и ^, то можно переделать код, но невижу смысла, чтобы указатель разыменовывать в массив, а потом получать с этого массива снова указатель.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

...

Я смотрю все кто хорошо пишут код - не могут нормально общаться или объяснять, как хотите! или просто я плохо разбираюсь в терминологии - не обижайся, просто вот есть тоже знакомый, отличный програмер, Gr0l, может знаешь такого, так вот он тоже сложнова-то объясняется, - не по-русски..., причём это не только моё мнение...

Мне бы на пальцах - ты уж извини, просто такие вещи (абстрактные) мне тяжко даются:
1. Есть matrix1 - что является указателем на массив, указывающий на массив real ячейками.
это я правильно понял?!
2. А в чём разница между передачей в функцию @matrix и matrix? физически разница?
3. Как я понимаю @ возвращает адресс на массив.
4. В чём разница между адрессом массива и указателем на него.
5. В чём разница между ^matrix[n][m] и matrix^[n][m]?
6. А что если бы массив входящий в функцию был бы extented, а temp_matrix был бы real. Что пришлось бы изменить?

Если всёравно но не пойму, то видимо кодить хорошо будет не мой целью в жизни.

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

Я смотрю все кто хорошо пишут код - не могут нормально общаться или объяснять, как хотите! или просто я плохо разбираюсь в терминологии - не обижайся, просто вот есть тоже знакомый, отличный програмер, Gr0l, может знаешь такого, так вот он тоже сложнова-то объясняется, - не по-русски..., причём это не только моё мнение...

Мне бы на пальцах - ты уж извини, просто такие вещи (абстрактные) мне тяжко даются:
1. Есть matrix1 - что является указателем на массив, указывающий на массив real ячейками.
это я правильно понял?!
2. А в чём разница между передачей в функцию @matrix и matrix? физически разница?
3. Как я понимаю @ возвращает адресс на массив.
4. В чём разница между адрессом массива и указателем на него.
5. В чём разница между ^matrix[n][m] и matrix^[n][m]?
6. А что если бы массив входящий в функцию был бы extented, а temp_matrix был бы real. Что пришлось бы изменить?

Если всёравно но не пойму, то видимо кодить хорошо будет не мой целью в жизни.

1. Да, ты правильно понял Smile
2. Если matrix - это массив (неважно чего), тогда ситуация будет выглядеть так:
При передачи matrix в качестве параметра, будет передан адрес этого массива, или фактически так называемый указатель.
При передачи @matrix в качестве параметра, будет передан указатель на указатель массива, т.к. matrix является указателем, а @ получает указатель.
3. Совершенно верно.
4. Адрес массива - это ячейка памяти, начиная с которой располагается массив. Указатель - это фактически переменная, значение которой - это адрес памяти, где располагается массив, переменная, структура и др.
5.
The symbol ^ has two purposes, both of which are illustrated in our example. When it appears before a type identifier--

^typeName

--it denotes a type that represents pointers to variables of type typeName. When it appears after a pointer variable--

pointer^

--it dereferences the pointer; that is, it returns the value stored at the memory address held by the pointer.
Более подробно можешь прочитать в документации по delphi. Раздел "Overview of pointers".
6. Пришлось бы изменить тип temp_matrix на extended, т.к. размер типа extended больше real, он просто туда не влезет. Для этого мы и объявили тип DArr, т.к. стоит только в одном месте поменять тип.

Как смог объяснил :unsure:

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

...

Прикинь, а я всё понял...
ВИДИМО ИЗ ТОГО ЧТО НАПИСАЛ ВСЁ А С ФУНКЦИЕЙ НЕТ!

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

...................................................................................................
Опять проблема с этой функцией:

var
Form1: TForm1;
K:integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
K:=0;
end;

// процедура так как ты её описал!

function PowerMatrix(a:Pointer; b:Pointer; size:integer):Pointer;
var
tmp1,tmp2,tmp3: array of array of real;
i,j : integer;
begin
setlength(tmp1,size);
setlength(tmp2,size);
setlength(tmp3,size);
for i:=0 to size - 1 do
begin
setlength(tmp1[i],size);
setlength(tmp2[i],size);
setlength(tmp3[i],size);
end;
tmp1:=a;
tmp2:=b;

for i:=0 to size - 1 do
begin
for j:=0 to size -1 do
begin
tmp3[i,j]:=2; //я не использую tmp1 и tmp2 пока, а просто забиваю tmp3 двойками
end;
end;
PowerMatrix:=tmp3; // POWERmatrix возвращает указатель на tmp3 набитый двойками.
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
temp,temp2: array of array of real;
begin
Application.ProcessMessages;
K:=K+1;

setlength(temp,3);
setlength(temp2,3);
for i:=0 to 2 do
begin
setlength(temp[i],3);
setlength(temp2[i],3);
end;

For i:=0 to 2 do
begin
For j:=0 to 2 do
begin
temp[j,i]:=1; // забиваю temp копейками
end;
end;

if k<>1 then // когда второй раз нажать на кнопку то temp должен указывать на tmp3 набитый двойками
begin
temp2:=powermatrix(temp,temp,3);
temp:=temp2;
end;

for i:=0 to 2 do
begin
showmessage(floattostr(temp[i,i])); // теперь выводим содержимое
end;
end;

По идее должно быть так:
при нажатии на кнопку первый раз должны водиться 1 з раза (так оно и есть), а при нажатии на кнопку второй раз - три раза двойки (а лезут три НУЛЯ).
Чаво не так?

Аватар пользователя SARS
Не в сети
Новенький
Зарегистрирован: 22.12.2005
Сообщения: 72
Баллы: 72
Лабораторные работы

"Shader" пишет:

function PowerMatrix(a:Pointer; b:Pointer; size:integer):Pointer;
var
tmp1,tmp2,tmp3: array of array of real;
i,j : integer;
begin
setlength(tmp1,size);
setlength(tmp2,size);
setlength(tmp3,size);
for i:=0 to size - 1 do
begin
setlength(tmp1[i],size);
setlength(tmp2[i],size);
setlength(tmp3[i],size);
end;
tmp1:=a;
tmp2:=b;

for i:=0 to size - 1 do
begin
for j:=0 to size -1 do
begin
tmp3[i,j]:=2; //я не использую tmp1 и tmp2 пока, а просто забиваю tmp3 двойками
end;
end;
PowerMatrix:=tmp3; // POWERmatrix возвращает указатель на tmp3 набитый двойками.
end;

Приношу свои извинения, небольшой косяк. Когда я приводил пример кода, в функции PowerMatrix, когда она должна возвращать результат, я написал

<br />
  //передаем результат обратно из функции<br />
  PowerMatrix:=tmp_matrix1;<br />

это не есть правильно Sad. Тут вся проблема в том, что здесь мы возвращаем указатель на локальный массив функции, который недоступен вне функции.
Исправить это можно двумя способами:
1. Обявить глобальный массив и в него складывать результаты вычислений. Это как-бы не совсем правильно.
2. Переделать фукнцию в процедуру, у которой есть еще один параметр, указатель на массив, в который возвращать значения вычислений. Сам этот массив может быть как глобальным так и локальным.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"SARS" пишет:

2. Переделать фукнцию в процедуру, у которой есть еще один параметр, указатель на массив, в который возвращать значения вычислений. Сам этот массив может быть как глобальным так и локальным.

Опробую , и сообщу!

Аватар пользователя Gr0l
Не в сети
Студент
Зарегистрирован: 16.10.2005
Сообщения: 349
Баллы: 367
Лабораторные работы

"Shader" пишет:

Опробую , и сообщу!

Че ты тупишь?! Smile У тя есть указатель на твой динамический массив....все решается Smile Ты знаешь какой он имеет тип....Делаешь следующее: объявляешь глобально Type Tmas=array of array of real; Ну а потом указателю указываешь, что он имеет такой вот тип. И ты будешь работать со своим указателем, как с массивом. И ряд вопросов решиться, т.е. алгоритм можно будет упростить. Только вот не понимаю, зачем ты работаешь с Pointer указывающие на ту или иную структуру данных? Smile Удачи...

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"Gr0l" пишет:

...бла...бла...бла... :unsure:

Когда сделаешь свою функцию кинь её сюда - поглядим! Если что - я всё закончил по ТПР.

Аватар пользователя Gr0l
Не в сети
Студент
Зарегистрирован: 16.10.2005
Сообщения: 349
Баллы: 367
Лабораторные работы

"Shader" пишет:

Когда сделаешь свою функцию кинь её сюда - поглядим! Если что - я всё закончил по ТПР.

В смысле какую функцию?

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
Лабораторные работы

"Gr0l" пишет:

В смысле какую функцию?

КАк какую? перемножения матриц (3 задание ТПР)

Аватар пользователя Gr0l
Не в сети
Студент
Зарегистрирован: 16.10.2005
Сообщения: 349
Баллы: 367
Лабораторные работы

"Shader" пишет:

КАк какую? перемножения матриц (3 задание ТПР)

ОК выложу, как сделаю!

Аватар пользователя Orlean
Не в сети
Студент
Зарегистрирован: 13.10.2005
Сообщения: 514
Баллы: 535
Лабораторные работы

"Shader" пишет:

КАк какую? перемножения матриц (3 задание ТПР)

Ок, а выложи свои коды!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".