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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
#1

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

20.09.2011, 23:20. Просмотров 4060. Ответов 39
Метки нет (Все метки)

Здравствуйте, при попытке символьному элементу структуры (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;
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:03  [ТС]     Ошибка C2106. #21
Вот так пробовать?
strcpy (min.name, MasList[i].name);
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:05     Ошибка C2106. #22
Chelioss, вот.

int numbers [20];
int * p;

The following assignment operation would be valid:

p = numbers;

After that, p and numbers would be equivalent and would have the same properties. The only difference is that we could change the value of pointer p by another one, whereas numbers will always point to the first of the 20 elements of type int with which it was defined. Therefore, unlike p, which is an ordinary pointer, numbers is an array
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:05     Ошибка C2106. #23
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Вот так пробовать?
strcpy (min.name, MasList[i].name);
Да, но сперва надо было проверить. Может быть и не надо было бы этот вопрос задавать)
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:08     Ошибка C2106. #24
BoBaH26, первый аргумент - то, куда, копируете, второй - то, откуда.

Добавлено через 2 минуты
вот, например

C++
1
2
char hello[30];
hello = "asdasd";
error: incompatible types in assignment of 'const char [7]' to 'char [30]'

Видите, как типы определяются компилятором?
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:11  [ТС]     Ошибка C2106. #25
talis, вот именно этого я пока и не понял. Ведь char hello[30] мы можем заполнить с помощью ввода: cin>>hello; Так почему нельзя присвоить ему это значение "asdasd"?
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:14     Ошибка C2106. #26
BoBaH26, при вызове cin >> hello реально происходит вызов функции:

istream & operator>>( istream & is, char * buffer );

И hello попадает в неё в качестве второго параметра, а cin - в качестве первого. Из-за близости природы идентификаторов массива и указателя (оба "указывают" на начало какого-то куска памяти), считается нормальным преобразовывать char[30] в char*, передавая в качестве указателя адрес на первый элемент массива char.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:17     Ошибка C2106. #27
BoBaH26
Это называется перегрузкой операции. Можно почитать об этом где-нибудь.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:21  [ТС]     Ошибка C2106. #28
Спасибо, буду пробовать делать через указатель, т.к. такой способ: strcpy (min.name, MasList[i].name); Мне какжется не рабочим, ибо мы делаем то же самое, что и при присваивании. Мы константе min.name хотим придать значение MasList[i].name?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:24     Ошибка C2106. #29
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Спасибо, буду пробовать делать через указатель, т.к. такой способ: strcpy (min.name, MasList[i].name); Мне какжется не рабочим, ибо мы делаем то же самое, что и при присваивании. Мы константе min.name хотим придать значение MasList[i].name?
А почему массив name константный? То, что я про указатели говорил забудьте.
Вам надо присвоить name[i] = MasList[i].name[i] , где i = 0,1,2...размер массива -1
Причем можно не весь массив копировать, а ту часть, которая находится до нуль символа и нуль символ тоже не забыть захватить.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:25     Ошибка C2106. #30
Цитата Сообщение от BoBaH26 Посмотреть сообщение
такой способ: strcpy (min.name, MasList[i].name); Мне какжется не рабочим, ибо мы делаем то же самое, что и при присваивании
BoBaH26, нет. Мы вызываем

C
1
2
3
4
5
6
7
8
9
10
char *strcpy( char * dest, const char * src )
{
   int i;
 
   for( i = 0; src[i] != 0; i++ )
      dest[i] = src[i];
 
   dest[i] = 0;
   return dest;
}
(примерная реализация), которая посимвольно копирует одну строку в другую до нуль-терминатора. Это стандартная библиотека Си, которой пользуются уже хрен знает сколько лет, со времён первого UNIX. Не стоит извращаться - пользуйтесь.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:28     Ошибка C2106. #31
Цитата Сообщение от talis Посмотреть сообщение
(примерная реализация), которая посимвольно копирует одну строку в другую до нуль-терминатора. Это стандартная библиотека Си, которой пользуются уже хрен знает сколько лет, со времён первого UNIX. Не стоит извращаться - пользуйтесь.
Для опыта один раз в жизни то стоит написать самому такую функцию) А то странно будет, когда человек знает strcpy, но не знает как присваивать массива в ручную, т.е. алгоритм этой функции.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:35  [ТС]     Ошибка C2106. #32
Chelioss, так мне не желательно делать name[], т.к. программа большая, а с таким способом задания символьного массива name, будет на порядок труднее, поэтому я могу делать только так: min.name, т.е. должен рассматривать не как массив, а как строку, поэтому здесь скорее подойдет строковая функция копирования strcpy.
talis, я знаю С++ не очень хорошо, пока только начал, поэтому о чем идет речь в этой функции: char *strcpy( char * dest, const char * src ) не знаю..

Добавлено через 1 минуту
Chelioss, так мне не желательно делать name[], т.к. программа большая, а с таким способом задания символьного массива name, будет на порядок труднее, поэтому я могу делать только так: min.name, т.е. должен рассматривать не как массив, а как строку, поэтому здесь скорее подойдет строковая функция копирования strcpy.
talis, я знаю С++ не очень хорошо, пока только начал, поэтому о чем идет речь в этой функции: char *strcpy( char * dest, const char * src ) не знаю..

Добавлено через 2 минуты
Chelioss, не ну самое элементарное я знаю, как присваивать в цикле элементы массиву.. Просто со строками пока туговато..
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:39     Ошибка C2106. #33
BoBaH26, как присваивать строки:

присваиваете элементы массива, пока значение элемента исходного массива не станет равно нулю (не достигните нуль-терминатора). как вариант - с учётом длин массивов, но особого смысла не имеет, если только конечный массив не меньше исходного.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:40     Ошибка C2106. #34
Без функции strcpy не обойтись. Можно, конечно, воспользоваться функцией memcpy, только хрен редьки не слаще.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:43  [ТС]     Ошибка C2106. #35
Большое Вам спасибо, завтра буду пробовать.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:43     Ошибка C2106. #36
Цитата Сообщение от Chelioss Посмотреть сообщение
Можно, конечно, воспользоваться функцией memcpy, только хрен редьки не слаще.
Ага. То же самое, только помимо реально информативной части до нуль-терминатора, копирует ещё и весь мусор после него.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:44     Ошибка C2106. #37
Цитата Сообщение от talis Посмотреть сообщение
Ага. То же самое, только помимо реально информативной части до нуль-терминатора, копирует ещё и весь мусор после него.
Это я знаю, просто пример привел еще один.
Да и пример использования этой функции на cplusplus.com использует именно строки)
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:46     Ошибка C2106. #38
Chelioss, да я не вам. Я знаю, что вы знаете
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:48     Ошибка C2106. #39
Да и можно не копировать всю строку функцией memcpy) Можно только до нуля и включая нуль.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 00:50     Ошибка C2106.
Еще ссылки по теме:

C++ Функция swap. error C2106: =: левый операнд должен быть левосторонним значением
Error C2106: '=' : left operand must be l-value C++
типизированный файл, ошибка ошибка при выходе C++
С++ ошибка в проге, но не могу понять какая ошибка( C++
C++ Выдает: Ошибка C2296 Ошибка C2106

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

Или воспользуйтесь поиском по форуму:
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:50     Ошибка C2106. #40
Ну так чем strcpy и занимается. А есть ещё strncpy, которой можно скопировать либо до достижения нуль-терминатора, либо до достижения определённого количества скопированных символов (что раньше произойдёт). Это поможет спастись от переполнения буфера.
Yandex
Объявления
21.09.2011, 00:50     Ошибка C2106.
Ответ Создать тему
Опции темы

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