PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Заполнить блок памяти?


Заполнить блок памяти?

Сообщений 1 страница 6 из 6

1

Нужно заполнить блок памяти последовательностью байтов.
Пробовал делать так
*SendYourTT=AllocateMemory(6): FillMemory(*SendYourTT,6,$FFFA1801FFF0)
*MyTT_ANSI=AllocateMemory(10): FillMemory(*MyTT_ANSI,10,$FFFA1800414E5349FFF0)

на вторую строку
[18:10:35] [COMPILER] Строка 93: Numerical overflow: too many digits.

Как можно "красиво" заполнить блок памяти любой последовательностью байтов?

0

2

Код:
*MyTT_ANSI=AllocateMemory(10)
CopyMemory(?m, *MyTT_ANSI, 10)

DataSection
  m:
  Data.u $FFF0
  Data.q $FFFA1800414E5349
EndDataSection

0

3

Я уже начал думать в этом направлении.
Пока остановился на таком варианте (пример)

Код:
SendYourTT:
Data.b 6, $FF, $FA, $18, $01, $FF, $F0

MyTT_ANSI:
Data.b 10,$FF,$FA,$18,$00,$41,$4E,$53,$49,$FF,$F0

Здесь первый байт - длина последовательности последующих байтов.
Т.к. данные уже и так в памяти - зачем переписывать их в другой блок? Логичнее обращаться к уже имеющемуся блоку
Например так:

Код:
If CompareMemory(*DataBuffer+pos2, ?SendYourTT+1, PeekB(?SendYourTT))
    SendNetworkData(goSocket, ?MyTT_ANSI+1, PeekB(?MyTT_ANSI))
    pos2=pos2+PeekB(?SendYourTT)
    pos1=pos2
EndIf

Видимое ограничение при такой структуре данных - длина данных не более 127 байт (чтобы старший бит байта длины не был 1).
Либо изменить структуру - сначала длина в формате Long (или Integer) потом данные побайтно. Тогда сдвиг начала данных не 1, а на 4.

Всплыл вопрос.
В связи с преобразованием при сравнении - как "красиво" сделать сравнение байта?
If PeekB(*DataBuffer+pos2)=$FF - не срабатывает
If PeekB(*DataBuffer+pos2)=255  - не срабатывает
If PeekB(*DataBuffer+pos2)=-1  - срабатывает но неэстэтично выглядит т.к. сразу непонятно что за байт ищется
И влом пересчитывать $FB, $FD и т.п. для разных случаев вручную.

0

4

Для таких случаев есть PeekA.

0

5

Пётр написал(а):

Для таких случаев есть PeekA.

Спасибо за подсказку
If PeekA(*DataBuffer+pos2)=$FF - срабатывает как надо

0

6

Но можно обойтись без PeekA если работать с памятью как с массивом.

Код:
Structure ArrA
  Arr.a[0]
EndStructure

*Buff.ArrA = ?MyTT_ANSI

For i=1 To *Buff\Arr[0]
  Debug *Buff\Arr[i]
Next i

DataSection
  MyTT_ANSI:
  Data.b 10,$FF,$FA,$18,$00,$41,$4E,$53,$49,$FF,$F0
EndDataSection

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Заполнить блок памяти?