- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
typedef signed int s32;
//...
void SomeStruct::SomeFunc(const char* ipImageName /*, ... */ )
{
// ...
s32 imageNameSize = strlen(ipImageName) * sizeof(char) + 1;
this->mpImageName = new char[imageNameSize];
strcpy(this->mpImageName, ipImageName);
// ...
}
Dummy00001 13.06.2010 15:22 # −3
на счет wchar_t .... хез. я как правило на utf-8 сижу и вайд чарами принципиально не пользуюсь. и даже на виндах... ежели дежурный не-юникод+рашн+дельфи быдлокод, то там даже wchar_t не поможет.
Webkill 13.06.2010 16:02 # +4
почему? потому что их любит гадкий майкрософт? ох уже фанатики... или потому что он места "многго" занимает? ох уже эти не вышедшие из анабиоза, рам у них 3 килоайбата до сих пор гыгы
pushkoff 13.06.2010 17:25 # 0
ну и как бы из контекста: игра казуальная, имена всех ресурсов известны заранее и могут быть набраны латиницей, смысла от использования вайд чара - нет...
но с другой стороны, опять исходя из условия что игра казуальная и все ресурсы известны заранее, все файлы пакуются (идеальный случай для издателя это 1 экзешник, с всем внутри) и номеруются, смысла использовать имена файлов - нет...
Webkill 13.06.2010 19:10 # 0
чем это он переносимее? абсолютно такая же портабельность. разве что есть встроенная поддержка легаси-АПИ типа libc... для использования вне libc utf8 не имеет абсолютно никаких преимуществ
pushkoff 13.06.2010 20:11 # 0
Webkill 14.06.2010 04:53 # 0
pushkoff 14.06.2010 11:42 # −3
guest 14.06.2010 14:01 # −1
Kirinyale 14.06.2010 14:07 # 0
guest 14.06.2010 14:31 # 0
ВСЕ символы 1 байтом не представить! Только ASCII подмножество, т.е. ты мудак предлагаешь транслитом писать?
Kirinyale 14.06.2010 15:02 # +1
guest 14.06.2010 15:17 # 0
guest 14.06.2010 16:35 # 0
guest 14.06.2010 16:33 # 0
Kirinyale 13.06.2010 19:39 # 0
Но, в принципе, на прошлом аналогичном проекте вполне нормально обошлись утф8, так что обойдёмся и здесь. Как минимум, он удобнее тем, что если некоторые данные вдруг оказались в ASCII, их не приходится постоянно конвертить туда-обратно, плюс халявные сторонние библиотеки далеко не всегда работают с wchar_t.
pushkoff 13.06.2010 20:10 # −1
сплешскрины - это отдельный пак, локализация тоже...
то есть имеем 3 пака ( данные, сплешскрины, локализация), экзешник, 1-2 DLLки... это издателю понравится больше чем 100500 мелких файлов...
для запаковки локализаций и сплешей дайте издателю тулзу и небольшой комент как с ней работать... они не тупые, разберутся...
ну и если быть уж совсем крутым, то все паки можно положить в ресурсы экзешника и если нет доп библиотек, то будет 1 экзешник (мы так не делали, но видели игры в которых такое есть)...
Kirinyale 13.06.2010 21:03 # +1
и даже не тупые временами тупят... в последний раз они почему-то не сумели нормально обернуть в свой инсталлер тулзу, перепаковывающие ресурсы из сжатого в несжатый пак... пришлось игре перепаковывать их самой на первом запуске, что естественно вылилось в проблемы при дефолтной установке в Program Files и запуске не под админом... вместо нормального решения проблемы потребовали распаковывать все полгектара прямо в All Users под виндовыми документами, итог - хозяин барин, юзеры (те, которые нашли "гостинец") недовольны, разработчикам стыдно, а шо делать)))
pushkoff 14.06.2010 11:46 # 0
мы использовали PopCap и его PopPak. в паке ресурсы не жали, но пользовались всякими трюками для уменьшения размеров png картинок, типа квантизации...
Kirinyale 14.06.2010 12:01 # 0
ресурсы жались только для финала (при отладке использовались как есть, т.е. те самые 100500 файлов, зато с возможностью подменять/исправлять на лету)
сжимали банальным разделением PNG или TGA (в основном исходники держали в TGA - грузилось быстрее) на два JPG (картинка+маска), после чего паковали в несжатый зип
guest 14.06.2010 12:03 # −1
Kirinyale 14.06.2010 12:04 # 0
guest 14.06.2010 12:49 # −1
Kirinyale 14.06.2010 12:52 # +2
guest 14.06.2010 13:05 # −1
Kirinyale 14.06.2010 13:07 # 0
guest 14.06.2010 13:11 # 0
pushkoff 14.06.2010 16:37 # +2
legolegs 13.06.2010 18:56 # 0
Webkill 13.06.2010 19:26 # 0
printf("%d\n", strlen("привет"));
результат: 12
printf("%d\n", wcslen(L"привет"));
результат: 6
Это несомненный плюс...
legolegs 13.06.2010 19:40 # 0
Webkill 13.06.2010 19:54 # 0
одинаково хорошо если рассматривать строку просто как кусок памяти.
а если как некий набор буков, то wchar_t для некитайцев просто прекрасен.
legolegs 14.06.2010 10:13 # 0
Webkill 14.06.2010 16:38 # 0
Или вот хочу иметь логический чар 'Ж'. В утф8 не могу такого сделать. А в вайдчарах будет L'Ж'.
pushkoff 14.06.2010 16:50 # −3
а на счет азиатов ты зря... если судить по играм, рыное японии второй по величине после сша, причем рынок сша постоянно сокращается, а китая растет...
Webkill 14.06.2010 17:08 # −1
guest 14.06.2010 23:25 # −2
Они это тебе припомнят, когда станут хозяивами мира.
pushkoff 14.06.2010 16:51 # 0
Webkill 14.06.2010 17:00 # 0
pushkoff 14.06.2010 17:25 # −1
по своему опыту скажу, везде где в данный момент нужен 1 символ (особенно с кодом больше 127) через месяц будет нужна строка...
ну и как бы локализация намекает на полное отсутствие строк в нац алфавитах в коде, поэтому в 99% случаев монопенисуально сколько байт занимает 1 символ (1% это функция DrawString)
Webkill 14.06.2010 18:00 # −1
потому что опыт у тебя с убогим утф8
pushkoff 14.06.2010 18:43 # 0
Webkill 14.06.2010 18:45 # 0
под виндой это лучшее средство по крайней мере
pushkoff 14.06.2010 20:48 # −1
Webkill 14.06.2010 20:59 # 0
дотнет а следовательно моно - тоже...
qt вроде тоже не утф8
pushkoff 14.06.2010 21:22 # −1
нутри себя строки в яве и дотнете могут быть чем угодно, никто никогда не узнает как они устроены, так как язык это обернет в свои абстракции...
даже для С++ есть классы которые позволяют работать с utf8 строками, как с utf16/utf32.
c QT не работал, незнаю, спорить не буду...
Webkill 14.06.2010 21:46 # 0
В дотнете чётко прописано, что строка должна быть в utf16 (http://msdn.microsoft.com/en-us/library/system.string.aspx):
"Each Unicode character in a string is defined by a Unicode scalar value, also called a Unicode code point or the ordinal (numeric) value of the Unicode character. Each code point is encoded using UTF-16 encoding, and the numeric value of each element of the encoding is represented by a Char object. "
насчёт явы не знаю, но большинство реализаций, которые я знаю, используют внутренне utf16.
вот нашёл (http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp):
"The Java programming language is based on the Unicode character set, and several libraries implement the Unicode standard. The primitive data type char in the Java programming language is an unsigned 16-bit integer that can represent a Unicode code point in the range U+0000 to U+FFFF, or the code units of UTF-16. The various types and classes in the Java platform that represent character sequences - char[], implementations of java.lang.CharSequence (such as the String class), and implementations of java.text.CharacterIterator - are UTF-16 sequences."
В дотнете это особеннно важно, потому что можно сделать строку pinned и передать в нативный код сразу указатель на чары без маршаллинга:
fixed(char* cs = &str) { }
без значния внутренней кодировки мы бы так делать не могли
guest 14.06.2010 23:31 # 0
guest 14.06.2010 23:28 # −1
nil 15.06.2010 10:28 # 0
pushkoff 15.06.2010 12:37 # −1
guest 14.06.2010 23:27 # 0
Ыыы. Кстати, это вообще прикол, да. :)
Webkill 13.06.2010 19:29 # 0
да нифига, если юзать combination marks, то на одну букву может быть и два 32битных вчара... везде одни и те же траблы
pushkoff 13.06.2010 20:33 # 0
Говногость 13.06.2010 20:52 # +2
Webkill 13.06.2010 19:43 # 0
если в GCC указать -fshort-wchar, то вайдчары и под линуксом будут 2 байта. правда, стандартные функции типа wcslen/wcscpy не будут работать...
legolegs 14.06.2010 10:14 # 0
Webkill 14.06.2010 17:02 # 0
с быдлос++ ни в чём нельзя быть уверенным
pushkoff 14.06.2010 17:28 # −2
guest 14.06.2010 17:30 # +1
Webkill 14.06.2010 17:53 # 0
pushkoff 14.06.2010 18:51 # −3
в некоторых случаях в реализации строк на С++ не включают шаблонные варианты функций работы со строками, а используют str* (mb_str*) и wcs* функции для char и wchar_t, соответственно... если мы делаем wchar_t 2 байтным, то все функции wcs* отваливаются... об этой проблеме уже писали (хотя для этого случая есть воркараунды)... по моему этой непонятки должно хватить с головой чтоб перестать пользоваться wchar_t...
guest 14.06.2010 18:55 # +2
pushkoff 14.06.2010 21:09 # 0
Webkill 14.06.2010 19:05 # −1
> по моему этой непонятки должно хватить с головой чтоб перестать пользоваться wchar_t...
это не понятка не вчара, а конкретно gcc
pushkoff 14.06.2010 21:01 # 0
тут вопрос стоит зачем нужен wchar_t? если есть причины по которым он нужен, то использовать std::wstring или нет - дело автора (причина выбора такие же как и при выборе std::string).
А профит в том, что работа со строками становится намного проще, уже не нужно думать о всяких str*, mb_str*, wcs* об утечках памяти, о буферах достаточной длинны и тд, то есть все что ненавидят в С++ шарписты, явисты, пехапешники, и др... да, за удобство придется расплачиваться производительностью, поэтому если она нужна придется велосипедировать, благо С++ никого не принуждает, за что его и любят...
guest 14.06.2010 23:34 # −1
Лол) Если на него(на С++) кто-то садится, то тот его изнасилует пополной.
Webkill 15.06.2010 00:21 # 0
это да, только что делать, если я не пишу на с++
guest 15.06.2010 00:24 # 0
VB в твоём распоряжении обезьянка.
Webkill 15.06.2010 10:57 # 0
pushkoff 15.06.2010 12:41 # 0
> спасибо, я не осилил С++
guest 15.06.2010 13:03 # 0
pushkoff 15.06.2010 14:48 # −1
на этом сайте людей осиливших С++ не больше десятка... то что уэбкилл коментит темы по С++ не значит, что он его осилил...
guest 15.06.2010 15:03 # +1
pushkoff 15.06.2010 15:59 # −1
guest 15.06.2010 17:47 # +2
pushkoff 15.06.2010 22:00 # 0
guest 16.06.2010 02:15 # +1
В 1994г выпустили книгу по VB. Там было сказано, что раньше писать под windows было просто нереально сложно, потому что надо было писать тысячи строк кода на сях, и вообще не понятно как люди умудрялись писать программы.
В 2004м вышла книга про C#, где было сказано что без автоматической сборки мусора писать физически нереально, и до появления .NETа писать программы могли только доктора пяти наук
Webkill 15.06.2010 13:49 # 0
>> спасибо, я не осилил С++
Нет, это звучит так: "шутку понял, но всё равно не смешно".
guest 15.06.2010 00:24 # −1
Подрочить.
guest 15.06.2010 03:20 # +2
Да ничего. Продолжай делать говносайты за $ 15 на PHP, макак ты несчастный
Webkill 15.06.2010 10:57 # 0
guest 15.06.2010 14:12 # −1
Соси!
guest 16.06.2010 02:16 # 0
guest 16.06.2010 06:16 # 0
guest 15.06.2010 15:04 # +3
Мой полы.
pushkoff 15.06.2010 16:00 # 0
guest 15.06.2010 17:43 # 0
pushkoff 15.06.2010 22:01 # 0
guest 15.06.2010 22:14 # 0
guest 15.06.2010 23:22 # 0
guest 16.06.2010 06:18 # +1
guest 16.06.2010 06:24 # 0
guest 16.06.2010 06:52 # +1
guest 16.06.2010 06:16 # +1
Kirinyale 13.06.2010 15:26 # −1
J0hnny 13.06.2010 16:17 # 0
Например, если приложение на MSVC использует один рантайм, подключает библиотеку которая использует другой рантайм, могут возникнуть проблемы из-за разных реализаций. И обычно, stl'ские классы убирают из интерфейсных частей, заменяя их char'ами и т.п..
Данный говнокод выдран из контекста, и сказать плохо то что нет std::string, или хорошо, однозначно нельзя.
Kirinyale 13.06.2010 16:38 # 0
guest 14.06.2010 08:02 # −1
Kirinyale 14.06.2010 09:47 # 0
pushkoff 14.06.2010 11:52 # 0
guest 14.06.2010 12:04 # −1
guest 14.06.2010 20:18 # −1
pushkoff 14.06.2010 21:07 # 0
guest 14.06.2010 23:35 # +3
guest 15.06.2010 14:20 # −2
guest 16.06.2010 06:53 # −1
pushkoff 13.06.2010 15:27 # −2
возможно ваш лид сталкивался с платформами на которых char больше 1 байта...
J0hnny 13.06.2010 16:08 # 0
Наверное имелось ввиду, больше 8ми бит?
Webkill 13.06.2010 16:15 # 0
J0hnny 13.06.2010 16:38 # 0
Kirinyale 13.06.2010 15:30 # −1
J0hnny 13.06.2010 16:20 # 0
RTFM, в данном случае стандарт C++.
Kirinyale 13.06.2010 16:33 # −1
J0hnny 13.06.2010 16:37 # 0
Kirinyale 13.06.2010 16:40 # 0
страница, строка?
J0hnny 13.06.2010 16:44 # 0
"The sizeof operator yields the number of bytes in the object representation of its operand."
...
"sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1."
для общего развития, стр 5:
"The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any
member of the basic execution character set and is composed of a contiguous sequence of bits, the number of which
is implementation-defined."
Kirinyale 13.06.2010 16:52 # 0
Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character
set.
Впрочем, меньшим говнокодом сабж от всего этого не становится.
J0hnny 13.06.2010 17:00 # 0
слово basic, имхо убирает всю обтекаемость.
"Впрочем, меньшим говнокодом сабж от всего этого не становится."
Я вообще-то ещё не говорил о своей оценке сабажакода. Я указал на ваше говновысказывание, которое может подтолкнуть к высеранию говнокода вами, и тех кто прочёл это ваше высказывание.
Kirinyale 13.06.2010 17:11 # 0
Перефразирую: "вернёмся к примеру с wchar_t и заменим для компилируемости strlen/strcpy на соответствующие аналоги".
J0hnny 13.06.2010 17:16 # 0
Человек который будет менять на wchar_t, возьмётся и за strlen, и скорей всего заметит каку.
А вообще wchar_t планируется?
Kirinyale 13.06.2010 17:25 # 0
wchar_t пока что вроде не планируется.
pushkoff 13.06.2010 17:27 # 0
guest 14.06.2010 12:05 # 0
pushkoff 14.06.2010 12:21 # −1
guest 14.06.2010 12:51 # −1
guest 16.06.2010 06:17 # 0
Webkill 13.06.2010 17:16 # +1
байт это семантически единица.
байт может реализовываться любым количеством битов.
в байте может быть 16 бит, но это всё равно будет ОДИН байт.
и код в этом смысле совсем не говнокод, ибо выделяется память на любой платформе будет под нужное количество бит, ибо реализацтия - сколько битов - скрыта...
Webkill 13.06.2010 16:01 # 0
вообще судя по всему, учитывая что он рядом пишет sizeof(char) и 1, это похоже на ошибку по невнимательности