Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 18:30 27.09.24 
Компютри и Интернет
   >> Програмисти
*Кратък преглед

Страници по тази тема: 1 | 2 | 3 | 4 | (покажи всички)
Тема Интересен номер на 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, която си е напълно логична и често използвана, гърми на поразия.





Тема Re: Интересен номер на CStringнови [re: Pekoнcтpykтop]  
Автор syscop (непознат)
Публикувано11.03.05 15:04



ASSERT(nIndex < GetData()->nDataLength);



Тема Много правилнонови [re: Pekoнcтpykтop]  
Автор Colombino (безработен)
Публикувано11.03.05 15:17



До сега не съм виждал функция за низове да брои нулата. Всички броят брой символи без 0 терминиращата нула. Нямаш право да достъпваш елементът с терминиращата нула.

Какво наричаш една проверка от рода на str[0]?

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_


Тема Re: Много правилнонови [re: Colombino]  
Автор Pekoнcтpykтop (Нерегистриран)
Публикувано11.03.05 15:38



Що пък да нямам право?? Буфера е дължината на стринга + 1 по дефиниция, т.е. ако указателя е валиден, задължително има поне 1 символ дължина. В това се заключава идеята за проверка на празен стринг - ако първия символ е нула, значи е празен.





Тема Re: Много правилнонови [re: Pekoнcтpykтop]  
Автор Colombino (безработен)
Публикувано11.03.05 15:48



Ако искаш да работиш с буфера си има специални функции за работа с буфер. Ти тука работиш с класа и там хората ако искат могат да си нямат изоставаща нула даже.

Начи аз не разбирам мноо от 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.



Тема Re: Много правилнонови [re: Colombino]  
Автор Pekoнcтpykтop (Нерегистриран)
Публикувано11.03.05 17:10



Абе как без нула, CString официално енкапсулира ANSI стринг.





Тема Re: Много правилнонови [re: Pekoнcтpykтop]  
Автор ~!@$%amp;^*()_+ (целия горен ред)
Публикувано11.03.05 17:32



хората са сложили 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 и тогава слагай [], би трябвало да стане, макар че ме мързи да го пробвам.



Тема Re: Много правилнонови [re: zaphod]  
Автор Pekoнcтpykтop (Нерегистриран)
Публикувано11.03.05 19:58



Абе не е въпроса как да се направи, идеята на темата е що така са го решили точно да е. Не е ли логично квадратните скоби да дават илюзията за буфер?





Тема Re: Много правилнонови [re: Pekoнcтpykтop]  
Автор syscop (непознат)
Публикувано11.03.05 20:41



char *q = NULL;

p = q[0];

колко е p ?
(q = m_pchData)



Тема Re: Много правилнонови [re: syscop]  
Автор Pekoнcтpykтop (Нерегистриран)
Публикувано11.03.05 21:06



поправка:

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) няма никаква разлика, доколкото си спомням, [] е също само за четене и не позволява запис.



Тема Re: Много правилнонови [re: Pekoнcтpykтop]  
Автор syscop (непознат)
Публикувано11.03.05 22:08



ОК



Тема Re: Много правилнонови [re: Pekoнcтpykтop]  
Автор ьп (откачалка)
Публикувано12.03.05 17:35



А кой е казал, че 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 байта за дължина, следвани от самият стринг без нулев терминатор накрая), е по-скоро въпрос на вкус.

Ако нещо ви се струва сложно, мога да го направя още по-сложно


Тема Re: Много правилнонови [re: ьп]  
Автор Pekoнcтpykтop (Нерегистриран)
Публикувано14.03.05 10:53



За да бъдем точни, 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), или Паскалски стринг...



Тема стрингове дал господнови [re: eдc]  
Автор ~!@$%amp;^*()_+ (целия горен ред)
Публикувано14.03.05 21:35



да не забравяме 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-ове....



Тема Re: стрингове дал господнови [re: eдc]  
Автор ~!@$%amp;^*()_+ (целия горен ред)
Публикувано14.03.05 23:53



за вин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



Пак до МФЦ опряхме, а?
Тук няма да дам компетентен съвет. Ще задам един въпрос.
Да предположим, че подобно приложение е вече написано.
Интересно ми е какво ще стане, когато условията в АССЕРТ-ите не са изпълнени, но АССЕРТ-ите не са компилирани (в релеасе например). Какво ще стане?
Ще си модифицираме кода за релеасе? Според мен това е безумие, ползващите МФЦ страдат от липса на въображение, а МФЦ само по себе си трябва да бъде забранено, защото провокира вредни мисли и навици.



Тема Re: стрингове дал господнови [re: eдc]  
Автор ~!@$%amp;^*()_+ (целия горен ред)
Публикувано15.03.05 01:35



прочетох и не научих нищо ново

дефакот то Е 0 terminated, точно затова може да бъде подаван като параметър (почти) навсякъде където се очаква wide string.



Тема Re: стрингове дал господнови [re: ~!@$%amp;^*()_+]  
Авторeдc (Нерегистриран)
Публикувано15.03.05 02:16



Щом така си прочел... добре...



Тема ноо ти разбира главатанови [re: Xyю Xyeв Xyиcтия]  
Автор zaphod (void *lpNothing)
Публикувано15.03.05 08:02



аз лично предпочитам колекциите на мфц пред колекциите на стл. а по въпроса с ассертите - ами в много случаи нищо няма да стане, например точно в този. на практика стринга има терминираща нула, така че асерта дори да го няма, програмата няма да изгърми. в други случаи разбира се програмата гърми. аз много рядко ползвам асерти, защото като забравя нещо, програмата си гръмва и виждаш къде е станал фала. ползвам ги само там където няма да изгърми, но където логиката ми може да е объркана. има много случаи, когато лошите новини трябва да ги получиш докато си в дебъг, а не когато вече си в релийз. както казват по сватбите "който има нещо да казва, да го каже сега, ако не да замълчи завинаги". аз лично например във всяка програма си сетвам настройките на флоат операциите да ми дават ексепшън при делене на нула в дебъг, но да си траят в релийз.




NE SUTOR ULTRA CREPIDAM


Тема Re: Много правилнонови [re: eдc]  
Автор Duncan Griffin (Потребител)
Публикувано15.03.05 10:02



Вметка: Паскалския стринг не е ASCIIZ, а е LPString (Length Prefixed String) - първият байт съдържа броя на знаците в стринга, и няма нужда от терминираща нула (нулата се възприема като обикновен елемент).

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.


Тема Re: Много правилнонови [re: Duncan Griffin]  
Автор Pekoнcтpykтop (Нерегистриран)
Публикувано15.03.05 12:39



Само усложнява разработката и под 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



Драги ми Смехурко,
И аз като теб бях луд фен на МФЦ. И съжалявам за което. Отне ми близо година за да се отуча от шибаното МФЦ. И сега никога не бих се захванал да пиша нещо на МФЦ, освен ако няма изрични изисквания за това, независещи от моите предпочитания.Като всеки ревностен почитател на МФЦ е логично да не видиш, че МФЦ не е най-доброто. Че има и други, по-прости, по-удобни, по-лесни за ползване неща. А това, че АССЕРТ-ите ги ползваш не по предназначение си е твой проблем. Не е тук мястото да ти обяснявам за идеята на АССЕРТ-а и дали той се яде.




Страници по тази тема: 1 | 2 | 3 | 4 | (покажи всички)
*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.