Добрый день, помогите разобраться с указателями..
необходимо.Компонентам массива целых присваиваются сдвинутые на 65 значения индекса, печатается массив целых. Переменной-указателю на символьный массив присваивается адрес массива целых. Снова распечатывается массив, но по адресам значений. Вместо последовательности чисел будет напечатана последовательность ASCII символов от А до z с пробелами.
собственно есть текст проги, но мне он не ясен помогите пожалуйста..
а вот текст..
Program ReInterpretation;
Uses Crt;
Type
A = Array [0..99] of char;
Var
X : Array [0..49] of integer;
pA : ^A;
i : integer;
Begin
ClrScr;
for i := 0 to 49 do begin
X[i] := 65+i;
write(X[i], ' ');
End;
pA := @X;
writeln;
for i := 0 to 99 do
write(pA^[i],' ');
readln;
read;
End.
собственно задача из <<той же серии>>...
Uses
Crt;
Var
P : pointer;
Procedure Test(p: pointer);
Begin
p := @P; {Определение адреса локального параметра}
writeln ('', Seg(p^), ':', Ofs(p^));
End;
Begin
ClrScr;
Test(P); {Вызов процедуры}
writeln('', Seg(p^), ':', Ofs(p^));
readln;
read;
End.
Что именно здесь непонятно? Почему в процедуре печатается ненулевое значение, а в основной программе - нули?
constне работает(illegal character "'р'" ($F0))
р: ^real = NIL;
begin
if р = NIL then
new(p);
dispose(p);
p := NIL;
end.
У тебя 2 символа p - в кириллице (в описании и в If ...)
Поменяй на латинские...
а вот еще одна задача оттуда...
program Primer1;
const
SizeOfReal = 6; {Длина переменной типа REAL}
N = 100; {Количество столбцов}
M = 200; {Количество строк}
var
i, j: integer;
PtrStr: array [1..N] of pointer;
s: real;
type
RealPoint = ^real;
{-----------------}
Function AddrR(i,j: word): RealPoint;
{По сегменту i и смещению j выдает адрес вещественной переменной}
begin
AddrR := ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^)+(j-1)*SizeOfReal)
end; {AddrR}
{-----------------}
Function GetR(i,j: integer): real;
{Выдает значение вещественной переменной по сегменту i
и смещению j ее адреса}
begin
GetR := AddrR(i,j)^
end; {GetR}
{-----------------}
Procedure PutR(i,j: integer; x: real);
{Помещает в переменную, адрес которой имеет сегмент i
смещение j, вещественное значение x}
begin
AddrR(i,j)^ := x
end; {PutR}
{-----------------}
begin {Main}
for i := 1 to N do begin
GetMem (PtrStr[i], M*SizeOfReal);
for j := 1 to M do PutR(i, j, Random)
end;
s := 0;
for i := 1 to N do
for j := 1 to M do
s := s + GetR(i,j);
WriteLn(s / (N * M): 12:10);
end. {Main}
Свят-свят-свят... Что с тобой? Как это "не компилит"?
Function AddrR(i,j: word): RealPoint;
begin
AddrR := RealPoint(ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^)+(j-1)*SizeOfReal))
end;
теперь работает(но с предупреждением)...
volvo, не мог бы ты добавить свои подробные коментарии... пожалуйста...
program Primer1;
const
SizeOfReal = 6; {Длина переменной типа REAL}
N = 100;
M = 200;
var
i, j: integer;
PtrStr: array [1..N] of pointer;
s: real;
type
RealPoint = ^real;
{-----------------}
Function AddrR(i,j: word): RealPoint;
// По индексу в массиве указателей i и индексу элемента внутри i-го массива
// выдает адрес вещественной переменной
begin
AddrR := RealPoint(
// "собираем" адрес из сегмента : смещения, где
ptr(
seg(PtrStr[i]^), // сегмент = сегменту области памяти, на которую
// указывает ptrstr[i]
ofs(PtrStr[i]^)+(j-1)*SizeOfReal // смещение = смещению этой же
// области памяти + количеству байт, предшествующих
// элементу с заданным индексом (j)
)
)
end; {AddrR}
{-----------------}
Function GetR(i,j: integer): real;
// Выдает значение вещественной переменной по индексу массива - контейнера
// и номеру элемента в этом массиве
begin
GetR := AddrR(i,j)^
// для того, чтобы получить значение самой переменной достаточно
// просто разыменовать указатель, поскольку он уже приведен к типу
// "указатель на Real" в функции
end; {GetR}
{-----------------}
Procedure PutR(i,j: integer; x: real);
// Помещает в позицию J массива-контейнера I значение X
begin
AddrR(i,j)^ := x
end; {PutR}
{-----------------}
begin {Main}
// Выделяем память для N массивов-контейнеров (каждый - на M элементов типа Real)
for i := 1 to N do begin
GetMem (PtrStr[i], M*SizeOfReal);
// и заполняем их случайными значениями...
for j := 1 to M do PutR(i, j, Random)
end;
// Ну, дальше я думаю все понятно?
s := 0;
for i := 1 to N do
for j := 1 to M do
s := s + GetR(i,j);
WriteLn(s / (N * M): 12:10);
end. {Main}
спасибо, буду разбираться...
оффтоп но перед этим отдохну... погодка чудная
еще вот вопрос по CSEG( Возвращает значение, хранящееся в регистре CS микропроцессора (в начале работы программы в регистре CS содержится сегмент начала кода программы). )...
что надо сделать в программе что б возращался не ноль?
Ты компилируешь в FPC? Тогда ничего не поможет:
спасибо...
вот есть еще такая программка... по ней пару вопросов...
type
ar=array[0..100000] of longint; //большой массив
Var
j:^char;
i:integer;
a: ^ar; //указатель на наш вектор.
Begin
readln;
read;
new(a); //прыжок по использованию памяти..
for i:=200 to 300 do begin
(*j:=Addr(i);*) j:=@i; //если какая-то разница?
writeln(j^);
end;
readln;
read;
DISPOSE(a); //не замечаем обратного прыжка... почему?
readln;
read;
End.
(*j:=Addr(i);*) j:=@i; //если какая-то разница?
и еще пару вопросов... по GETMEM (Р, SIZE), в чем в каких единицах задается SIZE и какие пороги у этого числа(максимум/минимум)?
зы под максимом подразумевается возможность проверки существующей свободной памяти
ззы про моксимум вопрос снят... кому интересно больше MAXAVAIL не получится...
добавленно
и последний вопрос на сегодня..
Varгде ошибка?
l:longint;
Begin
readln;
read;
l:=MAXAVAIL();
writeln(l);
readln;
read;
End.
Ты все время путаешь TP и FPC... Что для FPC (под Win32, я имею в виду) значит "существующая свободная память"? Физически свободная? Виртуальная?
и еще вопрос: в чем разница процедур NEW-DISPOSE и GETMEM-FREEMEM ?