FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Прямое чтение памяти

Участников: 2

Перейти вниз

Прямое чтение памяти Empty Прямое чтение памяти

Сообщение  justar Сб Июл 19, 2008 9:23 am

При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  ShenZN Сб Июл 19, 2008 11:21 am

При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?

Напиши пример кода, при выполнении которого выбивает такая ошибка

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Прямое чтение памяти

Сообщение  justar Сб Июл 19, 2008 12:38 pm

ShenZN пишет:
При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?

Напиши пример кода, при выполнении которого выбивает такая ошибка

Задача - сохранить область текстового экрана в буфере.
Вот первый вариант через указатели (переведён с сишной функции из книги Г. Шилдта):

SUB SaveVideo (start_x AS INTEGER, end_x AS INTEGER, start_y AS INTEGER, end_y AS INTEGER, buf_ptr AS INTEGER PTR)

CONST vmode AS INTEGER = &hB8000000
DIM i AS INTEGER, j AS INTEGER
DIM t AS BYTE PTR

FOR i = start_y TO end_y
FOR j = start_x TO end_x
t = vmode + j * 160 + i * 2
*buf_ptr = *t: buf_ptr += 1: t += 1
*buf_ptr = *t: buf_ptr += 1
*(t - 1) = 32
NEXT
NEXT

END SUB

Пишу тот же алгоритм с помощью POKE/PEEK:

SUB SaveVideo (start_x AS INTEGER, end_x AS INTEGER, start_y AS INTEGER, end_y AS INTEGER, buf_ptr AS INTEGER PTR)

CONST vmode AS INTEGER = &hB8000000
DIM i AS INTEGER, j AS INTEGER
DIM t AS INTEGER
DIM b AS BYTE

FOR i = 1 TO 10
FOR j = 1 TO 10
t = vmode + j * 160 + i * 2
b = PEEK (t): POKE buf_ptr, b: buf_ptr += 1: t += 1
b = PEEK (t): POKE buf_ptr, b: buf_ptr += 1
POKE t - 1, 32
NEXT
NEXT

END SUB

Вызывает ту же самую ошибку...
Ось WinXP SP2, компилятор 0.18.2

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  justar Сб Июл 19, 2008 12:42 pm

[quote="ShenZN"]
При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?

Кстати, если не тяжело, посмотри моё сообщение с темой "Сохранение текстового экрана" в разделе "Общее" - там я пытался сделать тоже самое, но без чтения из видеопамяти, а через функцию SCREEN() - данные в буфер помещаются, но какие-то неправильные. И ещё одно заметил - если после вызова реализованной там SaveVideo поставить SLEEP, то прога не останавливается в ожидании нажатия клавиши, а мгновенно завершается, как будто слипа нет вовсе... Что я делаю не так?

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Point

Сообщение  ShenZN Сб Июл 19, 2008 1:48 pm

Если не сложно напиши пример использования своей функции

Вот простой пример использования указателей наподобие твоей функции

Код:
sub SubPoint (x as integer ptr)
*x=2   
end sub

dim varX as integer ptr = 1

cls

print varx
SubPoint(@varx)
print varx

sleep

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Прямое чтение памяти

Сообщение  justar Сб Июл 19, 2008 9:16 pm

DIM p AS UINTEGER PTR
p = CAST (UINTEGER PTR, CALLOCATE ((end_x - start_x + 1) * (end_y - start_y + 1)))
IF p = 0 THEN ERROR 4
SaveVideo (start_x, end_x, start_y, end_y, p)
...
RestoreVideo (start_x, end_x, start_y, end_y, p)
DEALLOCATE (p)

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  ShenZN Вс Июл 20, 2008 2:08 pm

В твоей функции присутствует ошибка из - за переменной t
Если переменная объявлена так DIM t as byte ptr - это не значит что это уже указатель, она может стать указателем если ей присвоить адрес.
Примеры

Код:
dim x1 as integer=1
dim ptr1 as integer ptr 'Подобие переменной t
dim ptr2 as integer ptr
ptr2=@x1
*ptr2=*ptr1  'Вызовет ошибку, так как ptr1 еще не указатель и не хранит в себе адрес, то есть
                    обращается в никуда 

Вот пример без ошибок:

Код:
dim x1 as integer=1
dim x2 as integer=3
dim ptr1 as integer ptr
dim ptr2 as integer ptr
ptr1=@x1
ptr2=@x2
*ptr1=*ptr2  ' Аналог операции x1=x2 
print *ptr1    ' Выводит значение 3

Поэтому такие строчки как *buf_ptr = *t и *(t - 1) = 32 не правильные

Разберись со всеми тонкостями работы указателей и тогда у тебя получиться правильно написать функции. Удачи! Very Happy

PS
К прилагаемому коду желательно писать комментарии чтобы помочь быстрее понять то что именно хотел сделать той или иной строчкой.

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Прямое чтение памяти

Сообщение  justar Вс Июл 20, 2008 3:10 pm

Так я же явно присваиваю переменной t начальное значение адреса:

t = vmode + j * 160 + i * 2

Или FB, в отличии от Си, требует присваивание значения указателю именно операцией взятия адреса (@)?

И почему такая же ошибка происходит при чтении с помощью PEEK?

Почему в результате программы:

DIM i AS INTEGER
DIM buf_ptr AS INTEGER PTR

LOCATE 5, 5
PRINT "ANDREY"

buf_ptr = CALLOCATE (12)
FOR i = 0 TO 5
*buf_ptr = SCREEN (5, 5 + i, 0) 'считать код символа и поместить его в буфер
buf_ptr += 1
*buf_ptr = SCREEN (5, 5 + i, 1) 'считать атрибут символа и поместить его в буфер
buf_ptr += 1
NEXT

в буфере по адресу buf_ptr содержатся одни нули?
На Си этот алгоритм сохранения части экрана работает, в чём отличие использования указателей у FB от Си?

Сорри за отсутствие комментариев - впредь буду аккуратнее.

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Point

Сообщение  ShenZN Пн Июл 21, 2008 9:16 am

1) Что это за адрес такой?
t = vmode + j * 160 + i * 2

2) Peek и оператор * являются аналогами, но рекомендуется использовать именно *. Поэтому происходит одна и та же ошибка.

3) У меня в буфере не одни нули? Как ты обращаешся к памяти?

Вот один пример:

Код:
DIM p AS INTEGER PTR
p = cAllocate(LEN(INTEGER) * 2)  ' Выделяем память на три ячейки размером INTEGER (32 bit)
p[0]=1  ' Присваиваем каждой ячейке значение 
p[1]=2
p[2]=3
' По сути p это указатель на первую ячейку выделенной памяти
print *p  ' В чем мы и убеждаемся так как выводиться 1 (p[0]=1)
p=p+1    ' Далее увеличиваем адрес на 1, тем самым переходим на адрес где хранится значение второй ячейки
print *p  ' Вывод 2
p=p+1
print *p  ' Вывод 3
'p=p+1    ' Закомментированна  так как вышли за пределы зарезервированной памяти
'print *p  ' Выводит значение хранящееся по этому адресу (к которому не должны обращаться) , что может вызвать ошибки

p[0]=0    'Теперь присвоим первой ячейке 0
*p=*p+5 ' Увеличиваем значение хранящееся по адресу p, а именно по адресу ячейки p[0]
print p[0] ' Вывод 5
sleep

4) Разницы только лишь в разных операторах обращения к памяти, а суть остается той же.

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Прямое чтение памяти

Сообщение  justar Вт Июл 22, 2008 9:43 pm

1) Адрес ячейки видеопамяти. vmode - начальный адрес видеопамяти (&hB8000000).
Этот расчёт адреса символа я взял из книги Г. Шилдта "Си для профессиональных программистов".

2) Так ПОЧЕМУ она происходит?

3) Так я же написал свою программу... В ней есть ошибка или нет?
Твой пример книжный, учебный, но почему моя программа не работает он не объясняет

4)Так в чём суть-то?

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  ShenZN Ср Июл 23, 2008 1:46 pm

Я уже писал:
Поэтому такие строчки как *buf_ptr = *t и *(t - 1) = 32 не правильные

Если их закомментировать функция уже не будет выбивать ошибку.

Теперь разберем эти строчки:

*buf_ptr = *t
То есть ячейке по адресу хранящемуся в buf_ptr присвоить значение хранящееся по адресу t. Но t не содержит правильный адрес.

Код:
dim x as integer = 1
dim t as integer  ptr
print x
print @x

t = 1245064    ' адрес переменной x (на другом компьютере он может отличаться!)
print *t          '  выводит 1 - без ошибок

t=&hB8000000 ' начальный адрес видеопамяти
print *t          ' Выбивает ошибку

sleep

Из этого примера можно сделать вывод, что адрес хранящийся в переменной t или не правильный или к нему закрыт доступ или еще что-то вызывающее ошибку Sad
Затруднительно сказать это глюк FB или что-то другое. В такой ситуации, думаю, наилучшим вариантом будет использование функции screen() нежели прямой доступ к видеопамяти.

Строчка *(t-1) = 32 не правильна сразу по двум причинам: t - это не указатель, а вторая то, что этим действием (t-1) ты выходишь за границы выделенной памяти под переменную t. Такая ошибка может привести к неожиданным результатам и неправильной работе программы при этом может даже не выбить никакой ошибки от Microsoft.

Удачи
Very Happy Very Happy Very Happy

PS
На своих примерах я хотел показать суть работы указателей, но похо же, что ты на них мало обращал внимание. Sad

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  justar Ср Июл 23, 2008 10:36 pm

ShenZN пишет:Я уже писал:
Поэтому такие строчки как *buf_ptr = *t и *(t - 1) = 32 не правильные

Если их закомментировать функция уже не будет выбивать ошибку.
[/quote]

Но и перестанет сохранять данные экрана. И зачем тогда она нужна? ;-)


Теперь разберем эти строчки:

Давай - именно этого я и хочу...


*buf_ptr = *t
То есть ячейке по адресу хранящемуся в buf_ptr присвоить значение хранящееся по адресу t. Но t не содержит правильный адрес.

С тем, что t содержит адрес согласен? Правильный он (т.е. является действительно адресом нужной мне ячейки видео памяти, или не правильный - т.е. это адрес какой-то другой ячейки памяти - сейчас это вопрос второй. Главный вопрос - почему при обращении к произвольной ячейке памяти код, созданный fbc вылеиает с системной ошибкой!


Из этого примера можно сделать вывод, что адрес хранящийся в переменной t или не правильный или к нему закрыт доступ или еще что-то вызывающее ошибку Sad

Ответ, достойный "специалиста" :'( Не обижайся, но то, что этот код почему-то вызывает ошибку очевидно и мне. Но вот вопрос: почему ? &hB8000000 по техдокументации IBM-клонов является началом видеобуфера текстового режима для видео карт EGA и старше. Только у монохромного и CGA текстовой видео-режим начинается с адреса &hB0000000, но у меня не настольео древняя машина ;-) Так в чём ошибка???
Или FB не позволяет читать [/u] из видеопамяти? А, прости, с каких (сенсоред)?


Затруднительно сказать это глюк FB или что-то другое.

Жаль, что затруднительно - ведь это суть того, что я хочу для себя уяснить... :'(


В такой ситуации, думаю, наилучшим вариантом будет использование функции screen() нежели прямой доступ к видеопамяти.

Вот ведь в этом я с тобой 100% согласен, но... первоначально я написал именно через screen():

DIM i AS INTEGER
DIM buf_ptr AS INTEGER PTR

LOCATE 5, 5
PRINT "ANDREY"

buf_ptr = CALLOCATE (12)
FOR i = 0 TO 5
*buf_ptr = SCREEN (5, 5 + i, 0) 'считать код символа и поместить его в буфер
buf_ptr += 1
*buf_ptr = SCREEN (5, 5 + i, 1) 'считать атрибут символа и поместить его в буфер
buf_ptr += 1
NEXT

В памяти по адресу buf_ptr находится отнюдь не "ANDREY"...


Строчка *(t-1) = 32 не правильна сразу по двум причинам: t - это не указатель, а вторая то, что этим действием (t-1) ты выходишь за границы выделенной памяти под переменную t.

t таки содержит адрес. И он явно не <0 и не попадает в системную область. Значит [b]должено
по этому адресу содержаться хоть какое-то значение и оно должно считываться - в чём я не прав?

t-1 - тоже адрес и по нему всегда что-то хранится (что именно сейчас не важно) и это что-то должно считываться...


Такая ошибка может привести к неожиданным результатам и неправильной работе программы

Ну это очевидно. Вопрос - почему? Подход принципиально неправильный? Допустим... И тут я спрашиваю гуру - так как же считать заданную часть консольного экрана? Через SCREEN() считывается непонятно что, но только не то, что на экране... При прямом обращении к видеопамяти получаем ошибку... А третьего, вроде, и не дано...


Удачи

Спасибо, но хоьелось бы получить более конструктивный совет ;-)


PS
На своих примерах я хотел показать суть работы указателей, но похо же, что ты на них мало обращал внимание. Sad

Я на них обратил внимание: классические примеры, я такое давно освоил при изучении Си - это было ещё... лет 10 назад. И все приводимые мною здесь процедуры на Си реально работвют. Почему же они не работают на FB - вот вопрос? И второй - ладно, пусть не работают, но какими собственными средствами FB их заменить? Теоретически это SCREEN (), но практически у меня получается, что *buf_ptr=screen(y,x) помещает в ячейку по адресу в buf_ptr отнюдь не код символа, находящегося в координатах (x,y)... Только поэтому я и начал читать прямо из видеопамяти...

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  justar Чт Июл 24, 2008 8:47 am


DIM i AS INTEGER
DIM buf_ptr AS INTEGER PTR

LOCATE 5, 5
PRINT "ANDREY"

buf_ptr = CALLOCATE (12)
FOR i = 0 TO 5
*buf_ptr = SCREEN (5, 5 + i, 0) 'считать код символа и поместить его в буфер
buf_ptr += 1
*buf_ptr = SCREEN (5, 5 + i, 1) 'считать атрибут символа и поместить его в буфер
buf_ptr += 1
NEXT

В памяти по адресу buf_ptr находится отнюдь не "ANDREY"...

Упс, сам нашёл свою ошибку - buf_ptr после выхода из цикла уже не тот ;-)
Тут сохраняется всё правильно...

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  ShenZN Чт Июл 24, 2008 11:47 am

Упс, сам нашёл свою ошибку - buf_ptr после выхода из цикла уже не тот ;-)
Тут сохраняется всё правильно...

Теперь я ничего не пойму. Все уже работает?

Вот взял с первой темы твои функции и пример их использования:

Код:
SUB SaveVideo (start_x AS INTEGER, end_x AS INTEGER, start_y AS INTEGER, end_y AS INTEGER, buf_ptr AS INTEGER PTR)

DIM row AS INTEGER, colum AS INTEGER

FOR row = start_y TO end_y
FOR colum = start_x TO end_x
*buf_ptr = SCREEN (row, colum): buf_ptr += 1
*buf_ptr = SCREEN (row, colum, 1): buf_ptr += 1
LOCATE row, colum: PRINT " ";
NEXT
NEXT

END SUB

SUB RestoreVideo (start_x AS INTEGER, end_x AS INTEGER, start_y AS INTEGER, end_y AS INTEGER, buf_ptr AS INTEGER PTR)

DIM row AS INTEGER, colum AS INTEGER
DIM char AS INTEGER, attribute AS INTEGER
DIM background AS INTEGER
DIM cellcolor AS INTEGER

FOR row = start_y TO end_y
FOR colum = start_x TO end_x
char = *buf_ptr: buf_ptr += 1
attribute = *buf_ptr: buf_ptr += 1
background = attribute SHR 4
cellcolor = attribute AND &hF
LOCATE row, colum: COLOR cellcolor, background: PRINT CHR$ (CAST (BYTE, char));
NEXT
NEXT

END SUB

'

print "shen"
DIM p AS UINTEGER PTR
p = CAST (UINTEGER PTR, CALLOCATE ((4 - 1 + 1) * (1 - 1 + 1)))
IF p = 0 THEN ERROR 4
SaveVideo (1, 4, 1, 1, p)


sleep
cls
'...
RestoreVideo (1, 4, 1, 1, p)
DEALLOCATE (p)
sleep

Все работает и ни каких ошибок нет Question Exclamation

Почему FB не хочет читать ячейку по адресу &hB8000000 пока не понятно Crying or Very sad

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Программа на С

Сообщение  ShenZN Пт Июл 25, 2008 12:25 pm

Аналогичная программа на С работает так же как и на FreeBasic:

Код:
#include <conio.h>

void main()
{

int *ptr_x;
ptr_x=0xB8000000;
printf("%i",*ptr_x);


Question Question Question

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  justar Сб Июл 26, 2008 7:46 pm

[quote="ShenZN"]
Упс, сам нашёл свою ошибку - buf_ptr после выхода из цикла уже не тот ;-)
Теперь я ничего не пойму. Все уже работает?
Вот взял с первой темы твои функции и пример их использования:

Работает упрощённый пример. А первоначально приводимые функции таки не работают: если сохранить часть экрана с помощью SaveVideo, то в буфере таки не то, что ожидается - среди первых байт, восстанавливаемых RestoreVideo откуда-то берётся 0, в результате имеем глюк программы...

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Re: Прямое чтение памяти

Сообщение  justar Вс Июл 27, 2008 7:58 am

ShenZN пишет:
Упс, сам нашёл свою ошибку - buf_ptr после выхода из цикла уже не тот ;-)
Тут сохраняется всё правильно...

Теперь я ничего не пойму. Все уже работает?

Вот взял с первой темы твои функции и пример их использования:

Код:
SUB SaveVideo (start_x AS INTEGER, end_x AS INTEGER, start_y AS INTEGER, end_y AS INTEGER, buf_ptr AS INTEGER PTR)

DIM row AS INTEGER, colum AS INTEGER

FOR row = start_y TO end_y
FOR colum = start_x TO end_x
*buf_ptr = SCREEN (row, colum): buf_ptr += 1
*buf_ptr = SCREEN (row, colum, 1): buf_ptr += 1
LOCATE row, colum: PRINT " ";
NEXT
NEXT

END SUB

SUB RestoreVideo (start_x AS INTEGER, end_x AS INTEGER, start_y AS INTEGER, end_y AS INTEGER, buf_ptr AS INTEGER PTR)

DIM row AS INTEGER, colum AS INTEGER
DIM char AS INTEGER, attribute AS INTEGER
DIM background AS INTEGER
DIM cellcolor AS INTEGER

FOR row = start_y TO end_y
FOR colum = start_x TO end_x
char = *buf_ptr: buf_ptr += 1
attribute = *buf_ptr: buf_ptr += 1
background = attribute SHR 4
cellcolor = attribute AND &hF
LOCATE row, colum: COLOR cellcolor, background: PRINT CHR$ (CAST (BYTE, char));
NEXT
NEXT

END SUB

'

print "shen"
DIM p AS UINTEGER PTR
p = CAST (UINTEGER PTR, CALLOCATE ((4 - 1 + 1) * (1 - 1 + 1)))
IF p = 0 THEN ERROR 4
SaveVideo (1, 4, 1, 1, p)


sleep
cls
'...
RestoreVideo (1, 4, 1, 1, p)
DEALLOCATE (p)
sleep

Все работает и ни каких ошибок нет Question Exclamation

Странно, что у тебя работает ;-) Какая версия компилятора? У меня заработало только после того, как в заголовках процедуд перед buf_ptr добавил префиксы BYVAL - получается, что по умолдчанию FB передаёт в процедуру не значение, а указатель на переменную и оная переменная по выходу из процедуры меняет своё значение. Т.е. процедура RestoreVideo получала адрес отнюдь не буфера, куда сохпранила данные SaveVideo. Вот что значит отсутсвие полноценной документации на русском... :-(

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Point

Сообщение  ShenZN Пн Июл 28, 2008 2:31 pm

Странно, что у тебя работает ;-) Какая версия компилятора? У меня заработало только после того, как в заголовках процедуд перед buf_ptr добавил префиксы BYVAL - получается, что по умолдчанию FB передаёт в процедуру не значение, а указатель на переменную и оная переменная по выходу из процедуры меняет своё значение. Т.е. процедура RestoreVideo получала адрес отнюдь не буфера, куда сохпранила данные SaveVideo.

Я использую компилятор версии 0.18.5

Так же в help ( 2008/04/28 ) написано, что

In the -lang fb dialect, ByVal is the default parameter passing convention for all built-in types except String; String and user-defined Types are passed ByRef by default.

Что в переводе означает: В диалекте -lang fb по умолчанию параметры передаются по значению (ByVal) кроме String и пользовательских типов (Types), которые по умолчанию передаются по ссылке (Byref).

Я так же попробовал компилировать пример твоих функций и примеры (показывающие работу ByVal и ByRef) из хелпа в компиляторе 0.18.1. Они у меня работают аналогично как и в версии 0.18.5.
Exclamation Question

PS
Вот что значит отсутсвие полноценной документации на русском... :-(
Полностью согласен, пора с этим что-то делать.

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Прямое чтение памяти Empty Прямое чтение памяти

Сообщение  justar Вт Июл 29, 2008 7:40 pm

INTEGER PTR - это ведь не пользовательский тип и не стринг. Но тоже передаётся по ссылке...
В общем, со всеми проблемами худо бедно разобрался. Спасибо.


Вот что значит отсутсвие полноценной документации на русском.

Полностью согласен. Надо что-то с этим делать

Надо. Был бы тут грамотный переводчик - проблем бы не было. Но ведь нет - увы. Тогда остайтся одно - писать её совместными усилиями форумчан.

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения