cannot convert from 'char []' to 'char [20]'

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
MrBrain
Сообщения: 24
Зарегистрирован: 14 май 2009, 16:17

Помогите пожалуйста! Такой код:

Код: Выделить всё

class birthday: public date
{
private:
	char ima[20], fam[20];
public:
	birthday (char im[20]="Vasa", char fa[20]="Ivanov")
	{
		ima=im;
		fam=fa;
	};
выдают ошибку: error C2440: '=' : cannot convert from 'char []' to 'char [20]'
Не подскажите в чем проблема? Типы же одинаковые :confused:
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Correct code:

Код: Выделить всё

#include <string.h>

class birthday: public date
{
private:
    char ima[20], fam[20];
public:
    birthday (const char* im = "Vasa", const char* fa = "Ivanov")
    {
        strncpy(ima, im, 20);
        strncpy(fam, fa, 20);
    }
};
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo конечно прав, но кроме всего прочего что это за "магическая" константа 20 ? Ты не пробовал её заменить ? Или вообще юзать std::string ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Тогда уж так:
[syntax=cpp]{
strncpy(ima, im, sizeof(ima) - 1);
strncpy(fam, fa, sizeof(fam) - 1);
}[/syntax]
MrBrain
Сообщения: 24
Зарегистрирован: 14 май 2009, 16:17

Спасибо за помощь, но я по другому сделал:

Код: Выделить всё

сlass birthday: public date
{
private:
	char *ima, *fam;
public:
	birthday (char *im="Vasa", char *fa="Ivanov")
	{
		ima=im;
		fam=fa;
	}
};
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

То, что ты сделал это неверно: ты присваеваеш указатели, а если указатель больше ни на что не указывает ? Тогда ты в конструкторе присваиваеш указатель на чушь.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

MrBrain, вот пример кода, когда ты получишь краш программы:

Код: Выделить всё

сlass birthday: public date
{
private:
    char *ima, *fam;
public:
    birthday (char *im="Vasa", char *fa="Ivanov")
    {
        ima=im;
        fam=fa;
    }

    void print()
    {
         printf("%s, %s", ima, fam);
    }
};

void main()
{
   birthday* pB;

   {
      char str[16];
      strcpy(str, "Test");
      pB = new birthday(str, str);
   }

   // Here is crush of the programm
   pB->print();

   delete pB;
}
Используй мой подход, если хочешь остаться на raw типах, а ещё лучше перейди на std::string.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
MrBrain
Сообщения: 24
Зарегистрирован: 14 май 2009, 16:17

Romeo писал(а):MrBrain, вот пример кода, когда ты получишь краш программы...
А я все не мог понять изза чего у меня краш :rolleyes: Большое спасибо! теперь все работает! :p А не используя <string.h> и класс string можно было это сделать?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Можно, если напишешь свою функцию strncmp. Такими вещами люди занимались раньше, когда приходилось экономить каждый байт исполняемого кода из-за того, что жёсткие диски были катастрофически маленькими. Ещ это актуально для вирусов, но они, как правило, вообще на ASM пишутся.

Сейчас принято не экономить на размере и всегда оптимизировать код на скорость. Поверь мне, для того, чтобы написать свою функции типа strcmp более оптимально, чем это сделано в стандартной библиотеке - придётся попотеть. Я разбирал дисассемблинг этой функции для VC 6.0. Она копирует строку dword'ами (что быстрее, чем посимвольно), а затем дописывает остатки побайтно. Ещё она учитывает особенности многопоточности и другие нюансы. Нет никакого смысла в том, чтобы всё это делать самому, если есть готовая функция. Более того, она входит в стандарт ANSI ISO 98, что позволяет тебе быть увереным в том, что твой код скомпилируется не только под Visual Studio и Borlan C++ всех версий, но также и на любых других компиляторах, независимо от платформы и производителя.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить