Страница: 1 | 2 | 3 |
Вопрос: Копия строки ?
Добавлено: 22.12.08 22:17
Автор вопроса: Lapex
Доброе время суток!
Имеется функция, на вход которой передается указатель на строку ASCIIZ. Функция должна произвести манипуляции со строкой и вернуть указатель на измененную строку, при этом оригинальная строка не должна измениться.
Я так понимаю, чтобы не портить оригинальную строку - мне нужно создать копию строки и работать с этой копией, но к сожалению я не доконца понимаю механизм создания копии строки в памяти.
LOCAL lpDest AS ASCIIZ PTR
LOCAL nLen AS LONG
nLen = LEN(@lpSource) + 1
CopyMemory BYVAL lpDest, BYVAL lpSource, BYVAL nLen ' ???
...
Этот код вызывает ошибку: "Память не может быть Writetten".
Возможно моя идея изначально не верна, пожалуйста подскажите, что нужно для моего случая.
Ответы
Всего ответов: 37
Номер ответа: 1
Автор ответа:
Father
Вопросов: 0
Ответов: 159
Профиль | | #1
Добавлено: 22.12.08 23:14
Идея верна, только память в байтах выделить надо.
Номер ответа: 2
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #2
Добавлено: 22.12.08 23:33
Спасибо огромное! То, что нужно!
Номер ответа: 3
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #3
Добавлено: 23.12.08 12:56
CopyMemory - очень медленная API функция. Для копирования строк лучше использовать операторы PEEK и POKE, они сразу компилируюся в ассемблерные инструкции и работают намного быстрее.
Номер ответа: 4
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #4
Добавлено: 23.12.08 15:52
Спасибо!
Заменил:
на:
Работает!
Номер ответа: 5
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #5
Добавлено: 25.12.08 09:52
У меня еще один вопрос, по копированию строки в памяти.
При копировании ASCIIZ-строк большой длины (больше 32Мб)- копия строки обрезается до 32Мб (33554432 байт), что это за магическое число, размер страницы памяти? и возможно ли перепрыгнуть этот барьер или лучше этого не делать?
Номер ответа: 6
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #6
Добавлено: 25.12.08 12:26
Мда, поторопился я, скорее всего дело не в процессе копирования строки. Оказывается, что в переданном в функцию указателе - строка уже имеет обрезанный размер?!
Номер ответа: 7
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #7
Добавлено: 25.12.08 14:22
Вообщем я понял, что ограничение на длину строки наложил тип ASCIIZ (max=33554432 байт), получается, если в параметре передан указатель на строку c размером выше 32Mb - я никак не смогу обработать эту строку?
Номер ответа: 8
Автор ответа:
Father
Вопросов: 0
Ответов: 159
Профиль | | #8
Добавлено: 25.12.08 14:54
Инструкция по эксплуатции PB:
STATIC и GLOBAL строки ASCIIZ могут быть вплоть до 16,777,216 байтов.
Хочешь больше - просто объявляй массив байт.
Номер ответа: 9
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #9
Добавлено: 25.12.08 16:37
Мне очень стыдно, но что-то я не соображу, если можно примерчик.
Номер ответа: 10
Автор ответа:
Father
Вопросов: 0
Ответов: 159
Профиль | | #10
Добавлено: 26.12.08 03:08
я PB не люблю, но приблизительно так
Просто запомни, что строки это массив байт в памяти, а адрес строки (указатель) есть адрес первого по счету (нулевого) элемента массива. В каждом элементе масива хранится ASCII-код символа. Последний элемент массива - Ноль. Называется нуль-терминатором.
Номер ответа: 11
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #11
Добавлено: 26.12.08 10:51
Протестировал этот код, но к сожелению ситуация не изменилась:
И еще, я не понимаю этого:
Номер ответа: 12
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #12
Добавлено: 26.12.08 10:56
На надо насиловать свой мозг "массивами байт" и прочей VB-шной шизофренией. Для нормальных людей есть API функции: HeapAlloc и HeapFree. Их и используй для хранения данных
Номер ответа: 13
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #13
Добавлено: 26.12.08 11:54
Возможно я ошибаюсь, но мне кажется здесь проблема не в способе выделения буфера для данных, а в самом типе ASCIIZ.
Номер ответа: 14
Автор ответа:
Father
Вопросов: 0
Ответов: 159
Профиль | | #14
Добавлено: 26.12.08 12:21
Значит врет функция LEN.
MSGBOX STR$(lstrlen (@pszStr))
Номер ответа: 15
Автор ответа:
Lapex
Вопросов: 6
Ответов: 56
Профиль | | #15
Добавлено: 26.12.08 12:42
Ух ты, а ведь действительно LEN врет.
Спасибо!