Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 | 3 |

 

  Вопрос: Копия строки ? Добавлено: 22.12.08 22:17  

Автор вопроса:  Lapex

Ответить

  Ответы Всего ответов: 37  

Номер ответа: 16
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #16 Добавлено: 26.12.08 12:51
Lapex пишет:
Ух ты, а ведь действительно LEN врет.
Спасибо!


Угу, врут как всегда кривые руки - "погроммистов", а не Len

Ответить

Номер ответа: 17
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #17 Добавлено: 26.12.08 13:07
  1. #Compile Exe
  2. #Dim All
  3. #Include "win32api.inc"
  4.  
  5.  
  6. Function PBMain () As Long
  7.     Local hHeap As Dword
  8.     Local pszStr As Asciiz Ptr
  9.     Local szBuffer As Dword
  10.     szBuffer = 44444444  
  11.     hHeap=GetProcessHeap()
  12.     pszStr=HeapAlloc(hHeap, %HEAP_ZERO_MEMORY, szBuffer)
  13.     FillMemory pszStr, szBuffer, Asc("A")'ìíîãà áóêàâ
  14.     MsgBox Str$(Len (@pszStr))
  15.   
  16. End Function
  17.                   


У меня на этом коде выдается 16777216. Максимальный размер Asciiz строки, как и должно быть

Ответить

Номер ответа: 18
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #18 Добавлено: 26.12.08 13:23
Станно, а у меня - 33554432.

Ответить

Номер ответа: 19
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #19 Добавлено: 26.12.08 13:36
не знаю у кого руки кривее, но и у меня на этом коде выдается 33554432.

Ответить

Номер ответа: 20
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #20 Добавлено: 26.12.08 14:03
Еще раз проверил этот код.

Результаты:

  PB 8.03: 16777216
  PB 9.00: 33554432

Ответить

Номер ответа: 21
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #21 Добавлено: 26.12.08 14:06
Такая же фигня.

Ответить

Номер ответа: 22
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #22 Добавлено: 26.12.08 14:16
Хорошо, ну допустим это глюк PB 9.0 или последствия некорректного "лечения" от жадности и правильный результат LEN должен быть: 16777216, но тогда почему lstrlen возвращает: 44444444?

Ответить

Номер ответа: 23
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #23 Добавлено: 26.12.08 14:19
Насчет 9 пока не могу сказать, у меня на работе 8.03 стоит.
Какие хидеры подключаете?

Ответить

Номер ответа: 24
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #24 Добавлено: 26.12.08 14:47
В настройках PB все по умолчанию, подключается только "win32api.inc".

Да, похоже ты прав, LEN работает корректно, проблемма похоже в глюке с типом ASCIIZ.
А то, что lstrlen возвратил 44444444 - это наверное размер выделенного буфера, а не строки.
Прверял наличие символа в позиции после 16777216 (для PB 8.03)- пусто.

Ответить

Номер ответа: 25
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #25 Добавлено: 26.12.08 14:55
Lapex пишет:
В настройках PB все по умолчанию, подключается только "win32api.inc".


А хидеры от Jose Roca случайно не ставил?

Ответить

Номер ответа: 26
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #26 Добавлено: 26.12.08 14:57
А то, что lstrlen возвратил 44444444 - это наверное размер выделенного буфера, а не строки.
Нет.

Прверял наличие символа в позиции после 16777216 (для PB 8.03)- пусто.
Тоже нет. Как ты проверял?

  Len встроенная ф-ция, нутро не посмотреть, но когда выделяешь память под строку и заполняешь данными, то ожидаешь, что Len будет внутри себя делать инкремент счетчика для ASCIIZ пока не наткнется на ноль.И она так и делает до тех пор пока не сочтет, что для этого типа данных превышен размер который считается максимальным, да еще и зависит от версии PB.
Хотя вообще-то размер строк может быть ограничен доступной памятью в системе. В топку такую ф-цию.

Ответить

Номер ответа: 27
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #27 Добавлено: 26.12.08 14:58
Нет, не ставил - свежеустановленный PB 9.0.

Ответить

Номер ответа: 28
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #28 Добавлено: 26.12.08 15:01
Как ты проверял?
  1. MSGBOX MID$(@pszStr, 16777216, 1) ' есть символ
  2. MSGBOX MID$(@pszStr, 16777217, 1) ' пусто

Ответить

Номер ответа: 29
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #29 Добавлено: 26.12.08 15:05
Значит, все встроенные ф-ци строк ведут себя так. На самом деле по этому офсету адреса символ есть.

Ответить

Номер ответа: 30
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #30 Добавлено: 26.12.08 15:20
  1.  
  2. MSGBOX MID$(@pszStr, 33554432 , 1) ' есть символ
  3. LOCAL pszStr2 AS ASCIIZ PTR
  4. pszStr2= pszStr + 44444443
  5. MSGBOX MID$(@pszStr2, 1 , 1) ' последний символ

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам