Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/27: Рейтинг темы: голосов - 27, средняя оценка - 4.74
mriceMan
0 / 0 / 0
Регистрация: 30.11.2009
Сообщений: 18
1

Ошибка Lvalue required

28.11.2011, 19:29. Просмотров 5354. Ответов 3
Метки нет (Все метки)

Пожалуйста помогите исправить ошибку Lvalue required в этой строке: str2=+(s[k-1]);


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstring>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
 main()
 
{
 
        const char *s = "1234567890[]qwertyuiopasdfghjklzxcvbnmq";
 
        char str[255];
        char str2[255];
 
 
        int i,k, len, len2;
 
        printf("Input string: ");
 
        fgets(str, 255, stdin);
 
        len = strlen(str);
        len2=strlen(s);
 
 
        str[len - 1] = 0;
 
        for(i = 0; i < len; i++)
         for(k = 0; k < len2; k++)
                 if (str[i]==s[k])
                   {
                     str2=+(s[k-1]);
                   }
        printf("Result string: %s\n", str2);
        system("pause");
        return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 19:29
Ответы с готовыми решениями:

Ошибка: (19,22): Lvalue required
Пожалуйста помогите найти ошибку! Ошибка: (19,22):Lvalue required Задача...

Ошибка lvalue required as increment operand
Добрый день возник вопрос почему вылетает ошибка lvalue required as increment...

Ошибка: lvalue required as left operand of assignment
#include &lt;stdio.h&gt; int main () { float a1, a2, a3, b; printf(&quot;\n input 3...

Исправить код: ошибка компиляции lvalue required
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; main (){ int n,m,t...

Обмен адресами через указатели и ошибка "Lvalue required as left operand of assignment"
#include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;locale&gt; #define LEN 5 ...

3
Сыроежка
Заблокирован
28.11.2011, 19:56 2
mriceMan,

Я не смотрел ваш код, но приведенное вами предложение

str2=+(s[k-1]);

естественно содержит ошибку, так как имени массива ничего нельзя присваивать. Идентификатору имени массива не выделяется память, поэтому и присваивать ему ничего нельзя. Имя массива всегда является синонимом конкретного адреса памяти, где хранится сам массив, который изменить нельзя.
0
Toshkarik
1155 / 871 / 91
Регистрация: 03.08.2011
Сообщений: 2,434
Завершенные тесты: 1
28.11.2011, 20:14 3
Дейтелы вроде пишут, что имя массива это константный указатель на первый элемент.
0
Evg
Эксперт CАвтор FAQ
19631 / 7323 / 551
Регистрация: 30.03.2009
Сообщений: 20,486
Записей в блоге: 30
29.11.2011, 16:18 4
В выражениях имя массива трактуется как указатель на самый первый элемент массива, а любая индексация - как поинтерная арифметика.

Грубо говоря, если есть массив

C
1
int a[10][20];
то просто имя массива (т.е. конструкция "a") внутри выражения трактуется как

C
1
(int[20]*)(&a[0][0])
т.е. берётся адрес самого первого элемента массива и приводится к указателю на тип, который получается, если выкинуть старшее измерение. В нашем случае это будет указатель на { массив из 20 int'ов }. Таким образом, конструкция "a + 3" для данного массива вполне законная и является указателем на элемент a[3][0], приведённом к типу { массив из 20 int'ов }. Т.е. фактически мы получим в результате { массив из 20 int'ов }, который можно подать, например, в процедуру, описанную как

C
1
void func (int x[20]);
А всё выражение

C
1
a[i][j];
трактуется как тот же самый адрес, а каждая индексация преобразуется в поинтерную арифметику с последующим разыменованием указателя

C
1
*( ((int*) ((int[20]*)(&a[0][0]) + i)) + j )
Таким образом, просто имя массива "a", которое согласно вышенаписанному трактуется как адрес, может использоваться только в правой части выражения и конструкции типа "a = ..." или "a += ..." попросту недопустимы. А вот с индексацией - пожалуйста. Индексация всегда подразумевает разыменование, что допускает такое выражение использовать в левой части присваивания.

-----------------------------------------

Ну и так, для информации. То, выражение, которое используется в правой части присваивания, техническим языком называется "rvalue", а то, что в левой - "lvalue". Во многих языках и правая и левая часть присваивания синтаксически выглядят одинаково: в выражении "a = b" и справа и слева стоит идентификатор. Но трактовка выражения в позиции rvalue и lvalue - разная. В нашем случае "b" трактуется как значение (value), а "a" трактуктся как адрес (address). Говоря "адрес" здесь НЕ имеется какой-то адрес в памяти, а имеется некое обобщённое понятие, описывающее местоположение того, куда нужно записать "value" (и такое обобщённое понятие я буду называть именно "address"). Т.е. "a = b" как бы обозначает: прочитать "b" в виде "value", рассмотреть запись "a" в виде "address" и переписать "value" по местоположению "address".

Константа вырабатывает "value", которое является только "rvalue" и не может стоять в левой части присваивания. Точно так же операция взятия адреса & (на этот раз "адрес" - это адрес в памяти) вырабатывает "value", которое является адресом в памяти (но не addres'ом) и может использоваться только в правой части присваивания. Чтобы по данному адресу в памяти можно было бы что-то записать, надо этот адрес в памяти, представленный в виде "value", через операцию разыменовывания указателя привести к "address", который уже является "lvalue". Имя массива (которое эквивалентно взятию адреса на первый элемент) так вырабатывает "value", которое есть "rvalue". Другими словами константа, результат операции взятия адреса или имя массива являются "rvalue"

Идентификатор в правой части присваивания вырабатывает "value", равное текущему значению переменной, а в левой части присваивания вырабатывает "address", описывающий местоположение переменной с заданным именем. Другими словами, имя идентификатора в правой части присваивания является "rvalue", а в левой части присваивания - "lvalue"
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2011, 16:18

Тернарный оператор: Почему выводит ошибку lvalue required?
Данный код не компилируется в c99 : /*...

Ошибка при работе со структурами: Expression must be a modifiable lvalue
Здравтсвуйте, не могу найти ошибку в коде: #define _CRT_SECURE_NO_WARNINGS...

Ошибка: "non-lvalue in assignment"
#include&lt;stdio.h&gt; #include &lt;math.h&gt; int n,i,d,a; float c; int main() { ...


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

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

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