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

Поиск:

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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Люди, как вы не поймете! smile

нельзя использовать конструкцию типа:

Код

char* mystr1;
mystr1="abcde";


можно только так:

Код

char* mystr1="abcde"


Кажется, что отличия минимальны, но первый вариант принципиально неправильный потому что используется ПРИСВАИВАНИЕ, а второй - правильный, потому что компилятор переделывает такую запись приблизительно в

Код

char* mystr1={'a','b','c','d','e','\0'}



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sergejzr
Дата 22.11.2004, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Какая разница в этом случае?
Кроме конечно "лишнего" присваивания?


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


Эксперт
****


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

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



sergej.z
Цитата
То, что скомпиленая верся "пропускает" кучу ошибок я не спорю  Просто зачем делать эти ошибки специально ?
Это дебагер глючный! smile Если я выделил память, то ее я могу должен пользовать, как я хочу. А если я не хочу чтобы этот кусок памяти менялся я конкретно долже указать через const, т.е.:
Код
 const char* const p="NIKOMU NE DAM STROKU";

Вот, теперь я замуровал, так, что никто не доберется smile



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


Un salsero
Group Icon


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

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



bel_nikita, неа, не убедил smile
По умолчанию должно быть замуровано. А если надо, то можно и руками размуровать smile

Но помоему это дело вкуса smile т.е. "религиозная война" smile
Так что каждый при своём останется.

Но всё равно было очень интересно.
Жму руку smile


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


Эксперт
****


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

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



JackYF
Цитата
Люди, как вы не поймете! 
нельзя использовать конструкцию типа:

Неа, можно smile Можно все, что не запрещено компилятором smile

Вот, код:
Код
 char* string1;//="TRA-LA-LA";
 char* string2;//="LA-LA_TRA";

 string1 = "TRA-LA-LA";
 string2 = "LA-LA_TRA";

 char* string3="TRA-LA-LA";
 char* string4="LA-LA_TRA";

давайте посмотрим, что творит компилер:
Код

113:
114:    char* string1;//="TRA-LA-LA";
115:    char* string2;//="LA-LA_TRA";
116:
117:    string1 = "TRA-LA-LA";
004055CB   mov         dword ptr [ebp-38h],offset string "TRA-LA-LA" (00434058)
118:    string2 = "LA-LA_TRA";
004055D2   mov         dword ptr [ebp-3Ch],offset string "LA-LA_TRA" (0043403c)
119:
120:    char* string3="TRA-LA-LA";
004055D9   mov         dword ptr [ebp-40h],offset string "TRA-LA-LA" (00434058)
121:    char* string4="LA-LA_TRA";
004055E0   mov         dword ptr [ebp-44h],offset string "LA-LA_TRA" (0043403c)
122:

Так, в чем разница?

Добавлено @ 01:18
smile

sergej.z
неа, а зачем тогда вообще const? как раз для таких случаев smile
Цитата
Но всё равно было очень интересно.
Жму руку 
аналогично smile


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


Новичок



Профиль
Группа: Участник
Сообщений: 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



PM MAIL   Вверх
bel_nikita
Дата 22.11.2004, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



alex22222
Чуть было монитор не разбил smile
smile smile smile
Еще раз привожу код:
Код

// делаем свою функцию
void copy(char* out, const char* in)
{
 while (*out++ = *in++);
}

void CTestLearnDlg::OnButtontest1()
{
char mystr1[] = "CONSOLE ";
char mystr2[] = "NEA, MFC";

copy(mystr1,mystr2);

// ну, а тут выводи строки куда хочешь :)
}
Что не работает? На какой строке выдает ошибку? Какую ошибку выдает?


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


Un salsero
Group Icon


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

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



Мда.а.а ну попробуем тоже ещё раз с другой перспективы...

Строка mystr2 (не побоюсь этого слова) константна для Вижуала. Вы не можете изменять значения константной строки!

или

Компилируйте в Release.. Тогда Вижуал не будет это проверять




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


Эксперт
****


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

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



sergej.z
да не, просто надо в функцию завернуть.

Вот, рабочий код в дебаг версии:
Код

void copy(char* out, const char* in)
{
 while (*out++ = *in++);
}

int main(int argc, char* argv[])
{
 char string1[] = "TRA-LA-LA";
 char string2[] = "LA-LA_TRA";

 copy(string1,string2);

 printf("\nstring1 = %s",string1);
 printf("\nstring2 = %s",string2);

 return 0;
}

А вот, если сделаю так, то получу по рукам:
Код
...
 char string1[] = "TRA-LA-LA";
 char string1[] = "LA-LA_TRA";

 while (*string1++ = *string1++);
...


З.Ы.: все! я спасть. завтра на работу, однако...

З.Ы.2: тьфу! сегодня smile

Это сообщение отредактировал(а) bel_nikita - 22.11.2004, 02:19


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


Un salsero
Group Icon


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

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



Дык ведь он спрашивает, почему его код не работает smile


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


Новичок



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

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



Уважаемые специалисты!
Опять я повторяю, я не хочу пользоваться стандартными фукциями типа copy and etc.
Я просто пытаюсь проверить код тела функции strcpy, а она не работает!
Идет ошибка в присваивании
*string1++ = *string1++;
Иду простым путем, повторяю примеры и пытаюсь использовать исходные тексты MS, а они не работают!
Попытки "Компилируйте в Release.. " - это уход от темы и проблемы!
Помогите !!!!!!!!!!!!!!!!!!
PM MAIL   Вверх
sergejzr
Дата 22.11.2004, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(sergej @ 22.11.2004, 01:12)
Строка mystr2 (не побоюсь этого слова) константна для Вижуала. Вы не можете изменять значения константной строки!

Поэтому он иругается.
то есть

mystr2="чего нибудь";

надо заменить на

mystr2=new char[512];

И тогда mystr2 не будет константной и колпилятор ругаться не будет.





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


Новичок



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

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



Эта конструкция мне понятна.
Мне не понятно, почему нельзя делать
*string2++ = *string1++;

для примера попробуйте так:
*string1++ = *string1++;
опять ошибка!
Хотя при вызове стандартной функции strcpy, исходный текст которой я привел, все ОК.
Значит ошибка слева от = *string1++; !!!!!
Может быть надо включить какой ни будь режим типа pragma# когда в режиме MFC, подобные вещи начинают правильно работать?

PM MAIL   Вверх
sergejzr
Дата 22.11.2004, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(alex22222 @ 22.11.2004, 02:52)
Мне не понятно, почему нельзя делать
*string2++ = *string1++;


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

Попробуйте написать что нибудь типа:

Код

mystr1 = "mytest";
mystr2 = "notest";
strcpy(mystr1, mystr2);


Точно так же будет виолейшен.

ПС:
Если Вам надоели мои ответы, скажите просто smile


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


Новичок



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

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



Да это правда. Однако почему mystr2 рассматривается как константный указатель, остается вопросом. Ведь явно он не был так определен! С оператором new все идет нормально.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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