Re[3]: Строки в С и С++
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.04 20:53
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Ну, тут Павел по большей части ответил — но я, как автор, должен сам реагировать .

И это правильно! А я уже думал ты отсиживаешься, а оказывается мужик!

V>Я хотел продемонстрировать, что С-строки важны, например, при работе с API. В С++ C-строки используются очень мало.

Это ясно. Просто удивило что на таком материале вдруг всплыло WinAPI.

V>Тут целиком присоединяюсь к Павлу.

Ну вы меня уже и убедили

V>Можно пример со ссылками? Действительно интересно. Я был уверен, что Unicode — всегда два байта.


Surrogates
There is a need to support more characters than the 65,536 that fit in the 16-bit Unicode code space. For example, the Chinese speaking community alone uses over 55,000 characters. To answer this need, the Unicode Standard defines surrogates. A surrogate or surrogate pair is a pair of 16-bit Unicode code values that represent a single character. The first (high) surrogate is a 16-bit code value in the range U+D800 to U+DBFF. The second (low) surrogate is a 16-bit code value in the range U+DC00 to U+DFFF. Using surrogates, Unicode can support over one million characters. For more details about surrogates, refer to The Unicode Standard, version 2.0.

Windows 2000 introduces support for basic input, output, and simple sorting of surrogates. However, not all system components are surrogate compatible. Also, surrogates are not supported in Windows 95/98/Me.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_192r.asp

V>Присоединяюсь к Павлу. Попробую уточнить. Передаются в том смысле, что функция принимает эти данные и каким-то образом использует их.

Ну не каким-то. Вся суть в том что способ стандартизирован. В этом смысле 2 разных пункта: указатели и массивы — выглядят странно и запутывающе. Последнее (с учётом потенциальной аудитории) меня и огорчило.

V>Именно так. Леночкой Гименеевой. Природа связи между массивами и указателями — очень обширная тема, чуть-чуть затронутая в начале.


Не такая уж обширная. Просто надо сказать, что любой массив элементов типа TYPE можно расматривать и как указатель TYPE * на первый элемент. Ну и обратно указатель можно рассматривать как массив. Преобразования туда-сюда выполняются компилятором неявно, по мере необходимости. Именно из-за этих преобразований можно написать так
void f(char *);
char str[] = "text";
f(str); // Если бы преобразования не было, пришлось бы писать f(&str[0]);

Для начинающего вполне достаточно.

V>

V>Символьные литералы из расширенного набора записываются в виде L'ab', при этом количество символов между одиночными кавычками и их значение зависят от реализации и соответствуют типу wchar_t.

Ну вот так и напишите. А то я это склоне читать как присваивание 16битной переменной 32битного значения.

V>Попробуй, например, перемножить два указателя. Подсказка: см. стандарт 1998 г, параграф 5.6, пункт 2.

А складывать-вычитать?

A>>Здесь стоило бы ИМХО упомянуть StrSafe.h Он хотя и не стандартный, но

A>>1) Microsoft Visual C++ не самый забытый компилятор
A>>2) Для новичков (и тех кто боится переполнения буффера) самое то.
A>>3) Другие не стандартный функции от Microsoft в статье упоминаются

V>Я уже отметил, с какой целью я употребил функцию SetWindowText.

Причём здесь SetWindowText?. Пункт 3 это намёк на itoa, ltoa

A>>for (unsigned int i = 0, len = strlen(str); i < len; i++)

V>Считается, что и i, и str определены где-то ранее.
Я про прения выше — типа строка константная, а считается её длина много раз.

V>А что, в самом деле трудно?

Мне не трудно, не хочу себя хвалить, но ты для специалистов моего уровня писал? Наверное несколько ниже не так ли?

V>В справке к своему компилятору, в стандарте, в книгах. Уж больно флагов там много, приводить все описание целиком.

Тогда лучше всего 2 ссылки. На главу стандарта и на MSDN.

V>Вопрос не ко мне — я отвечать не буду.

И не надо. Пиши много хороших статей — вот достойный ответ.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Строки в С и С++
От: artelk  
Дата: 03.01.04 09:13
Оценка:
А>В данном фрагменте
А>for (i=0;i<strlen(str);i++) {
А> // работа со строкой, не изменяющая ее длину
А>}

А>str — это const char*. Компилятор сможет заменить вызовы strlen(str) на константу?


#include <string.h>
int main (){
const char* s1="aaa";
const char* s2="aaaaaaaaaa";
int i1=strlen(s1);//i1=3
s1=s2;//
int i2=strlen(s1);//i2=10
}

То есть на этапе компилляции вычислять strlen от const char * нельзя. Если бы
const char* const s3="sdfdsfdsf";
то strlen(s3) могло бы быть заменено константой, хотя никто не гарантирует, что это будет правильным:
кто-нибудь свободо применить const_cast и все испортить
Re[4]: Строки в С и С++
От: Павел Кузнецов  
Дата: 03.01.04 09:16
Оценка:
Здравствуйте, adontz, Вы писали:

V>> Можно пример со ссылками? Действительно интересно. Я был уверен, что

V>> Unicode — всегда два байта.

В более новых версиях уже 4.

a>

a> refer to The Unicode Standard, version 2.0.


Ну, это уже очень старенький Unicode

a> Просто надо сказать, что любой массив элементов типа TYPE можно

a> расматривать и как указатель TYPE * на первый элемент.
a> Ну и обратно указатель можно рассматривать как массив. <...>

Хм... А разве именно это не говорится в начале статьи?

Предполагается, что читателю знакомы следующие особенности
связи между массивами и указателями:

Если вышеприведенные высказывания вызывают у вас затруднения, рекомендую сначала
разобраться с этим вопросом, а уже потом читать эту статью.


A>>> Здесь стоило бы ИМХО упомянуть StrSafe.h <...>


V>> Я уже отметил, с какой целью я употребил функцию SetWindowText.


a> Причём здесь SetWindowText?. Пункт 3 это намёк на itoa, ltoa


В отличие от StrSafe.h, itoa, ltoa etc. поддерживаются многими компиляторами,
а не только VC++.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Строки в С и С++
От: Vamp Россия  
Дата: 03.01.04 10:59
Оценка:
V>>Я хотел продемонстрировать, что С-строки важны, например, при работе с API. В С++ C-строки используются очень мало.
A>Это ясно. Просто удивило что на таком материале вдруг всплыло WinAPI.
Общеизвестное внешнее API, распространенная функция из него, идеальная демонстрация строкового литерала. Полагаю, MacApi известно гораздо меньше.

A>Не такая уж обширная. Просто надо сказать, что любой массив элементов типа TYPE можно расматривать и как указатель TYPE * на первый элемент. Ну и обратно указатель можно рассматривать как массив.

Ну,придираться, так придираться . указатель TYPE * — это TYPE**, то есть указатель на указатель. Точнее надо быть.
Во-вторых, именно это и сказано в начале статьи.

A>Ну вот так и напишите. А то я это склоне читать как присваивание 16битной переменной 32битного значения.

Ну, это лично Ваша склонность .

V>>Попробуй, например, перемножить два указателя. Подсказка: см. стандарт 1998 г, параграф 5.6, пункт 2.

A>А складывать-вычитать?

Складывать указатели нельзя.
Их, правда, можно складывать с интегральными или перечислимыми типами. Вычитать можно.

Применение же этих операций к строкам либо вообще запрещено, либо, что еще хуже, их результат в большинстве случаев далек от ожидаемого.

Ну, так и есть. Например, результатом
char* s="Hell";
s+='o';

не будет str=="hello", хотя код скомпилируется. Вычитание и сложение указателей применительно ко строкам не позволяет складывать и вычитать строки в лексикографическом смысле.

V>>Я уже отметил, с какой целью я употребил функцию SetWindowText.

A>Причём здесь SetWindowText?. Пункт 3 это намёк на itoa, ltoa
Они поддерживаются не только в MSVC.

A>
A>>>for (unsigned int i = 0, len = strlen(str); i < len; i++)
A>

V>>Считается, что и i, и str определены где-то ранее.
A>Я про прения выше — типа строка константная, а считается её длина много раз.
А это откуда вообще взялось? Я еще тогда удивился. В тексте статьи сказано

// работа со строкой, не изменяющая ее длину

О константности ни слова. Впрочем, у некоторых людей завидная способность читая видеть то, что они хотят видеть, а не то, что написано.

V>>А что, в самом деле трудно?

A>Мне не трудно, не хочу себя хвалить, но ты для специалистов моего уровня писал? Наверное несколько ниже не так ли?
Мне всегда трудно оценить сложность той или иной задачи, но если она решается "в лоб", то я склонен считать ее простой. В самом деле, функция-то из пары десятков строчек. И даже без (явных) автоматов. И кстати, статья ориентирована не столько на тех, кто не умеет программировать вообще, сколько на тех, кто не умеет программировать именно на С. А для человека с опытом работы на любом алгоритмическом языке поставленная задача вообще трудности не представляет.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Строки в С и С++
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.01.04 14:12
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>В более новых версиях уже 4.

Это не новые, это другие версии. 2-х байтный ещё никто не отменял и скорее всего им и будут пользоватся ещё очень долго.

ПК>Хм... А разве именно это не говорится в начале статьи?


Тем страннее, что потом массивы и указатели рассматриваются отдельно. К тому же примера нет. А начинающему пример очень важен.

С наступившим!
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Строки в С и С++
От: achp  
Дата: 03.01.04 14:24
Оценка:
Здравствуйте, adontz, Вы писали:

ПК>>В более новых версиях уже 4.

A>Это не новые, это другие версии. 2-х байтный ещё никто не отменял и скорее всего им и будут пользоватся ещё очень долго.

Эээ... По-моему, ты путаешь кислое с пресным. Смотри здесь
Автор: sss_dr
Дата: 08.08.03
и здесь
Автор:
Дата: 03.10.03
.
Да здравствует ИМХО!
Re[7]: Строки в С и С++
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.01.04 14:45
Оценка:
Здравствуйте, achp, Вы писали:

A>Эээ... По-моему, ты путаешь кислое с пресным. Смотри здесь
Автор: sss_dr
Дата: 08.08.03
и здесь
Автор:
Дата: 03.10.03
.


А я что сказал? Есть версия где под символ отводится 2 байта и используются суррогаты, есть где 4. Или я не так прочёл топики?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Строки в С и С++
От: achp  
Дата: 03.01.04 14:59
Оценка: 36 (3)
Здравствуйте, adontz, Вы писали:

A>А я что сказал? Есть версия где под символ отводится 2 байта и используются суррогаты, есть где 4. Или я не так прочёл топики?


Да нет, просто есть один, единый стандарт Уникод. Он определяет два набора символов: "узкий" UCS-2 и "широкий" UCS-4. Из них последний в себя первый включает. Логически текст составлен из последовательности симовлов и управляющих кодов. Физическое представление текста выполняется в соответствии с кодировками. Одна из них, та, которую мы обыкновенно подразумеваем, говоря "строки в Уникоде", — UTF-16.

UTF-16 определяет последовательности 16-битовых байтов, используемые для записи символов из набора символов UCS-4.

Есть еще другая кодировка, обычно так и называемая UCS-4, прямо отображающая все символы UCS-4 на 32-битовые байты.

Поэтому нельзя говорить о "двух версиях" Уникода. Можно говорить о двух различных кодировках, примерно так же, как мы говорим о кодировках ISO-8859-5 и Windows-1251.

Примечание. Слово "байт" здесь применено не в смысле байта языка Си и не в смысле байта аппаратуры.
Да здравствует ИМХО!
Re[4]: Строки в С и С++
От: achp  
Дата: 03.01.04 20:59
Оценка: +1
Здравствуйте, artelk, Вы писали:

A>#include <string.h>
A>int main (){
A>  const char* s1="aaa";
A>  const char* s2="aaaaaaaaaa";
A>  int i1=strlen(s1);//i1=3
A>  s1=s2;// :)
A>  int i2=strlen(s1);//i2=10 :)
A>}


A>То есть на этапе компилляции вычислять strlen от const char * нельзя.


Отчего же? Компилятору вполне по силам установить, на какую строку будет ссылаться s1 по ходу исполнения данного участка кода...

A>Если бы

A>const char* const s3="sdfdsfdsf";
A>то strlen(s3) могло бы быть заменено константой, хотя никто не гарантирует, что это будет правильным:
A>кто-нибудь свободо применить const_cast и все испортить

А вот здесь уже у Стандарта все шито-крыто. При неконстантном доступе к объекту, изначально объявленному константным, (каковой доступ может быть произведен посредством а) явного const_cast и b) приведением типа строкового литерала) программа имеет неопределенное поведение. То есть, если все пойдет не так как надо, пеняйте на себя, все выкрутасы вы делаете на свой страх и риск.
Re[9]: Строки в С и С++
От: FreshMeat Россия http://www.rsdn.org
Дата: 05.01.04 07:59
Оценка:
Здравствуйте, achp, Вы писали:

A>Да нет, просто есть один, единый стандарт Уникод. Он определяет два набора символов

Стало любопытно, полез гуглить и почти сразу наткнулся на The Online Edition of The Unicode Standard, Version 3.0.
Хорошо там, где мы есть! :)
Re[5]: Строки в С и С++
От: jazzer Россия Skype: enerjazzer
Дата: 05.01.04 10:19
Оценка: 38 (3)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ты неверно понимаешь, как "работают" многосимвольные литералы. Типом L'...'

ПК>вне зависимости от количества символов остается wchar_t, равно как типом
ПК>'...' — char.

типом '...' является char только в случает, если там в кавычках всего один символ, а если несколько — это уже int.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Строки в С и С++
От: jazzer Россия Skype: enerjazzer
Дата: 05.01.04 10:26
Оценка: +1
Здравствуйте, Vamp, Вы писали:

V>>>Я хотел продемонстрировать, что С-строки важны, например, при работе с API. В С++ C-строки используются очень мало.

A>>Это ясно. Просто удивило что на таком материале вдруг всплыло WinAPI.
V>Общеизвестное внешнее API, распространенная функция из него, идеальная демонстрация строкового литерала. Полагаю, MacApi известно гораздо меньше.

В MacAPI тебе такое и не удастся проделать — там используются паскалевские строки, в которых в первом байте идет длина строки, и, соответственно, не нужен завершающий нуль, а получение длины строки сводится к простому чтению первого символа.

офтопик, конечно, просто наболело
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Строки в С и С++
От: Павел Кузнецов  
Дата: 05.01.04 12:49
Оценка:
Здравствуйте, jazzer, Вы писали:

j> типом '...' является char только в случает, если там в кавычках всего

j> один символ, а если несколько — это уже int.

И действительно...
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Строки в С и С++
От: Vamp Россия  
Дата: 05.01.04 16:25
Оценка:
J>В MacAPI тебе такое и не удастся проделать — там используются паскалевские строки, в которых в первом байте идет длина строки, и, соответственно, не нужен завершающий нуль, а получение длины строки сводится к простому чтению первого символа.
Век живи — век учись .
Вот еще одна причина к использованию именно WinAPI. ^)
Да здравствует мыло душистое и веревка пушистая.
Re: Строки в С и С++
От: Mazay Россия  
Дата: 15.01.04 10:40
Оценка:
У меня только 1 вопрос: когда 2-я часть выйдет?
ИМХО статья нужная. Может кто-то это всё и знает, но мне она понравилась.
Главное гармония ...
Re[2]: Строки в С и С++
От: Vamp Россия  
Дата: 15.01.04 11:10
Оценка:
M>ИМХО статья нужная. Может кто-то это всё и знает, но мне она понравилась.
Вероятно, в начале февраля. Если конечно примут, а не скажут, что судя по реакции на первую часть она никому не нужна .
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Строки в С и С++
От: Павел Кузнецов  
Дата: 16.01.04 15:23
Оценка:
Здравствуйте, Vamp, Вы писали:

V> Вероятно, в начале февраля. Если конечно примут <...>


Если со второй частью все будет в порядке — примут.
Вне зависимости от реакции на первую.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Строки в С и С++
От: _nn_  
Дата: 04.08.04 07:18
Оценка:
Здравствуйте, Сергей Аристов, Вы писали:

Когда вторая часть будет ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.