![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| JackYF |
|
||||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Люди, как вы не поймете!
нельзя использовать конструкцию типа:
можно только так:
Кажется, что отличия минимальны, но первый вариант принципиально неправильный потому что используется ПРИСВАИВАНИЕ, а второй - правильный, потому что компилятор переделывает такую запись приблизительно в
|
||||||
|
|||||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Какая разница в этом случае?
Кроме конечно "лишнего" присваивания? |
|||
|
||||
| bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
sergej.z
Вот, теперь я замуровал, так, что никто не доберется |
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
bel_nikita, неа, не убедил
По умолчанию должно быть замуровано. А если надо, то можно и руками размуровать Но помоему это дело вкуса Так что каждый при своём останется. Но всё равно было очень интересно. Жму руку |
|||
|
||||
| bel_nikita |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
JackYF
Неа, можно Вот, код:
давайте посмотрим, что творит компилер:
Так, в чем разница? Добавлено @ 01:18 sergej.z неа, а зачем тогда вообще const? как раз для таких случаев
|
||||||||
|
|||||||||
| alex22222 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 21.11.2004 Репутация: нет Всего: нет |
/*** *strncpy.c - copy at most n characters of string * * Copyright © 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: * defines strncpy() - copy at most n characters of string * *******************************************************************************/ #include <cruntime.h> #include <string.h> /*** *char *strncpy(dest, source, count) - copy at most n characters * *Purpose: * Copies count characters from the source string to the * destination. If count is less than the length of source, * NO NULL CHARACTER is put onto the end of the copied string. * If count is greater than the length of sources, dest is padded * with null characters to length count. * * *Entry: * char *dest - pointer to destination * char *source - source string for copy * unsigned count - max number of characters to copy * *Exit: * returns dest * *Exceptions: * *******************************************************************************/ char * __cdecl strncpy ( char * dest, const char * source, size_t count ) { char *start = dest; while (count && (*dest++ = *source++)) /* copy string */ count--; if (count) /* pad out with zeroes */ while (--count) *dest++ = '\0'; return(start); } Уважаемые специалисты! Я посылаю исходных код функции strcpy в MS Пожалуйста, не приплетайте сюда const! Иначе пришлю исходный текст strrev.c!!!! Почему не работает этот код void CTestLearnDlg::OnButtontest1() { char* mystr1; char* mystr2; mystr1 = "mytest"; mystr2 = "notest"; while(*mystr2++=*mystr1++); } Прошу вас не искать обходные пути, смотрите на исходный текст MS. Почему он работает, когда я вызываю функцию strcpy, а мой нет! Cordially начинающий программист Alex |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
alex22222
Чуть было монитор не разбил Еще раз привожу код:
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Мда.а.а ну попробуем тоже ещё раз с другой перспективы...
Строка mystr2 (не побоюсь этого слова) константна для Вижуала. Вы не можете изменять значения константной строки! или Компилируйте в Release.. Тогда Вижуал не будет это проверять |
|||
|
||||
| bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
sergej.z
да не, просто надо в функцию завернуть. Вот, рабочий код в дебаг версии:
А вот, если сделаю так, то получу по рукам:
З.Ы.: все! я спасть. завтра на работу, однако... З.Ы.2: тьфу! сегодня Это сообщение отредактировал(а) bel_nikita - 22.11.2004, 02:19 |
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Дык ведь он спрашивает, почему его код не работает
|
|||
|
||||
| alex22222 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 21.11.2004 Репутация: нет Всего: нет |
Уважаемые специалисты!
Опять я повторяю, я не хочу пользоваться стандартными фукциями типа copy and etc. Я просто пытаюсь проверить код тела функции strcpy, а она не работает! Идет ошибка в присваивании *string1++ = *string1++; Иду простым путем, повторяю примеры и пытаюсь использовать исходные тексты MS, а они не работают! Попытки "Компилируйте в Release.. " - это уход от темы и проблемы! Помогите !!!!!!!!!!!!!!!!!! |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Поэтому он иругается. то есть mystr2="чего нибудь"; надо заменить на mystr2=new char[512]; И тогда mystr2 не будет константной и колпилятор ругаться не будет. |
|||
|
||||
| alex22222 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 21.11.2004 Репутация: нет Всего: нет |
Эта конструкция мне понятна.
Мне не понятно, почему нельзя делать *string2++ = *string1++; для примера попробуйте так: *string1++ = *string1++; опять ошибка! Хотя при вызове стандартной функции strcpy, исходный текст которой я привел, все ОК. Значит ошибка слева от = *string1++; !!!!! Может быть надо включить какой ни будь режим типа pragma# когда в режиме MFC, подобные вещи начинают правильно работать? |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
потому что string2 константна, а Вы ей значения присваиваете. А в стандартную strcpy если Вы два константных стринга передадите, тоже будет виолейшен. Попробуйте написать что нибудь типа:
Точно так же будет виолейшен. ПС: Если Вам надоели мои ответы, скажите просто |
||||
|
|||||
| alex22222 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 21.11.2004 Репутация: нет Всего: нет |
Да это правда. Однако почему mystr2 рассматривается как константный указатель, остается вопросом. Ведь явно он не был так определен! С оператором new все идет нормально.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |