Тема
|
Интересен номер на CString
|
|
Автор |
Pekoнcтpykтop (Нерегистриран) |
Публикувано | 11.03.05 12:25 |
|
_AFX_INLINE TCHAR CString::operator[](int nIndex) const
{
// same as GetAt
ASSERT(nIndex >= 0);
ASSERT(nIndex < GetData()->nDataLength);
return m_pchData[nIndex];
}
Това хубаво, ама nDataLength не включва терминиращата нула. В резултат, една проверка от рода на str[0] == 0, която си е напълно логична и често използвана, гърми на поразия.
|
|
|
ASSERT(nIndex < GetData()->nDataLength);
|
|
|
До сега не съм виждал функция за низове да брои нулата. Всички броят брой символи без 0 терминиращата нула. Нямаш право да достъпваш елементът с терминиращата нула.
Какво наричаш една проверка от рода на str[0]?
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
|
|
|
Що пък да нямам право?? Буфера е дължината на стринга + 1 по дефиниция, т.е. ако указателя е валиден, задължително има поне 1 символ дължина. В това се заключава идеята за проверка на празен стринг - ако първия символ е нула, значи е празен.
|
|
|
Ако искаш да работиш с буфера си има специални функции за работа с буфер. Ти тука работиш с класа и там хората ако искат могат да си нямат изоставаща нула даже.
Начи аз не разбирам мноо от MFC, ма първото което се сещам е, че имат оператор за z-string. Демек вместо
str[0]
моеш да си пишеш
*static_cast<TCHAR*>(str)
Редакция:
*static_cast<LPCTSTR>(str)
Ей затова мразя C-cast, щото е много силен и с него тва дето го бех написал щеше да мине.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_Редактирано от Colombino на 11.03.05 15:54.
|
|
Тема
|
Re: Интересен номер на CString
[re: Pekoнcтpykтop]
|
|
Автор | Paдo (Нерегистриран) |
Публикувано | 11.03.05 16:18 |
|
Ако искаш да ръчкаш вътрешностите на CString-a - CString::GetBuffer/CString::ReleaseBuffer.
Иначе културния начин е GetLength и IsEmpty.
|
|
|
Абе как без нула, CString официално енкапсулира ANSI стринг.
|
|
|
хората са сложили IsEmpty() за тая проверка
|
|
Тема
|
Re: Много правилно
[re: Pekoнcтpykтop]
|
|
Автор | д (Нерегистриран) |
Публикувано | 11.03.05 18:20 |
|
Като нещеш да ползваш класове и функции от рода на IsEmpty що ползваш С++ а не минеш на С?
|
|
Тема
|
Re: Много правилно
[re: Pekoнcтpykтop]
|
|
Автор | zaphod (Нерегистриран) |
Публикувано | 11.03.05 18:30 |
|
не и през оператора [], ако искаш да достъпваш нулата, тогава първо кастни към LPCSTR и тогава слагай [], би трябвало да стане, макар че ме мързи да го пробвам.
|
|
|
Абе не е въпроса как да се направи, идеята на темата е що така са го решили точно да е. Не е ли логично квадратните скоби да дават илюзията за буфер?
|
|
|
char *q = NULL;
p = q[0];
колко е p ?
(q = m_pchData)
|
|
|
поправка:
char *q = "";
p = q[0];
колко е p ?
(q = m_pchData)
и колко е str[0], в който е pchData? :)
|
|
Тема
|
Re: Интересен номер на CString
[re: Pekoнcтpykтop]
|
|
Автор | zaphod (Нерегистриран) |
Публикувано | 11.03.05 21:21 |
|
не съм сигурен че идеята му е да имитира буфер. забележи че от тая гледна точка, няма никаква нужда да се пренаписва оператора [], при положение че си пренаписал кастинга към LPCSTR. но щом са го пренаписали, значи идеята е била да не се разглежда като буфер. според мен причината е чисто идеологическа, а не техническа. не ми е известно ситуация, когато инстанция на CString да съдържа невалиден указател и технически погледнато би трябвало да няма проблем със [0]. предполагам че в релийз компилация, между [] и (LPCSTR) няма никаква разлика, доколкото си спомням, [] е също само за четене и не позволява запис.
|
|
|
ОК
|
|
|
А кой е казал, че ANSI стринговете винаги са z-терминирани?
Ако нещо ви се струва сложно, мога да го направя още по-сложно
|
|
Тема
|
Re: Много правилно
[re: ьп]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 12.03.05 19:35 |
|
Извинявам се за тъпия въпрос!
Какво е "ANSI стринг"? Има ли нещо общо с така наречените ASCII стринг? А със ASCIIZ стринг?
|
|
Тема
|
Re: Много правилно
[re: eдc]
|
|
Автор |
ьп (откачалка) |
Публикувано | 14.03.05 10:41 |
|
ASCIIZ означава Zero-terminated ASCII, т.е. стандартните C-стрингове, дето накрая завършват с нулев терминатор (ASCII код 0).
ANSI е стандарт за наредба на символите в кодовата таблица, т.е. няма нищо общо с начина, по който се представя стринга в съответния език - било то дължина + данни (както в Праскал), или пък стрингове с произволна дължина и \0 накрая.
ANSI стринг в Windows значи стринг от символи, принадлежащи на 1-байтова кодова таблица (т.е. не-Уникод), съответстваща на текущия локал. ASCII винаги е подмножество на тази таблица (първите 128 символа). А дали ще е терминиран с нула отзад (т.е. ASCIIZ) или ще е в Праскалски вид (1 или 2 байта за дължина, следвани от самият стринг без нулев терминатор накрая), е по-скоро въпрос на вкус.
Ако нещо ви се струва сложно, мога да го направя още по-сложно
|
|
|
За да бъдем точни, ANSI обхваща кодове от 32 до 126. ANSI формат на стринговете е този, които е приет в ANSI C - един байт за символ, терминиран с нула.
|
|
Тема
|
Re: Много правилно
[re: ьп]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 14.03.05 19:35 |
|
Не съм сигурен, но май намесваш кодирането - 7bit ASCII(първообраза), ANSI (което всъшност е Windows-1252), KOI8(тук руснаците имат думата) и още много други... със вида стринг - null terminated string (така известния като ASCIIZ), или Паскалски стринг...
|
|
|
да не забравяме BSTR, в който в 4 байта преди указателя се пази дължината на стринга, формата е unicode i e 0 terminiran :-)
specialno CString e още по-изчекнат, защото той всъщност е mcbs или unicode, в зависимост от това какво е приложението. при mcbs, може един символ да е повече от един байт, не знам тогава как се държи оператора [].
|
|
Тема
|
Re: стрингове дал господ
[re: ~!@$%amp;^*()_+]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 14.03.05 23:22 |
|
Видове кодирания има много, видове стрингове (според начина на пазене на данните) има също много... А като се намеси и разните му там класове... Пък ако класовете поддържат и няколко кодирания - става мазало...
ПП
Може би ще ти е интересно да погледнеш следното описание/упътване за BSTR
Който казва, че BSTR не е null terminated!?
Явно, 4те байта в началото са размера на буфера не щото такъв е формата на стринга, а е случайност - поради задължително ползвания начин за алокиране под Win...
Освен това, според MSDN под Win16 и Apple PowerMac стринга не е от дву-байтови char-ове....
|
|
|
за вин16 и мац си прав, но иначе четирите байта (2 в вин16) в началото не са случайност, по-скоро терминиращата нула е сложена за съвместимост със Ц подобните езици.
БСТР идва от двоичен стринг и по спецификация той може да има нули и по средата, между другото доколкото това са стринговете които се използват във ВБ, там е/беше доста честа практика да се слагат нули в средата на стринга, нещо което винаги ме е дразнело с Ц стринговете, защото според мен е тъпичко да имаш запазени символи.
|
|
Тема
|
Re: стрингове дал господ
[re: ~!@$%amp;^*()_+]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 15.03.05 00:04 |
|
Ти прочете ли какво пише на адреса който ти дадох?
BSTR е не е null terminated!
4те байта указващи размера на буфера са служебна информация на Windows! Не са част от стринга!
Иначе BSTR се ползва от Visual Basic и BSTR се нарича още "Basic String" освен "Binary String"...
|
|
Тема
|
Re: Интересен номер на CString
[re: Pekoнcтpykтop]
|
|
Автор | Xyю Xyeв Xyиcтия (Нерегистриран) |
Публикувано | 15.03.05 00:34 |
|
Пак до МФЦ опряхме, а?
Тук няма да дам компетентен съвет. Ще задам един въпрос.
Да предположим, че подобно приложение е вече написано.
Интересно ми е какво ще стане, когато условията в АССЕРТ-ите не са изпълнени, но АССЕРТ-ите не са компилирани (в релеасе например). Какво ще стане?
Ще си модифицираме кода за релеасе? Според мен това е безумие, ползващите МФЦ страдат от липса на въображение, а МФЦ само по себе си трябва да бъде забранено, защото провокира вредни мисли и навици.
|
|
|
прочетох и не научих нищо ново
дефакот то Е 0 terminated, точно затова може да бъде подаван като параметър (почти) навсякъде където се очаква wide string.
|
|
Тема
|
Re: стрингове дал господ
[re: ~!@$%amp;^*()_+]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 15.03.05 02:16 |
|
Щом така си прочел... добре...
|
|
|
аз лично предпочитам колекциите на мфц пред колекциите на стл. а по въпроса с ассертите - ами в много случаи нищо няма да стане, например точно в този. на практика стринга има терминираща нула, така че асерта дори да го няма, програмата няма да изгърми. в други случаи разбира се програмата гърми. аз много рядко ползвам асерти, защото като забравя нещо, програмата си гръмва и виждаш къде е станал фала. ползвам ги само там където няма да изгърми, но където логиката ми може да е объркана. има много случаи, когато лошите новини трябва да ги получиш докато си в дебъг, а не когато вече си в релийз. както казват по сватбите "който има нещо да казва, да го каже сега, ако не да замълчи завинаги". аз лично например във всяка програма си сетвам настройките на флоат операциите да ми дават ексепшън при делене на нула в дебъг, но да си траят в релийз.
NE SUTOR ULTRA CREPIDAM
|
|
|
Вметка: Паскалския стринг не е ASCIIZ, а е LPString (Length Prefixed String) - първият байт съдържа броя на знаците в стринга, и няма нужда от терминираща нула (нулата се възприема като обикновен елемент).
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
|
|
|
Само усложнява разработката и под Win, и под *ix. Навсякъде е прието нулл-терминатед.
|
|
Тема
|
Re: Много правилно
[re: Duncan Griffin]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 15.03.05 14:12 |
|
Мерси за термина LPString... (него знаех; рядко ми се налага да действам с такъв стринг - предпочитам да ползвам класове, а там рядко се стига до директна работа с буфера..)
Иначе ми е ясно че "паскалския стринг" не е ASCIIZ. C-стринга е ASCIIZ. Паскалския нормално е АSCII стринг(без Z накрая), освен ако не му приложиш някакво специално кодиране - тогава няма да е ASCII...
ПП
Може би си се объркал от постинга ми - изброявах видове стрингове като споменах 2 вида + многоточие -> Като го препрочитам виждам че може да се възприеме като твърдение, че null terminated стринговете са наричани още паскалски стринг.. което не е вярно... извинявам се за двусмислието...
|
|
Тема
|
Re: Много правилно
[re: Pekoнcтpykтop]
|
|
Автор | eдc (Нерегистриран) |
Публикувано | 15.03.05 14:16 |
|
Бе то и начина на предаване/връщане на параметри в С е затормозяващо при излизане от функция (за разлика от начина ползван в Паскал), но никой не се оплаква...
|
|
Тема
|
умник си ми ти
[re: zaphod]
|
|
Автор | Xyю Xyeв Xyиcтия (Нерегистриран) |
Публикувано | 16.03.05 10:29 |
|
Драги ми Смехурко,
И аз като теб бях луд фен на МФЦ. И съжалявам за което. Отне ми близо година за да се отуча от шибаното МФЦ. И сега никога не бих се захванал да пиша нещо на МФЦ, освен ако няма изрични изисквания за това, независещи от моите предпочитания.Като всеки ревностен почитател на МФЦ е логично да не видиш, че МФЦ не е най-доброто. Че има и други, по-прости, по-удобни, по-лесни за ползване неща. А това, че АССЕРТ-ите ги ползваш не по предназначение си е твой проблем. Не е тук мястото да ти обяснявам за идеята на АССЕРТ-а и дали той се яде.
|
|