Форум программистов, компьютерный форум CyberForum.ru

Ошибка C2106. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:20     Ошибка C2106. #1
Здравствуйте, при попытке символьному элементу структуры (char name [30]) присвоить такой же символьный элемент выдается ошибка C2106 - левый операнд должен быть левосторонним значением. Вот фрагмент листинга, на всякий случай с описанием самой структуры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
..........
struct List {
        int shifr;
        char name [30];
        int kol;
        float stoim;
    };
List MasList [100],min;
..........
..........
min.shifr=MasList[i].shifr;
        min.name=MasList[i].name; //<------ Эта строка.
        min.kol=MasList[i].kol;
        min.stoim=MasList[i].stoim;
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:37     Ошибка C2106. #2
BoBaH26, массивы массивам не присваиваются. Для копирования строк используйте strcpy.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:38     Ошибка C2106. #3
name - это указатель на строку.
Вы присваиваете указателю указатель, а указатель min.name является константным, т.е. его нельзя изменить.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:39  [ТС]     Ошибка C2106. #4
Сейчас попробую...
talis
20.09.2011, 23:40
  #5

Не по теме:

Chelioss, это не указатель. Массив чистой воды

Цитата Сообщение от BoBaH26 Посмотреть сообщение
char name [30];

BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:41  [ТС]     Ошибка C2106. #6
Chelioss, так а как тогда? Через copy, как сказал talis?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:41     Ошибка C2106. #7
Цитата Сообщение от talis Посмотреть сообщение

Не по теме:

Chelioss, это не указатель. Массив чистой воды


Не правильно. name - это указатель на массив, причем name - это константный указатель.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:41  [ТС]     Ошибка C2106. #8
Да, кстати, не заметил, это символьный массив.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:42     Ошибка C2106. #9
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Chelioss, так а как тогда? Через copy, как сказал talis?
Да, либо самому вручную каждый элемент присвоить.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:43  [ТС]     Ошибка C2106. #10
Цитата Сообщение от Chelioss Посмотреть сообщение
Да, либо самому вручную каждый элемент присвоить.
Ну это не есть хорошо, т.к. у меня массив из структур, а мне его надо отсортировать, и для каждого MasList[i].name писать вручную.... Можно с ума сойти..
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:44     Ошибка C2106. #11
Chelioss, где он объявлен как указатель?

min - это объект типа List. В struct List есть объявление char name [30];. Соответственно, min.name - массив char из 30 элементов.

Добавлено через 24 секунды
Цитата Сообщение от Chelioss Посмотреть сообщение
Да, либо самому вручную каждый элемент присвоить.
Не имеет смысла. Есть библиотечные функции для копирования строк и памяти.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:46     Ошибка C2106. #12
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Ну это не есть хорошо, т.к. у меня массив из структур, а мне его надо отсортировать, и для каждого MasList[i].name писать вручную.... Можно с ума сойти..
Можно самому написать функцию подобной strcpy. Ну или используйте strcpy.

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
Chelioss, где он объявлен как указатель?
min - это объект типа List. В struct List есть объявление char name [30];. Соответственно, min.name - массив char из 30 элементов.
C++
1
2
char *ptr = name; // работает. Почему? Потому, что name - это char *.
strcpy(name1,name2); // Смотрим на прототип функции char * strcpy ( char * destination, const char * source );
Конечно, надо по другому объяснять, а не примеры приводить, но я просто знаю без доказательства)
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:48  [ТС]     Ошибка C2106. #13
Не совсем понял с пунктом 1
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:50     Ошибка C2106. #14
Цитата Сообщение от Chelioss Посмотреть сообщение
char *ptr = name; // работает. Почему? Потому, что name - это char *.
Работает благодаря приведению типов. Объявление смотрите - char name[30].
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:50     Ошибка C2106. #15
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Не совсем понял с пунктом 1
Вы про
C++
1
char *ptr = name;
?
name имеет тип const char *, поэтому его можно присвоить другому указателю.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:52     Ошибка C2106. #16
C++
1
char name [30];
Какой тип объявлен?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:52     Ошибка C2106. #17
Цитата Сообщение от talis Посмотреть сообщение
Работает благодаря приведению типов. Объявление смотрите - char name[30].
А что такое name? без []? Он по вашему мнению вообще не существует без []. А со [] - это всего лишь i-тый символ, а не массив.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:54  [ТС]     Ошибка C2106. #18
char *ptr = name;
Получается, мы символьному указателю ptr присваиваем адрес первого элемента массива?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:55     Ошибка C2106. #19
Chelioss, по моему мнению (и позвольте мне самому его высказывать), name без [] - это массив из 30-ти char, как и объявлено выше. А к указателю оно приводится автоматически благодаря приведению типов.

Добавлено через 24 секунды
Цитата Сообщение от BoBaH26 Посмотреть сообщение
char *ptr = name;
Получается, мы символьному указателю ptr присваиваем адрес первого элемента массива?
Да. Адрес первого элемента массива name.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2011, 23:59     Ошибка C2106.
Еще ссылки по теме:

C++ Error C2106: '=' : left operand must be l-value

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
20.09.2011, 23:59     Ошибка C2106. #20
talis
Так мы ни к чему и не придем. Нужно какое-то доказательство.
Yandex
Объявления
20.09.2011, 23:59     Ошибка C2106.
Ответ Создать тему
Опции темы

Текущее время: 07:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru