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

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

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

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

20.09.2011, 23:20. Просмотров 4357. Ответов 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;
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка C2106. (C++):

Выдает: Ошибка C2296 Ошибка C2106 - C++
Ребят помогите, не могу понять, что не так #include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; using namespace std; int...

Error C2106: '=' : left operand must be l-value - C++
Всем привет. Вот у меня есть такой хедер: #ifndef MATRIXX_H #define MATRIXX_H #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Error C2106 как обойти? - C++
Вот фрагмент кода на Delphi Type matr=array of real; vect=array of real; ... X1:matr; Y1,Z1:vect; ... X1:=alpha;...

Error C2106: '=' : left operand must be l-value - C++
Добрый день! Пишу программу управления колледжом. И столкнулась с этой ошибкой. У меня есть класс Department который имеет массив...

error C2106: '=' : left operand must be l-value выдаёт ошибку на сортировку - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { setlocale(LC_ALL,...

Функция swap. error C2106: =: левый операнд должен быть левосторонним значением - C++
Выдает ошибки: error C2106: =: левый операнд должен быть левосторонним значением в чем причина? зарание спасибо:) int max; ...

39
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:52 #16
C++
1
char name [30];
Какой тип объявлен?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
20.09.2011, 23:52 #17
Цитата Сообщение от talis Посмотреть сообщение
Работает благодаря приведению типов. Объявление смотрите - char name[30].
А что такое name? без []? Он по вашему мнению вообще не существует без []. А со [] - это всего лишь i-тый символ, а не массив.
0
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:54  [ТС] #18
char *ptr = name;
Получается, мы символьному указателю ptr присваиваем адрес первого элемента массива?
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:55 #19
Chelioss, по моему мнению (и позвольте мне самому его высказывать), name без [] - это массив из 30-ти char, как и объявлено выше. А к указателю оно приводится автоматически благодаря приведению типов.

Добавлено через 24 секунды
Цитата Сообщение от BoBaH26 Посмотреть сообщение
char *ptr = name;
Получается, мы символьному указателю ptr присваиваем адрес первого элемента массива?
Да. Адрес первого элемента массива name.
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
20.09.2011, 23:59 #20
talis
Так мы ни к чему и не придем. Нужно какое-то доказательство.
0
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:03  [ТС] #21
Вот так пробовать?
strcpy (min.name, MasList[i].name);
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:05 #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
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:05 #23
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Вот так пробовать?
strcpy (min.name, MasList[i].name);
Да, но сперва надо было проверить. Может быть и не надо было бы этот вопрос задавать)
1
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:08 #24
BoBaH26, первый аргумент - то, куда, копируете, второй - то, откуда.

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

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

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

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

И hello попадает в неё в качестве второго параметра, а cin - в качестве первого. Из-за близости природы идентификаторов массива и указателя (оба "указывают" на начало какого-то куска памяти), считается нормальным преобразовывать char[30] в char*, передавая в качестве указателя адрес на первый элемент массива char.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:17 #27
BoBaH26
Это называется перегрузкой операции. Можно почитать об этом где-нибудь.
1
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:21  [ТС] #28
Спасибо, буду пробовать делать через указатель, т.к. такой способ: strcpy (min.name, MasList[i].name); Мне какжется не рабочим, ибо мы делаем то же самое, что и при присваивании. Мы константе min.name хотим придать значение MasList[i].name?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.09.2011, 00:24 #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
Причем можно не весь массив копировать, а ту часть, которая находится до нуль символа и нуль символ тоже не забыть захватить.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:25 #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. Не стоит извращаться - пользуйтесь.
0
21.09.2011, 00:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 00:25
Привет! Вот еще темы с ответами:

Error C2106 или error C2440 - C++
Необходимо создать односвязный список из слов строки.Ошибка в 28 и 35 строке. Код: #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include...

Ошибка компилятора C2106 - C (СИ)
#include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;locale&gt; void main() { setlocale (LC_ALL , &quot;russian&quot;) ; int n,i; float b,c,h; ...

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services - C# ASP.NET
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к сценарию(asp) получаю ошибку: &lt;пропуск&gt; ......

1C 8.x Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи! - 1С
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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