purebasic.info

PureBasic forum
Текущее время: Пн дек 17, 2018 5:42 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 128 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт окт 09, 2018 11:52 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Да он вроде хочет закодировать не как в базе ну там в таблице сделать свою символьную расстановку
Что бы некто не мог расшифровать его базу как стандартную :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт окт 09, 2018 12:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
balex1978 писал(а):
чего значит сие MemoryStringLength и чем отличается от Len()
Функция MemoryStringLength возвращает длину строки по указателю в различных кодировках. Len возвращает длину строки (указатель на строку ей передать нельзя) текущей кодировки что поддерживает компилятор.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт окт 09, 2018 9:29 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Пётр писал(а):
balex1978 писал(а):
писал(а):
чего значит сие MemoryStringLength и чем отличается от Len()

Функция MemoryStringLength возвращает длину строки по указателю в различных кодировках. Len возвращает длину строки (указатель на строку ей передать нельзя) текущей кодировки что поддерживает компилятор.

Я думаю что ты еще непроснулся.
Цитата:
Len возвращает длину строки текущей кодировки
сколько живу то всегда возвращала количество букавок в строке и од формата кодировки не зависила никогда, вот из справки:
Цитата:
Length = Len(String$)
Описание
Возвращает количество символов в строке.
А вот эта байда Result = MemoryStringLength(*String [, Flags])
Возвращает длину (в символах) указанной завершающейся нулём строки (символ #Null).

помоему это не функция, а какойто бред, проверил на двух пуриках, результат совпал
Код:
1
2
3
4
5
6
7
8
9
10
11
a$="фыва"
Debug Len(a$);                             4
 
Debug    StringByteLength(a$,#PB_Ascii);    4
Debug MemoryStringLength(@a$,#PB_Ascii);    8
 
Debug    StringByteLength(a$,#PB_UTF8);     8
Debug MemoryStringLength(@a$,#PB_UTF8);     8
 
Debug    StringByteLength(a$,#PB_Unicode);  8
Debug MemoryStringLength(@a$,#PB_Unicode);  4


Ну и дальше не понятнее как считает и главное почему
Код:
1
2
3
4
5
6
7
8
9
10
11
a$="фыва1";                                  a$="фыва12"
Debug Len(a$);                             5 6
 
Debug    StringByteLength(a$,#PB_Ascii);    5 6
Debug MemoryStringLength(@a$,#PB_Ascii);    9 9 если это символов, то где остальные, и почему в обоих вариантах по 9 если a$="фыва1"(5 и 4*2+1=9) и a$="фыва12"(6 и 12) соответственно :shock:
 
Debug    StringByteLength(a$,#PB_UTF8);     9 10 с этим понятно 4*2+2=10
Debug MemoryStringLength(@a$,#PB_UTF8);     9 9 а чего при a$="фыва12"(6 и 4*2+2=10) 9 байт или символов, откуда взял, почему в обоих случаях
 
Debug    StringByteLength(a$,#PB_Unicode);  10 12
Debug MemoryStringLength(@a$,#PB_Unicode);  5  6


В общем я непонял куда это можно применять, савсем не понял.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт окт 09, 2018 9:41 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Мне понравилась твоя фраза
newJS писал(а):
base64, вместо встроенных, встроенные не позволяют делать что хочется
:lol:

Ты так бы и писал, что хоч аналог базе64 но с заменой кодировки:
Сергейчик писал(а):
Да он вроде хочет закодировать не как в базе ну там в таблице сделать свою символьную расстановку...
Как ты угадал :) .

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт окт 09, 2018 10:39 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
balex1978 писал(а):
сколько живу то всегда возвращала количество букавок в строке и од формата кодировки не зависела никогда
В настройках компилятора до версии 5.50 ни разу не видели галочку выбирающую будет ли формат строк ASCII или Unidode? Так вот, Len возвращает количество символов в текущей кодировке, которая выбрана.

balex1978 писал(а):
Возвращает длину (в символах) указанной завершающейся нулём строки
Len разве не то же делает? PB поддерживает другие типы строк кроме завершающихся нулевым байтом (байтами если это юникод)?

balex1978 писал(а):
проверил на двух пуриках, результат совпал
Исходная строка в какой кодировке?
Зачем сравнивать StringByteLength и MemoryStringLength если первая возвращает результат в байтах, а вторая в символах? Например каждый символ юникода UTF-16 занимает 2 байта. Символ в кодировке UTF-8 может занимать от 1 до 4 байт.

balex1978 писал(а):
В общем я непонял куда это можно применять, савсем не понял.
Вот допустим строки в проге в юникоде, а нужно отправить куда-то (допустим на сервер) или нужно записать в файл в UTF-8. Вот тогда они понадобятся, т. е. при необходимости перекодировки строк.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт окт 09, 2018 11:34 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Пётр помоему мы на разных языках говорим.

Про переключатель режима кимпилятора уже хороше разобрался, на грабли наступал через неее :lol: :lol: :lol: , спасибо вашему форуму, помогло :roll:

это из справки:
Result = MemoryStringLength(*String [, Flags])
Возвращает длину (в символах) указанной завершающейся нулём строки (символ #Null).

Вы отвечаете:
Цитата:
Len разве не то же делает?


Ну и где тут 4 символа она MemoryStringLength возвратила
Код:
1
2
3
a$="фыва"
Debug Len(a$);                             4, тут то понятоно что 4
Debug MemoryStringLength(@a$,#PB_Ascii)    8

;а тут вы говорите что тоже количество символов 4 но почемуто возвращает 8 но я то неслепой посчитать могу и так "фыва" вроде 4 или сепой?

а то что при компиляторе в анси это возвращает я вобще молчу
Код:
1
2
a$="фыва1";
Debug MemoryStringLength(@a$,#PB_Unicode)

ну и с какого это она бодуна возвратила 4, даже считать буквы розучилась :lol:

А тут савсем приколь
Код:
1
2
a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)

выдало 3, откудова такие познания? В подсчете символов, или что справка имеет введу, или то и имеет что введу :lol:
смотрите картинку
Вложение:
+++2018.10.09-23-23-54.JPG [50.58 KiB]
Скачиваний: 0

Чего он считает на самом то деле, ну не говорите что три символа в строке :lol:


Вот еще приколы нашего городка
Код:
1
2
3
4
5
a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)
 
a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)

дает три и три
А так 4 и 3
Код:
1
2
3
4
5
a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)
 
a$="фыва12";
Debug MemoryStringLength(@a$,#PB_Unicode)


Ну и чего это вторая(по коду) строка решила выдать 4, вместо 3, как в первом варианте? Просто захателось или как.

Как по мне это глюк пурика, который никуда не применить.
считать количество символов в УТФ8 я и так умею, если знаю, что там руские буквы, то символ занимает 2 байта, а цифра 1 байт.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 12:10 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
balex1978 писал(а):
Ну и где тут 4 символа она MemoryStringLength возвратила
Запустил 5.24. Выключил поддержку юникода и функция MemoryStringLength вернула 4. :) Какой из этого следует вывод? Правильно, нечего функции передавать юникодную строку и сообщать что она в ascii. :D

balex1978 писал(а):
а то что при компиляторе в анси это возвращает я вобще молчу
http://qps.ru/SHFN7

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 8:50 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
balex1978 писал(а):
ну и с какого это она бодуна возвратила 4, даже считать буквы розучилась

да не, это ты гонишь, это у тебя бардак с кодировками
у меня выдаёт всё правильно, пробовал несколько твоих примеров
Код:
1
2
a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)



MemoryStringLength() и Len() это одно и тоже, когда тестил их на скорость получил абсолютно одинаковый результат, создалось впечатление что используется один и тот же код для подсчёта
StringByteLength() это вернёт количество памяти занятое твоей строкой в зависимости от кодировки
именно это и написано в справке

а вот вам ещё про длину строки, код мгновенно возвращает длину строки в байтах
вопрос, а насколько это фокус корректен, можно ли им пользоваться?
в качестве недостатка, неизвестно сколько нужно выделять памяти, приходится выделять много, но она тут же освобождается
так и не понял как копирование с такой скоростью происходит
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
; MemoryStringLength()
; Len()
генерим длинную строку
For k=0 To 1000
s.s+"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Next
 
c=ElapsedMilliseconds()
*b = AllocateMemory(1000000)
*P = *B
 
 n= CopyMemoryString("", @*b)
    CopyMemoryString(s)
FreeMemory(*p)
 
wq+ElapsedMilliseconds()-c
Debug wq
Debug Str(*b-n); получаем размер строки
 



Цитата:
Что бы уменьшить степень абсурда темы раскрой же наконец секрет: делать что хочется

на сей вопрос уже не раз отвечалось и это не секрет
мне нужна была самопальная упаковка/распаковка base64, чтобы иметь возможность изменять стандартный вариант
что в этом тебе непонятно?
жаль только что ты слишком долго создавал этот код, у меня к этому моменту уже был свой вариант на основе твоих ранее выданных кодов, вся разница, я использовал Poke(), а ты структуру, по скорости оба варианта одинаковы, но со структорой мне больше понравилось

по ходу дела выяснилось что при использовании CatchImage() на символы = можно забить и крутить строку в одном единственном цикле, всего лишь образуется пару лишних байт, а CatchImage() эти байты просто игнорит
но сей фокус не пройдёт с другими бинарниками

jobless ты незря мучился, эта тема много мне дала


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 9:21 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
newJS писал(а):
мне нужна была самопальная упаковка/распаковка base64, чтобы иметь возможность изменять стандартный вариант
что в этом тебе непонятно?

Мне не понятно с какой целью? Я всё это время именно об этом спрашиваю, ведь base64 это средство а не цель.
И хуже того я предполагаю с какой и это предположение приводит меня в ужас, потому что путь достижения АБСУРДЕН!
А так то хозяин барин.

P.s.
newJS писал(а):
по ходу дела выяснилось что при использовании CatchImage() на символы = можно забить и крутить строку в одном единственном цикле, всего лишь образуется пару лишних байт, а CatchImage() эти байты просто игнорит

Это бред! Это не возможно читать. Каким боком к CatchImage() относится символ ограничитель (вернее заполнитель до кратности 4-ке) в упакованном буфере если на вход подаётся обратно распакованный, где никаких "=" даже приснится не может, если только не кошмаре.

p.p.s. пока я мучаюсь определённо зря, ты упорно не хочешь вникать в то, что я пишу не в тексте не к коде, но я надежд не теряю :mrgreen:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 11:08 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
jobless писал(а):
пока я мучаюсь определённо зря, ты упорно не хочешь вникать в то, что я пишу
Ты неодин такой :roll: .



Цитата:
Код:1
2 a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)

MemoryStringLength() и Len() это одно и тоже, когда тестил их на скорость получил абсолютно одинаковый результат
Ты бы выложил результат этой строки, и примеров что я выше приводил.

Цитата:
Правильно, нечего функции передавать юникодную строку и сообщать что она в ascii.
тогда зачем зайцу стоп-сигнал, имею введу это :#PB_Ascii в нижнем коде
Код:
1
2
a$="фыва"
Debug MemoryStringLength(@a$,#PB_Ascii)


если она считает скоко букв то ему этот параметр [, Flags] ненужет и ЛЕН(достаточно), а для того чтобы узнать сколько в памяти байт занято то достаточно StringByteLength()


Почему код возвращает три(три чего), компилятор в анси, ну теперь немного понятно,
в память впхал в анси, а подсчитывает как уникод :lol: , поэтому зайцу стоп-сигнал не нужен
a$="фыва11";
Debug MemoryStringLength(@a$,#PB_Unicode)

правильней писать так(мое мнение), и флаг закинуть на мусорку и причем на всегда :roll:
a$="фыва11";
Debug MemoryStringLength(@a$)

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 11:42 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
balex1978 писал(а):
тогда зачем зайцу стоп-сигнал, имею введу это :#PB_Ascii в нижнем коде
Код:
1
2
a$="фыва"
Debug MemoryStringLength(@a$,#PB_Ascii)




У меня и "highly likely" у Петра при чтении документации по поводу MemoryStringLength однозначно в голове прежде всего присутствует [первый параметр] = АДРЕС, а второй параметр характеристика того что следом от этого адреса по байтно лежит. А вот это @a$ исторически дурной BASIC-стиль программирования просто частный случай по падания в понятие АДРЕС и все вопросы обсуждаемые в этой теме от заблуждения, что компьютер знает о существовании каких то строк, да ещё и в разных форматах. Я автору темы пытался объяснить, что всякие варианты добиться цели манипулирования байтами это как читать книгу через трафарет и думать, что от того, что дырочки в нём будут круглые или квадратные смысл текста обязательно изменится.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 1:03 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Цитата:
присутствует [первый параметр] = АДРЕС, а второй параметр характеристика того что следом от этого адреса по байтно лежит.
Сепасибо дружище, вот теперь нашел я свои грабли :oops: .
вот это я и искал и мимо прошло это "*String - Адрес строки, длину которой требуется получить. "
Есть строка в какойто кодировке и применив эту функцию указав формат можно узнать сколько букв в строке занимает эта строка, вот так яснее стало.

Правда тут чегото нехочет, не правильно считает УТФ
Код:
1
2
3
4
5
6
7
8
9
10
11
12
s$="ФЫВА12"
s2$=Space(20)
format=#PB_UTF8;#PB_Unicode;#PB_Ascii;
PokeS(@s2$, s$, -1, format); запхать строку в память в УТФ8
ShowMemoryViewer(@s2$, 100); можно посмотреть но пурик както криво это отражает - "????12[NULL]"
 
Debug PeekS(@s2$, -1, format);читаем с памяти
Debug MemoryStringLength(@s2$,format);считываем
 
; странно анси и уникод считает верно, УТФ8 чегото дает 10
; D0 A4 D0 AB D0 92 D0 90 31 32 00 00 20 00 20 00  Р¤Р«Р’Рђ12.. . .
 


_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 1:29 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
balex1978 писал(а):
вот это я и искал и мимо прошло это "*String - Адрес строки, длину которой требуется получить. "
Разве я не об это писал? viewtopic.php?p=90323#p90323

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 1:43 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Цитата:
Разве я не об это писал?

Нужно было все это схрестить в голове и дойти до кондиции.
Про адрес, это понятно , ведь я примеры так и приводил с адресом.
Просто в справке как говорится двусмысленно сказано.
И нужно было разобраться как это работает.Но:
Всеодно остается вопрос почему утф неверно считает?
Цитата:
странно анси и уникод считает верно, УТФ8 чегото дает 10

Или я опять чегото неверно сделал?

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 2:04 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
balex1978 писал(а):
длину которой требуется получить.


Ещё более обобщённо в голове должно всё уложиться: Начиная с указанного адреса ищем байт %00000000 и подсчитываем по байтно не равные нулю если #PB_Ascii, по словно(2 байта) если #PB_Unicode и наконец если #PB_UTF8 анализируем старшие биты, а на основе анализа вычисляем по байтно, по словно или больше(как по битно формируется utf8 расписано в википедии).

И этот алгоритм в том числе можно причислить к способам подсчёта символов в строке в зависимости от второго параметра, на самом деле мы просто тупо искали НОЛЬ. И так за каждой функцией в которой речь идёт о каком то агрегатном типе данных неплохо бы понимать какую компилятор родит задачку для процессора.

p.s. лично для меня purebasic тем и ценен, что могу опуститься до бита, могу из святой лени манипулировать крупными агрегатами:списками, картами, ..... , но дело в том, что я все эти агрегаты если заставлю себя чётко представляю как написать в Си стиле на pb и в крайнем случае со справочником опустится до ассемблера. И я убеждён, что можно не иметь навыка быстро что то подобное делать, но иметь представление о том как оно может выглядеть обязательно (ИМХО).


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 128 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB