Прямое чтение памяти
Участников: 2
Страница 1 из 1
Прямое чтение памяти
При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?
Напиши пример кода, при выполнении которого выбивает такая ошибка
Прямое чтение памяти
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
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
[quote="ShenZN"]
Кстати, если не тяжело, посмотри моё сообщение с темой "Сохранение текстового экрана" в разделе "Общее" - там я пытался сделать тоже самое, но без чтения из видеопамяти, а через функцию SCREEN() - данные в буфер помещаются, но какие-то неправильные. И ещё одно заметил - если после вызова реализованной там SaveVideo поставить SLEEP, то прога не останавливается в ожидании нажатия клавиши, а мгновенно завершается, как будто слипа нет вовсе... Что я делаю не так?
При попытке чтения из памяти (и PEEKом, и через указатели) прога вылетает с ошибкой и приглашением в Микрософт ;-) Почему?
Кстати, если не тяжело, посмотри моё сообщение с темой "Сохранение текстового экрана" в разделе "Общее" - там я пытался сделать тоже самое, но без чтения из видеопамяти, а через функцию SCREEN() - данные в буфер помещаются, но какие-то неправильные. И ещё одно заметил - если после вызова реализованной там SaveVideo поставить SLEEP, то прога не останавливается в ожидании нажатия клавиши, а мгновенно завершается, как будто слипа нет вовсе... Что я делаю не так?
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Point
Если не сложно напиши пример использования своей функции
Вот простой пример использования указателей наподобие твоей функции
Вот простой пример использования указателей наподобие твоей функции
- Код:
sub SubPoint (x as integer ptr)
*x=2
end sub
dim varX as integer ptr = 1
cls
print varx
SubPoint(@varx)
print varx
sleep
Прямое чтение памяти
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)
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
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
В твоей функции присутствует ошибка из - за переменной t
Если переменная объявлена так DIM t as byte ptr - это не значит что это уже указатель, она может стать указателем если ей присвоить адрес.
Примеры
Вот пример без ошибок:
Поэтому такие строчки как *buf_ptr = *t и *(t - 1) = 32 не правильные
Разберись со всеми тонкостями работы указателей и тогда у тебя получиться правильно написать функции. Удачи!
PS
К прилагаемому коду желательно писать комментарии чтобы помочь быстрее понять то что именно хотел сделать той или иной строчкой.
Если переменная объявлена так 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 не правильные
Разберись со всеми тонкостями работы указателей и тогда у тебя получиться правильно написать функции. Удачи!
PS
К прилагаемому коду желательно писать комментарии чтобы помочь быстрее понять то что именно хотел сделать той или иной строчкой.
Прямое чтение памяти
Так я же явно присваиваю переменной 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 от Си?
Сорри за отсутствие комментариев - впредь буду аккуратнее.
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
Откуда : Кишинёв, Республика Молдоа
Point
1) Что это за адрес такой?
t = vmode + j * 160 + i * 2
2) Peek и оператор * являются аналогами, но рекомендуется использовать именно *. Поэтому происходит одна и та же ошибка.
3) У меня в буфере не одни нули? Как ты обращаешся к памяти?
Вот один пример:
4) Разницы только лишь в разных операторах обращения к памяти, а суть остается той же.
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) Разницы только лишь в разных операторах обращения к памяти, а суть остается той же.
Прямое чтение памяти
1) Адрес ячейки видеопамяти. vmode - начальный адрес видеопамяти (&hB8000000).
Этот расчёт адреса символа я взял из книги Г. Шилдта "Си для профессиональных программистов".
2) Так ПОЧЕМУ она происходит?
3) Так я же написал свою программу... В ней есть ошибка или нет?
Твой пример книжный, учебный, но почему моя программа не работает он не объясняет
4)Так в чём суть-то?
Этот расчёт адреса символа я взял из книги Г. Шилдта "Си для профессиональных программистов".
2) Так ПОЧЕМУ она происходит?
3) Так я же написал свою программу... В ней есть ошибка или нет?
Твой пример книжный, учебный, но почему моя программа не работает он не объясняет
4)Так в чём суть-то?
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
Я уже писал:
Если их закомментировать функция уже не будет выбивать ошибку.
Теперь разберем эти строчки:
*buf_ptr = *t
То есть ячейке по адресу хранящемуся в buf_ptr присвоить значение хранящееся по адресу t. Но t не содержит правильный адрес.
Из этого примера можно сделать вывод, что адрес хранящийся в переменной t или не правильный или к нему закрыт доступ или еще что-то вызывающее ошибку
Затруднительно сказать это глюк FB или что-то другое. В такой ситуации, думаю, наилучшим вариантом будет использование функции screen() нежели прямой доступ к видеопамяти.
Строчка *(t-1) = 32 не правильна сразу по двум причинам: t - это не указатель, а вторая то, что этим действием (t-1) ты выходишь за границы выделенной памяти под переменную t. Такая ошибка может привести к неожиданным результатам и неправильной работе программы при этом может даже не выбить никакой ошибки от Microsoft.
Удачи
PS
На своих примерах я хотел показать суть работы указателей, но похо же, что ты на них мало обращал внимание.
Поэтому такие строчки как *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 или не правильный или к нему закрыт доступ или еще что-то вызывающее ошибку
Затруднительно сказать это глюк FB или что-то другое. В такой ситуации, думаю, наилучшим вариантом будет использование функции screen() нежели прямой доступ к видеопамяти.
Строчка *(t-1) = 32 не правильна сразу по двум причинам: t - это не указатель, а вторая то, что этим действием (t-1) ты выходишь за границы выделенной памяти под переменную t. Такая ошибка может привести к неожиданным результатам и неправильной работе программы при этом может даже не выбить никакой ошибки от Microsoft.
Удачи
PS
На своих примерах я хотел показать суть работы указателей, но похо же, что ты на них мало обращал внимание.
Re: Прямое чтение памяти
ShenZN пишет:Я уже писал:
Поэтому такие строчки как *buf_ptr = *t и *(t - 1) = 32 не правильные
Если их закомментировать функция уже не будет выбивать ошибку.
[/quote]
Но и перестанет сохранять данные экрана. И зачем тогда она нужна? ;-)
Теперь разберем эти строчки:
Давай - именно этого я и хочу...
*buf_ptr = *t
То есть ячейке по адресу хранящемуся в buf_ptr присвоить значение хранящееся по адресу t. Но t не содержит правильный адрес.
С тем, что t содержит адрес согласен? Правильный он (т.е. является действительно адресом нужной мне ячейки видео памяти, или не правильный - т.е. это адрес какой-то другой ячейки памяти - сейчас это вопрос второй. Главный вопрос - почему при обращении к произвольной ячейке памяти код, созданный fbc вылеиает с системной ошибкой!
Из этого примера можно сделать вывод, что адрес хранящийся в переменной t или не правильный или к нему закрыт доступ или еще что-то вызывающее ошибку
Ответ, достойный "специалиста" :'( Не обижайся, но то, что этот код почему-то вызывает ошибку очевидно и мне. Но вот вопрос: почему ? &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
На своих примерах я хотел показать суть работы указателей, но похо же, что ты на них мало обращал внимание.
Я на них обратил внимание: классические примеры, я такое давно освоил при изучении Си - это было ещё... лет 10 назад. И все приводимые мною здесь процедуры на Си реально работвют. Почему же они не работают на FB - вот вопрос? И второй - ладно, пусть не работают, но какими собственными средствами FB их заменить? Теоретически это SCREEN (), но практически у меня получается, что *buf_ptr=screen(y,x) помещает в ячейку по адресу в buf_ptr отнюдь не код символа, находящегося в координатах (x,y)... Только поэтому я и начал читать прямо из видеопамяти...
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
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
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
Упс, сам нашёл свою ошибку - 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
Все работает и ни каких ошибок нет
Почему FB не хочет читать ячейку по адресу &hB8000000 пока не понятно
Программа на С
Аналогичная программа на С работает так же как и на FreeBasic:
- Код:
#include <conio.h>
void main()
{
int *ptr_x;
ptr_x=0xB8000000;
printf("%i",*ptr_x);
}
Re: Прямое чтение памяти
[quote="ShenZN"]
Работает упрощённый пример. А первоначально приводимые функции таки не работают: если сохранить часть экрана с помощью SaveVideo, то в буфере таки не то, что ожидается - среди первых байт, восстанавливаемых RestoreVideo откуда-то берётся 0, в результате имеем глюк программы...
Упс, сам нашёл свою ошибку - buf_ptr после выхода из цикла уже не тот ;-)
Теперь я ничего не пойму. Все уже работает?
Вот взял с первой темы твои функции и пример их использования:
Работает упрощённый пример. А первоначально приводимые функции таки не работают: если сохранить часть экрана с помощью SaveVideo, то в буфере таки не то, что ожидается - среди первых байт, восстанавливаемых RestoreVideo откуда-то берётся 0, в результате имеем глюк программы...
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Re: Прямое чтение памяти
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
Все работает и ни каких ошибок нет
Странно, что у тебя работает ;-) Какая версия компилятора? У меня заработало только после того, как в заголовках процедуд перед buf_ptr добавил префиксы BYVAL - получается, что по умолдчанию FB передаёт в процедуру не значение, а указатель на переменную и оная переменная по выходу из процедуры меняет своё значение. Т.е. процедура RestoreVideo получала адрес отнюдь не буфера, куда сохпранила данные SaveVideo. Вот что значит отсутсвие полноценной документации на русском... :-(
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Point
Странно, что у тебя работает ;-) Какая версия компилятора? У меня заработало только после того, как в заголовках процедуд перед 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.
PS
Полностью согласен, пора с этим что-то делать.Вот что значит отсутсвие полноценной документации на русском... :-(
Прямое чтение памяти
INTEGER PTR - это ведь не пользовательский тип и не стринг. Но тоже передаётся по ссылке...
В общем, со всеми проблемами худо бедно разобрался. Спасибо.
Надо. Был бы тут грамотный переводчик - проблем бы не было. Но ведь нет - увы. Тогда остайтся одно - писать её совместными усилиями форумчан.
В общем, со всеми проблемами худо бедно разобрался. Спасибо.
Вот что значит отсутсвие полноценной документации на русском.
Полностью согласен. Надо что-то с этим делать
Надо. Был бы тут грамотный переводчик - проблем бы не было. Но ведь нет - увы. Тогда остайтся одно - писать её совместными усилиями форумчан.
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|