|
|
|
C++
|
|||
|---|---|---|---|
|
#18+
Я не много умею писать программы на С++, MFC-6.0 Поясните ржавому чайнику: char *p = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Программа валится Здесь!! ........... char p[] = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Все на месте !! ........... Извините за нелепый вопрос, благодарю за ответ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 11:44 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
ну вообше-то в первом случае имеет место глобальный указатель на строковая константа, а во втором глобальный массив символов. вещи неуловимо, но разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 11:52 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Мой пример - это чистое воспроизведение ситуации, и я с вами согласен, однако по ходу решения задачи мне необходимо модифицировть текст. не проходит и следующее int fx() { char *p = { UUUUUUuu}; p[0]='L'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 12:02 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Oleg_2006Я не много умею писать программы на С++, MFC-6.0 Поясните ржавому чайнику: char *p = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Программа валится Здесь!! ........... char p[] = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Все на месте !! ........... Извините за нелепый вопрос, благодарю за ответ! позвольте вставить свое "ква" пока в С не написал ни строчки, решил пока тренироваться в консалтинге :-) на мой взгляд оба примера неправильны в первом примере - чтобы взять первый элемент массива нужно знать размер элемента - размера вообще нет, поэтому ошибка во втором примере в строке нет кодировки размер одного элемента может быть 1 байт или 2 байта как в Юникод или даже 5 байтов как в UTF8 строка без кодировки бессмысленна надо явно задать кодировку Юникод вот так char p[] = L"TTTTTTTTTTTTTTTTTTTT"; ----------- For the latest version of CityDesk, the web site management software published by my company, we decided to do everything internally in UCS-2 (two byte) Unicode, which is what Visual Basic, COM, and Windows NT/2000/XP use as their native string type. In C++ code we just declare strings as wchar_t ("wide char") instead of char and use the wcs functions instead of the str functions (for example wcscat and wcslen instead of strcat and strlen). To create a literal UCS-2 string in C code you just put an L before it as so: L"Hello". http://www.joelonsoftware.com/articles/Unicode.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 12:12 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Oleg_2006Мой пример - это чистое воспроизведение ситуации, и я с вами согласен, однако по ходу решения задачи мне необходимо модифицировть текст. не проходит и следующее int fx() { char *p = { UUUUUUuu}; p[0]='L'; Ты так и не понял, что тебе сказали! Объясняю популярно: В случае char *p="...."; у тебя имеется некая константа ("..."), к которой ты получаешь доступ через указатель (*р). А КОНСТАНТЫ МЕНЯТЬ НЕЛЬЗЯ!!! В случае char p[]="...."; у тебя образуется переменная (строковый массив), к которой ты получаешь доступ через указатель (*р). А ПЕРЕМЕННЫЕ МЕНЯТЬ МОЖНО!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 12:16 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
kvasov k> в первом примере - чтобы взять первый элемент массива k> нужно знать размер элемента - размера вообще нет, поэтому k> ошибкаты с пассалем не попутал, а ? :) kvasov k> во втором примере в строке нет кодировки k> размер одного элемента может быть 1 байт или 2 байта как в k> Юникод или даже 5 байтов как в UTF8 строка без кодировки k> бессмысленна надо явно задать кодировку Юникод k> вот так k> char p[] = L"TTTTTTTTTTTTTTTTTTTT";не уверен - не обгоняй скорее всего в вижуале есть защита от записи в статическую память Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 12:17 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
kvasov Oleg_2006Я не много умею писать программы на С++, MFC-6.0 Поясните ржавому чайнику: char *p = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Программа валится Здесь!! ........... char p[] = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Все на месте !! ........... Извините за нелепый вопрос, благодарю за ответ! позвольте вставить свое "ква" пока в С не написал ни строчки, решил пока тренироваться в консалтинге :-) на мой взгляд оба примера неправильны в первом примере - чтобы взять первый элемент массива нужно знать размер элемента - размера вообще нет, поэтому ошибка во втором примере в строке нет кодировки размер одного элемента может быть 1 байт или 2 байта как в Юникод или даже 5 байтов как в UTF8 строка без кодировки бессмысленна надо явно задать кодировку Юникод вот так char p[] = L"TTTTTTTTTTTTTTTTTTTT"; ----------- "Иногда лучше жевать чем говорить"(с) Да, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ . Идите, учите матчасть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 12:27 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Станислав С kvasov Oleg_2006Я не много умею писать программы на С++, MFC-6.0 Поясните ржавому чайнику: char *p = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Программа валится Здесь!! ........... char p[] = "TTTTTTTTTTTTTTTTTTTT"; int fx() { p[0]='X'; Все на месте !! ........... Извините за нелепый вопрос, благодарю за ответ! позвольте вставить свое "ква" пока в С не написал ни строчки, решил пока тренироваться в консалтинге :-) на мой взгляд оба примера неправильны в первом примере - чтобы взять первый элемент массива нужно знать размер элемента - размера вообще нет, поэтому ошибка во втором примере в строке нет кодировки размер одного элемента может быть 1 байт или 2 байта как в Юникод или даже 5 байтов как в UTF8 строка без кодировки бессмысленна надо явно задать кодировку Юникод вот так char p[] = L"TTTTTTTTTTTTTTTTTTTT"; ----------- "Иногда лучше жевать чем говорить"(с) Да, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ . Идите, учите матчасть... минимально адресуемую ячейку ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 12:43 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
JibSkeart минимально адресуемую ячейку ? Не знаю... Единственное, что я нашел: /*** *limits.h - implementation dependent values * * Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: * Contains defines for a number of implementation dependent values * which are commonly used in C programs. * [ANSI] * * [Public] * ****/ ... #define CHAR_BIT 8 /* number of bits in a char */ .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 13:15 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Станислав СДа, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ . Идите, учите матчасть... тогда автор программы пусть не обманывается, что он записал букву "Х" он записал цифру, а букву под этой цифрой юзер может прочитать совсем другую p[0]='X' - лукавый путь почему бы ему не написать так p[0]=0x100 раз смысла нет, то пусть его и не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 13:26 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Станислав С JibSkeart минимально адресуемую ячейку ? Не знаю... Единственное, что я нашел: /*** *limits.h - implementation dependent values * * Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: * Contains defines for a number of implementation dependent values * which are commonly used in C programs. * [ANSI] * * [Public] * ****/ ... #define CHAR_BIT 8 /* number of bits in a char */ .... Ну по умолчанию да, char имеет один байт , но это же при желании можно изменить. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 13:34 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Станислав С спосибо за помощь, я могу согласиться с Вами, что char *p= " .. " и char p[]= " .. "; разные вещи , но защита от изменений в С++ реализуется соответствующей декларацией. и проверяется на уровне трансляции. Описание Static это не защита от изменей. Пример f() { char *p= " ......."; p[0]='.'; // Это валиться ..... все будет размещено в СТЕКЕ и причем здесь < есть защита от записи в статическую память> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 14:49 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Oleg_2006 O> f() O> { char *p= " ......."; O> p[0]='.'; // Это валиться O> ..... O> все будет размещено в СТЕКЕ и причем здесь O> < есть защита от записи в статическую память>с чего ты взял, что " ......." будет в стеке ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 16:04 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Благодарю всех прокомментировавших мой вопрос. Вы правы char *p = " mnnbb" ; - формируется константый указатель и не следует его использовать для модификации. Только вылетает программа странно - рушится даже студия. Это я хотел использовать для инициализации некоторой весьма не простой структуры, которая служит информационной базой при генерации предложения SELECT языке SQL. Эту неприятность можно преодалеть. Еще раз благодарю всех за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 16:44 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
вообще странно, но : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. компилит, запускает. работает без ошибок, но вывод такой: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 10:41 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
bemtaillвообще странно, но : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. компилит, запускает. работает без ошибок, но вывод такой: Код: plaintext 1. В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 10:43 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
Akh bemtaillвообще странно, но : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. компилит, запускает. работает без ошибок, но вывод такой: Код: plaintext 1. В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails В Билдере результат :) АТТ ВТТ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 10:58 |
|
||
|
C++
|
|||
|---|---|---|---|
|
#18+
JibSkeart Akh bemtaillвообще странно, но : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. компилит, запускает. работает без ошибок, но вывод такой: Код: plaintext 1. В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails В Билдере результат :) АТТ ВТТ A вот это уже совсем беспредел:)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2006, 11:57 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34114739&tid=2030083]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 468ms |

| 0 / 0 |
