Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ / 18 сообщений из 18, страница 1 из 1
08.11.2006, 11:44
    #34111506
Oleg_2006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Я не много умею писать программы на С++, MFC-6.0
Поясните ржавому чайнику:
char *p = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Программа валится Здесь!!
...........


char p[] = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Все на месте !!
...........
Извините за нелепый вопрос, благодарю за ответ!
...
Рейтинг: 0 / 0
08.11.2006, 11:52
    #34111539
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
ну вообше-то в первом случае имеет место глобальный указатель на строковая константа, а во втором глобальный массив символов. вещи неуловимо, но разные.
...
Рейтинг: 0 / 0
08.11.2006, 12:02
    #34111581
Oleg_2006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Мой пример - это чистое воспроизведение ситуации, и я с вами согласен,
однако по ходу решения задачи мне необходимо модифицировть текст.
не проходит и следующее

int fx()
{
char *p = { UUUUUUuu};
p[0]='L';
...
Рейтинг: 0 / 0
08.11.2006, 12:12
    #34111641
kvasov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
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
...
Рейтинг: 0 / 0
08.11.2006, 12:16
    #34111665
C++
Oleg_2006Мой пример - это чистое воспроизведение ситуации, и я с вами согласен,
однако по ходу решения задачи мне необходимо модифицировть текст.
не проходит и следующее

int fx()
{
char *p = { UUUUUUuu};
p[0]='L';
Ты так и не понял, что тебе сказали! Объясняю популярно:

В случае char *p="...."; у тебя имеется некая константа ("..."), к которой ты получаешь доступ через указатель (*р). А КОНСТАНТЫ МЕНЯТЬ НЕЛЬЗЯ!!!

В случае char p[]="...."; у тебя образуется переменная (строковый массив), к которой ты получаешь доступ через указатель (*р). А ПЕРЕМЕННЫЕ МЕНЯТЬ МОЖНО!!!
...
Рейтинг: 0 / 0
08.11.2006, 12:17
    #34111672
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
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
...
Рейтинг: 0 / 0
08.11.2006, 12:27
    #34111723
C++
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 имеет размер ОДИН БАЙТ .
Идите, учите матчасть...
...
Рейтинг: 0 / 0
08.11.2006, 12:43
    #34111812
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Станислав С 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 имеет размер ОДИН БАЙТ .
Идите, учите матчасть...
минимально адресуемую ячейку ?
...
Рейтинг: 0 / 0
08.11.2006, 13:15
    #34112019
C++
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 */
....
...
Рейтинг: 0 / 0
08.11.2006, 13:26
    #34112087
kvasov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Станислав СДа, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ .
Идите, учите матчасть...

тогда автор программы пусть не обманывается, что он записал букву "Х"
он записал цифру, а букву под этой цифрой юзер может прочитать совсем другую

p[0]='X' - лукавый путь

почему бы ему не написать так
p[0]=0x100

раз смысла нет, то пусть его и не будет
...
Рейтинг: 0 / 0
08.11.2006, 13:34
    #34112121
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Станислав С 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 имеет один байт , но это же при желании можно изменить. :)
...
Рейтинг: 0 / 0
08.11.2006, 14:49
    #34112523
Oleg_2006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Станислав С спосибо за помощь, я могу согласиться с Вами, что
char *p= " .. " и char p[]= " .. ";
разные вещи , но защита от изменений в С++ реализуется соответствующей декларацией.
и проверяется на уровне трансляции.
Описание Static это не защита от изменей.
Пример
f()
{ char *p= " .......";
p[0]='.'; // Это валиться
.....
все будет размещено в СТЕКЕ и причем здесь
< есть защита от записи в статическую память>
...
Рейтинг: 0 / 0
08.11.2006, 16:04
    #34112977
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Oleg_2006 O> f()
O> { char *p= " .......";
O> p[0]='.'; // Это валиться
O> .....
O> все будет размещено в СТЕКЕ и причем здесь
O> < есть защита от записи в статическую память>с чего ты взял, что " ......." будет в стеке ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
08.11.2006, 16:44
    #34113159
Oleg_2006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Благодарю всех прокомментировавших мой вопрос. Вы правы
char *p = " mnnbb" ;
- формируется константый указатель и не следует его использовать для модификации. Только вылетает программа странно - рушится даже студия. Это я хотел использовать для инициализации
некоторой весьма не простой структуры, которая служит информационной базой при генерации предложения SELECT языке SQL. Эту неприятность можно преодалеть. Еще раз благодарю всех за помощь.
...
Рейтинг: 0 / 0
09.11.2006, 10:41
    #34114723
bemtaill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
вообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005
...
Рейтинг: 0 / 0
09.11.2006, 10:43
    #34114739
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
bemtaillвообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005

В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails
...
Рейтинг: 0 / 0
09.11.2006, 10:58
    #34114849
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
Akh bemtaillвообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005

В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails

В Билдере результат :)
АТТ
ВТТ
...
Рейтинг: 0 / 0
09.11.2006, 11:57
    #34115222
bemtaill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++
JibSkeart Akh bemtaillвообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005

В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails

В Билдере результат :)
АТТ
ВТТ


A вот это уже совсем беспредел:))
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]