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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> динамические структуры данных, указатели+массив..
сообщение
Сообщение #1


Человек
*****

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

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


Добрый день, помогите разобраться с указателями..
необходимо.Компонентам массива целых присваиваются сдвинутые на 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.

заранее благодарен...



Добавлено через 2 мин.
вроде все стало ясно... прошу прощение что побеспокоил..


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Человек
*****

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

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


собственно задача из <<той же серии>>...

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.

ее я точно сам не пойму sad.gif



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Что именно здесь непонятно? Почему в процедуре печатается ненулевое значение, а в основной программе - нули?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Человек
*****

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

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


Цитата(volvo @ 19.05.2007 19:13) *
Что именно здесь непонятно? Почему в процедуре печатается ненулевое значение, а в основной программе - нули?
это тоже и где можна прочитать про адресацию подробнее(желательно на русском)


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
где можна прочитать про адресацию подробнее

Здесь:
http://www.klax.tula.ru/~zet/themes/pointers.html
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Человек
*****

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

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


Цитата(volvo @ 19.05.2007 19:24) *
Здесь:
оттуда
const
	р: ^real = NIL;
begin
	if р = NIL then
		new(p);
	dispose(p);
	p := NIL;
end.
  
  
не работает(illegal character "'р'" ($F0)) sad.gif почему?

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






У тебя 2 символа p - в кириллице (в описании и в If ...)

Поменяй на латинские...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Человек
*****

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

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


Цитата(volvo @ 19.05.2007 22:24) *
Поменяй на латинские...
спасибо...
вечно попадаюсь на эту дурацкую ошибку...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Человек
*****

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

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


а вот еще одна задача оттуда...
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}	

FPC -не компилит, TP-вылетает вовремя исполнения...

добавленно
FAR говорит что необходим параметр какой-то
еще если пытаться запустить из TP то не получится...

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Свят-свят-свят... Что с тобой? Как это "не компилит"? blink.gif

Function AddrR(i,j: word): RealPoint;
begin
	AddrR := RealPoint(ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^)+(j-1)*SizeOfReal))
end;

и все smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Человек
*****

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

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


теперь работает(но с предупреждением)...
volvo, не мог бы ты добавить свои подробные коментарии... пожалуйста...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






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}	
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Человек
*****

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

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


спасибо, буду разбираться...

оффтоп но перед этим отдохну... погодка чудная


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Человек
*****

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

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


еще вот вопрос по CSEG( Возвращает значение, хранящееся в регистре CS микропроцессора (в начале работы программы в регистре CS содержится сегмент начала кода программы). )...
что надо сделать в программе что б возращался не ноль?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Ты компилируешь в FPC? Тогда ничего не поможет:
Цитата(rtl.pdf)
29.9.37 Cseg
Synopsis: Return code segment
Declaration: function Cseg : Word
Visibility: default
Description: CSeg returns the Code segment register. In Free Pascal, it returns always a zero, since Free Pascal is a 32 bit compiler.
Errors: None.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Человек
*****

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

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


спасибо...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Человек
*****

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

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


вот есть еще такая программка... по ней пару вопросов...
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.


заранее благодарен.


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Цитата
(*j:=Addr(i);*)	j:=@i;    //если какая-то разница?
Абсолютно никакой - Addr(X) и @X возвращают адрес объекта X... Вся разница - Addr это функция, а @ - оператор...

Цитата
//не замечаем обратного прыжка... почему?
Это ты о чем? Кстати, что ты думаешь будет делать твоя программа?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Человек
*****

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

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


Цитата(volvo @ 22.05.2007 16:38) *
Это ты о чем?

о виртуальной памяти... при создании массива ее использование возрастает почти в 3 раза, но при обратном действии ничего не происходит...

Цитата(volvo @ 22.05.2007 16:38) *
Кстати, что ты думаешь будет делать твоя программа?
печатать символы и пищеть :) (код 7)..


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Цитата
о виртуальной памяти...
А что, твоя программа сама управляет виртуальной памятью? Вообще-то этим должна заниматься OC, вот когда она решит освободить память, тогда и уменьшится размер...
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 21.04.2025 10:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name