Страница 1 из 1
cannot convert from 'char []' to 'char [20]'
Добавлено: 14 май 2009, 16:24
MrBrain
Помогите пожалуйста! Такой код:
Код: Выделить всё
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]'
Не подскажите в чем проблема? Типы же одинаковые

Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 14 май 2009, 20:06
Romeo
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);
}
};
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 11:05
Airhand
Romeo конечно прав, но кроме всего прочего что это за "магическая" константа 20 ? Ты не пробовал её заменить ? Или вообще юзать std::string ?
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 11:39
BBB
Тогда уж так:
[syntax=cpp]{
strncpy(ima, im, sizeof(ima) - 1);
strncpy(fam, fa, sizeof(fam) - 1);
}[/syntax]
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 12:07
MrBrain
Спасибо за помощь, но я по другому сделал:
Код: Выделить всё
сlass birthday: public date
{
private:
char *ima, *fam;
public:
birthday (char *im="Vasa", char *fa="Ivanov")
{
ima=im;
fam=fa;
}
};
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 12:19
Airhand
То, что ты сделал это неверно: ты присваеваеш указатели, а если указатель больше ни на что не указывает ? Тогда ты в конструкторе присваиваеш указатель на чушь.
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 14:56
Romeo
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.
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 17:12
MrBrain
Romeo писал(а):MrBrain, вот пример кода, когда ты получишь краш программы...
А я все не мог понять изза чего у меня краш

Большое спасибо! теперь все работает!

А не используя <string.h> и класс string можно было это сделать?
Re: cannot convert from 'char []' to 'char [20]'
Добавлено: 15 май 2009, 17:45
Romeo
Можно, если напишешь свою функцию strncmp. Такими вещами люди занимались раньше, когда приходилось экономить каждый байт исполняемого кода из-за того, что жёсткие диски были катастрофически маленькими. Ещ это актуально для вирусов, но они, как правило, вообще на ASM пишутся.
Сейчас принято не экономить на размере и всегда оптимизировать код на скорость. Поверь мне, для того, чтобы написать свою функции типа strcmp более оптимально, чем это сделано в стандартной библиотеке - придётся попотеть. Я разбирал дисассемблинг этой функции для VC 6.0. Она копирует строку dword'ами (что быстрее, чем посимвольно), а затем дописывает остатки побайтно. Ещё она учитывает особенности многопоточности и другие нюансы. Нет никакого смысла в том, чтобы всё это делать самому, если есть готовая функция. Более того, она входит в стандарт ANSI ISO 98, что позволяет тебе быть увереным в том, что твой код скомпилируется не только под Visual Studio и Borlan C++ всех версий, но также и на любых других компиляторах, независимо от платформы и производителя.