Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> What is wrong in C++? MS VC++ 6.00 
:(
    Опции темы
shedon
Дата 22.11.2004, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Цитата(JackYF @ 21.11.2004, 21:54)
можно только так:


Код 

char* mystr1="abcde"

это неправильно, над так:
char mystr1[]="abcde";

Просто попробуйте соед. код:
Код

char *s = "dfjd";
char z[] = "dfjd";

s[0] ^= s[1];   // Что будет тут
z[0] ^= z[1];   // А что тут ?
   return 0;



--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
!Жека!
Дата 27.11.2004, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Цитата(alex22222 @ 22.11.2004, 17:49)
Однако почему mystr2 рассматривается как константный указатель, остается вопросом

Все очень просто.
Ты объявляеш указатель:
Код
char *mystr2;

При этом компилятор не выделяет ни какой памяти, он просто запоминает имя и тип переменной.
Этот указатель не начто не указывает - так.

Далее ты пишеш:
Код
mystr2 = "asdfghjkl";

Здесь компилятор делает небольшую хитрость он выделяет память и иницилизирует ее строкой "asdfghjkl".
Т.е. он выполняет все так как если бы ты написал:
Код
char *mystr2 = "asdfghjkl";
а это константный указатель.
Понял smile
PM MAIL   Вверх
bel_nikita
Дата 27.11.2004, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



!Жека!
Цитата
а это константный указатель.
Понял smile 
Неа smile
Какой же это константный указатель, коли там const нет?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 27.11.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Условно - константный.
Или константный для дибагера smile
Подойдёт? smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
!Жека!
Дата 27.11.2004, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Путь ты и
Код

const
не написал, но при этом ты не иницилизировал свои указатели (
Код

char *mystr
) по этому компилер при первом присваивании значения выделяет память, стоько сколько нужно и константит его. По этому что бы избежать таких вот оштбок необходимо вседа иницилизировать указатели.
Хотя все это зависит от среды программирования и настроек. Вот уменя такой фокус не прошел с выделением и памяти. пришлось писать так:
Код

char *mystr1 = new char[10];
char *mystr2 = "qwerrt";

При этом если ты напишеш так:
Код

char mystr[10];
// а потом
*mystr++ = что-то там

то тоже получиш ошибку, а почему - догадайся. А вообще выкинь тот учебник в котором ты взял такой пример. Это плохой пример или перечитай заново эту статью может что и упустил.[s]
PM MAIL   Вверх
sergejzr
Дата 27.11.2004, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата
то тоже получиш ошибку, а

А ты в релиз скомпиль, ошибка пропадёт smile
Это вечный спор и мы его с Никитой уже долго вели smile
При этом каждый при своём остаётся smile
ПС:
!Жека!, тоже CTRL+S 'ом пытаешься мессагу отправить? smile




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
!Жека!
Дата 27.11.2004, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Цитата(sergej @ 27.11.2004, 22:45)
тоже CTRL+S 'ом пытаешься мессагу отправить

Да!!! smile
Ну и на этом закончим!!!
PM MAIL   Вверх
Волод
Дата 27.11.2004, 23:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прошу прощения, что вмешиваюсь, но меня заинтересовало начало кода с выделением памяти под указатель *mystr2. Как я понял, мы "разносим" указатели в пространстве, выделяя под каждый из них свой блок памяти. А как сделать так, чтобы оба указателя ссылались на один блок? Если это нельзя сделать через *mystr2 = *mystr1; - тогда как?

И второй вопрос по циклу:
Код

while(*mystr2++=*mystr1++);

ЧТо здесь является признаком окончания цикла? Если это выражение при очередном присвоении возвращает ложь, то как и почему? - как здесь происходит контроль выхода за пределы массива?

  Вверх
bel_nikita
Дата 28.11.2004, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



shedon
Цитата
Просто попробуйте соед. код:
Код
char *s = "dfjd";
char z[] = "dfjd";

s[0] ^= s[1];   // Что будет тут
z[0] ^= z[1];   // А что тут ?
  return 0;

Пробывал, в релиз MSVC6 smile Работает smile
!Жека!
Цитата
Ну и на этом закончим!!!
Так, соббсно вопрос не разрешен. Сдаешься? smile

Цитата
А вообще выкинь тот учебник в котором ты взял такой пример
Любите книгу - источник знаний! ( М.Горький ) smile
Цитата

Код
char *mystr2 = "asdfghjkl";
а это константный указатель.
Понял 
Ну какой же это константный указатель? Я бы на твоем месте взял бы учебник полистал, который ты мне предложил выкинуть smile
Вот, константный указатель:
Код
char* const constp = (char*)"dfjd";
И в этом случае, компилятор однозначно будет бить по рукам, вот, к примеру:
Код
 char* const constp = (char*)"dfjd";
 char* p = "dfjd";

 p = (char*)12;
 constp = (char*)12;

так, что char* p = "dfjd"; - никакой не константный указатель.

Волод
Цитата
И второй вопрос по циклу:
Код
while(*mystr2++=*mystr1++);
ЧТо здесь является признаком окончания цикла? Если это выражение при очередном присвоении возвращает ложь, то как и почему? - как здесь происходит контроль выхода за пределы массива?

По другому это выглядит так:
Код
int len=strlen(mystr1);
 for (int i=0; i<len; ++i )
 {
  mystr2[i] = mystr1[i];
 }
 mystr2[i] = 0;


Вернемся к нашей проблеме.
sergej.z
Цитата
Условно - константный.
Или константный для дибагера
Подойдёт? 
Неа smile То что константно в Си, тому приписывается идентификатор const
А проблема, то что в дебаг не работает, а в релиз работает - это все в распеределении памяти smile
Вот, простенький примерчик:
Код
 char *s  = "dfjd";
 printf("\ns = %p",s);
 *s = 2;

Запустите его в дебаг, потом в релиз. И внимательно посмотрите на то, что выпишет printf. Запишите адреса на бумажку. Потом для укрепления теории smile Выполните в релиз:
Код
__asm{
   mov     byte ptr ds:[вставте сначала один адрес, который вы выписали на бумажку. потом второй],2
 };

Я так понимаю, делается это дебагером специально, чтобы в релиз при оптимизации не возникали проблемы.
Кстати, в MSVC 7.1 выдает экзепшен как в дебаг, так и в релиз. Там, немного по другому память выделяется

З.Ы.: кому интересно отличие char*p от char p[] читаем здесь . Потом запускам дебаг режим и смотрим, что компилятор генерит в этих случаях.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 28.11.2004, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Я всё же попытаюсь коротко ответить на сам вопрос Волод smile

Цитата
Если это нельзя сделать через *mystr2 = *mystr1; - тогда как?

оператор * - содержимое указателя. В этом случае то же, что и [0].
То есть *mystr2 == mystr2[0]
Чтобы указатель показывал на другой участок памяти делаем просто:
mystr2 = mystr1
------------------
Цитата
while(*mystr2++=*mystr1++);

вот когда содержимое указателя mystr1 станет 0. цикл и остановится smile





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 28.11.2004, 18:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











sergej.z, спасибо. Ведь знал, что после обьявления указателя обращение к нему идет без оператора*- и вот надо же, стал читать чужой листинг и запарил.
  Вверх
sergejzr
Дата 28.11.2004, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Не проблема smile Все через это проходили smile

ПС:
Добро пожаловать к нам на форум! smile Регистрируйтесь, Вам откроются новые возможности smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1157 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.