30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
|
||||||
1 | ||||||
Ошибка C2106.20.09.2011, 23:20. Показов 9475. Ответов 39
Метки нет (Все метки)
Здравствуйте, при попытке символьному элементу структуры (char name [30]) присвоить такой же символьный элемент выдается ошибка C2106 - левый операнд должен быть левосторонним значением. Вот фрагмент листинга, на всякий случай с описанием самой структуры:
0
|
20.09.2011, 23:20 | |
Ответы с готовыми решениями:
39
Выдает: Ошибка C2296 Ошибка C2106 Error C2106 как обойти? Error C2106: '=' : left operand must be l-value Error C2106: '=' : left operand must be l-value |
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
|
|
21.09.2011, 00:03 [ТС] | 21 |
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:05 | 23 |
Да, но сперва надо было проверить. Может быть и не надо было бы этот вопрос задавать)
1
|
21.09.2011, 00:08 | 24 | |||||
BoBaH26, первый аргумент - то, куда, копируете, второй - то, откуда.
Добавлено через 2 минуты вот, например
Видите, как типы определяются компилятором?
1
|
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
|
|
21.09.2011, 00:11 [ТС] | 25 |
talis, вот именно этого я пока и не понял. Ведь char hello[30] мы можем заполнить с помощью ввода: cin>>hello; Так почему нельзя присвоить ему это значение "asdasd"?
0
|
21.09.2011, 00:14 | 26 |
BoBaH26, при вызове cin >> hello реально происходит вызов функции:
istream & operator>>( istream & is, char * buffer ); И hello попадает в неё в качестве второго параметра, а cin - в качестве первого. Из-за близости природы идентификаторов массива и указателя (оба "указывают" на начало какого-то куска памяти), считается нормальным преобразовывать char[30] в char*, передавая в качестве указателя адрес на первый элемент массива char.
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:17 | 27 |
BoBaH26
Это называется перегрузкой операции. Можно почитать об этом где-нибудь.
1
|
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
|
|
21.09.2011, 00:21 [ТС] | 28 |
Спасибо, буду пробовать делать через указатель, т.к. такой способ: strcpy (min.name, MasList[i].name); Мне какжется не рабочим, ибо мы делаем то же самое, что и при присваивании. Мы константе min.name хотим придать значение MasList[i].name?
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:24 | 29 |
А почему массив name константный? То, что я про указатели говорил забудьте.
Вам надо присвоить name[i] = MasList[i].name[i] , где i = 0,1,2...размер массива -1 Причем можно не весь массив копировать, а ту часть, которая находится до нуль символа и нуль символ тоже не забыть захватить.
0
|
21.09.2011, 00:25 | 30 | |||||
BoBaH26, нет. Мы вызываем
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:28 | 31 |
Для опыта один раз в жизни то стоит написать самому такую функцию) А то странно будет, когда человек знает strcpy, но не знает как присваивать массива в ручную, т.е. алгоритм этой функции.
0
|
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
|
|
21.09.2011, 00:35 [ТС] | 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, не ну самое элементарное я знаю, как присваивать в цикле элементы массиву.. Просто со строками пока туговато..
0
|
21.09.2011, 00:39 | 33 |
BoBaH26, как присваивать строки:
присваиваете элементы массива, пока значение элемента исходного массива не станет равно нулю (не достигните нуль-терминатора). как вариант - с учётом длин массивов, но особого смысла не имеет, если только конечный массив не меньше исходного.
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:40 | 34 |
Без функции strcpy не обойтись. Можно, конечно, воспользоваться функцией memcpy, только хрен редьки не слаще.
1
|
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
|
|
21.09.2011, 00:43 [ТС] | 35 |
Большое Вам спасибо, завтра буду пробовать.
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:44 | 37 |
Это я знаю, просто пример привел еще один.
Да и пример использования этой функции на cplusplus.com использует именно строки)
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
21.09.2011, 00:48 | 39 |
Да и можно не копировать всю строку функцией memcpy) Можно только до нуля и включая нуль.
0
|
21.09.2011, 00:50 | 40 |
Ну так чем strcpy и занимается. А есть ещё strncpy, которой можно скопировать либо до достижения нуль-терминатора, либо до достижения определённого количества скопированных символов (что раньше произойдёт). Это поможет спастись от переполнения буфера.
0
|
21.09.2011, 00:50 | |
21.09.2011, 00:50 | |
Помогаю со студенческими работами здесь
40
error C2106: '=' : left operand must be l-value выдаёт ошибку на сортировку Функция swap. error C2106: =: левый операнд должен быть левосторонним значением Error C2106 или error C2440 Ошибка компилятора C2106 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |