Ошибка e0137 c

Понятия не имею что ему не нравиться, но указывает на эту ошибку в 5-ой строке.

 void poz_perv_i_posl_par_0(int* x, int n)
 {
    int i;
    for (i = 0; i < n; i++)
        if (x[i] = 0 && x[i+1] = 0)
        {
            printf("Порядковый номер первого элемента первой парыn i=% ", i);
            break;
        }
    for (i = n; i = 0; i--)
        if (x[i] = 0 && x[i + 1] = 0)
        {
            printf("Порядковый номер первого элемента последней парыn i=% ", i);
            break;
        }
}

Mikhailo's user avatar

Mikhailo

12.3k2 золотых знака17 серебряных знаков41 бронзовый знак

задан 6 дек 2020 в 10:34

Nightfur's user avatar

1

Приоритеты операторов приводят к тому, что ваше

if (x[i] = 0 && x[i+1] = 0) 

рассматривается как

if (x[i] = (0 && x[i+1]) = 0) 

т.е. вы, получается, хотите присвоить значение 0 выражению

0 && x[i+1]

Т.е. сделать что-то вроде

5+3 = 2

присвоить 2 сумме 5+3 :)

А вообще, просто типичная ошибка — перепутать оператор присваивания = и сравнения на равенство ==. Явно хотели написать

if (x[i] == 0 && x[i+1] == 0)

ответ дан 6 дек 2020 в 10:40

Harry's user avatar

HarryHarry

215k15 золотых знаков117 серебряных знаков228 бронзовых знаков

kukhtikov

2 / 2 / 0

Регистрация: 16.12.2012

Сообщений: 97

1

Ошибка: Выражение должно быть допустимым для изменения левосторонним значением

09.03.2013, 19:19. Показов 140434. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

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
class ts_ch
{
    int zn;
public:
    ts_ch()
    {
        zn=0;
    }
    ts_ch(int a)
    {
        zn=a;
    }
    int proverka(int a)
    {
        zn=a;
        if (zn % 2 = 0)
        {
            std::cout << "Число четное";
            return 1;
        }
        else
        {
            std::cout << "Число не четное";
            return 0;
        }
    }
    void print()
    {
        std::cout << "Значение числа: " << zn << ". Проверка: " << proverka(zn);
    }
};

Условие задачи:

Кликните здесь для просмотра всего текста

Создать класс «целое число».
Элементы класса:
поле задает значение целого числа (статус доступа private);
конструктор для инициализации поля;
метод, возвращающий 1, если число четное, и 0, в противном случае.
Создать 1 объект данного класса, проверить четное ли число, вывести соответствующее сообщение.

В строке if (zn % 2 = 0) компилятор указывает на zn и пишет: Выражение должно быть допустимым для изменения левосторонним значением.
В чем у меня ошибка?



0



Черный ворон

137 / 131 / 57

Регистрация: 31.01.2012

Сообщений: 435

09.03.2013, 19:21

2

C++
1
if (zn % 2 == 0)



4



2 / 2 / 0

Регистрация: 16.12.2012

Сообщений: 97

09.03.2013, 19:48

 [ТС]

3

Черный ворон, спасибо) Тупая ошибка..



0



Kruti

0 / 0 / 0

Регистрация: 30.12.2019

Сообщений: 1

30.12.2019, 12:32

4

Добрый день у мене такая проблема:
E0137 выражение должно быть допустимым для изменения левосторонним значением TreeC++

C:UsersAdminsourcereposTreeC++TreeC++Main.cpp

вот код

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
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
using namespace std;
 
struct node
{
int key[1];
node* l, * r;
int day, month, year;
};
node p;
struct Porushena
{
int day, month, year;
};
Porushena pr;
void Enter()
{
cout << "Enter day:";
cin >> pr.day;
cout << "Enter month:";
cin >> pr.month;
cout << "Enter year:";
cin >> pr.year;
p.day = pr.day;
 
p.month = pr.month;
p.year = pr.year;
}
void Add(int a[4], node** t[5])
{
if ((*t) == NULL)
{
(*t[1]) = new node;
(*t[2])->l = (*t[2])->r;
(*t[2])->key = a[1];
(*t[3])->l = (*t[3])->r;
(*t[3])->day = a[2];
(*t[4])->l = (*t[4])->r;
(*t[4])->month = a[3];
(*t[5])->l = (*t[5])->r;
(*t[5])->day = a[4];
}
}
int main()
{
Enter();
system("pause");
return 0;
}

подскажите почему оно указывает на 36 строчку «(*t[2])->key = a[1];» ?



0



zayats80888

5884 / 3288 / 1351

Регистрация: 07.02.2019

Сообщений: 8,310

30.12.2019, 12:35

5

Цитата
Сообщение от Kruti
Посмотреть сообщение

(*t[2])->key = a[1];

C++
1
(*t[2])->key[0] = a[1];



0



1642 / 1091 / 487

Регистрация: 17.07.2012

Сообщений: 5,345

30.12.2019, 12:50

6

Kruti,
1) Официальные языки форума русский и английский. По правилам форума общаться можно только на этих языках.
2) Не надо вручную перед каждой строкой писать ее номер, достаточно выделить код, нажать на кнопку «C++» в редакторе сообщений и нумерация сама появится. + будет подсветка синтаксиса. Такой код читать намного проще. Не надо кидать код без тегов(когда нажимаете на кнопку, код автоматически обернется в теги [CPP]ваш код[/CPP]).
3) Для решения своей проблемы лучше создавать новую тему, а не писать в теме 6-летней давности.
Я понимаю, что на форуме вы первый день, но в следующий раз рекомендую действовать по правилам.



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,851

30.12.2019, 12:53

7

Цитата
Сообщение от Kruti
Посмотреть сообщение

подскажите почему оно указывает на 36 строчку «(*t[2])->key = a[1];» ?

Потому что (*t[2])->key — это массив. Массивы не разрешается присваивать.



0



0 / 0 / 0

Регистрация: 01.12.2020

Сообщений: 1

01.12.2020, 22:39

8

У меня такая же проблема

Вот код:

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
srand(time(NULL));
setlocale(LC_ALL, «RUSSIAN»);
int n = 0;
int first_massiv[21];
int a[6][6];
cout << » 1) Рандомные числаn 2) Ручной ввод с клавиатуры n что хочешь: «;
cin >> n; // ЗДЕСЬ ПРОВЕРКА
switch (n)
{
case 1:
for (int i = 0; i < 21; i++)
{
a[i] = -10 + rand() % 21;
}
break;
case 2:
for (int i = 0; i < 11 && i > -11; i++)
{
cout << «Вводи число «;
cin >> n; // ЗДЕСЬ ПРОВЕРКА
first_massiv[i] = n;
}
break;
}

cout << endl;
for (int i = 0; i < 21; i++)
{
cout << first_massiv[i] << » «;
}
cout << endl;
cout << endl;

for (int i = 0, q = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
if (i == j || i > j)
{
a[i][j] = first_massiv[q];
q++;
}
else a[i][j] = 0;
}
}

for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
if (a[i][j] < 10) cout << a[i][j] << » «;
else cout << a[i][j] << » «;
}
cout << endl;
}

return 0;
}

Почему появилась ошибка в этом месте a[i] = -10 + rand() % 21?



0



41 / 26 / 17

Регистрация: 11.11.2019

Сообщений: 92

01.12.2020, 22:58

9

Цитата
Сообщение от Xeronchik
Посмотреть сообщение

Почему появилась ошибка в этом месте a[i] = -10 + rand() % 21?

Взгляните на массив a, какой он у вас при объявлении, а затем на массив a в цикле. Вы наверное хотели использовать массив first_massiv, но не заметили.



0



Вездепух

Эксперт CЭксперт С++

10913 / 5909 / 1614

Регистрация: 18.10.2014

Сообщений: 14,851

01.12.2020, 22:58

10

Цитата
Сообщение от Xeronchik
Посмотреть сообщение

Почему появилась ошибка в этом месте a[i] = -10 + rand() % 21?

Почему код не оформлен тегами?

Что такое a[i] и почему вы пытаетесь что-то присваивать в a[i]?



0



Im writing a small change to a code in visual studio and Im getting this error:

Error (active) E0137 expression must be a modifiable L-value
C:Users...events.cpp 75

This is the piece of code I added: (In bold is the line I’m getting the error):

void EV_HLDM_MuzzleFlash(vec3_t pos, float amount)
{
    dlight_t *dl = gEngfuncs.pEfxAPI->CL_AllocDlight(0);
    dl->origin = pos;  // ERROR HERE
    dl->color.r = 255; // red
    dl->color.g = 255; // green
    dl->color.b = 128; // blue
    dl->radius = amount * 100;
    dl->die = gEngfuncs.GetClientTime() + 0.01;
}

And here is the definition of dlight:

typedef float vec3_t[3]; 

typedef struct dlight_s
{
    vec3_t  origin;
    float   radius;
    color24 color;
    float   die;                // stop lighting after this time
    float   decay;              // drop this each second
    float   minlight;           // don't add when contributing less
    int     key;
    qboolean    dark;           // subtracts light instead of adding
} dlight_t;

I don’t really understand what´s wrong. I’m defining origin as a vector for the struct dlight and then I’m giving a vector in EV_HLDM_MuzzleFlash. I don’t understand what the problem is. Please help.

I tried changing the first line in dlight_t to Vector and the previous error dissapear, but I got new errors:

Error C3646 'origin': unknown override specifier 
Error C4430 Missing type specifier; int is assumed Note: C++ does not support default-int 

I get 46 times those 2 errors when changing from vec3_t to Vector.

What am I missing?

Понятия не имею что ему не нравиться, но указывает на эту ошибку в 5-ой строке.

 void poz_perv_i_posl_par_0(int* x, int n)
 {
    int i;
    for (i = 0; i < n; i++)
        if (x[i] = 0 && x[i+1] = 0)
        {
            printf("Порядковый номер первого элемента первой парыn i=% ", i);
            break;
        }
    for (i = n; i = 0; i--)
        if (x[i] = 0 && x[i + 1] = 0)
        {
            printf("Порядковый номер первого элемента последней парыn i=% ", i);
            break;
        }
}

Mikhailo's user avatar

Mikhailo

11.6k2 золотых знака16 серебряных знаков40 бронзовых знаков

задан 6 дек 2020 в 10:34

Nightfur's user avatar

1

Приоритеты операторов приводят к тому, что ваше

if (x[i] = 0 && x[i+1] = 0) 

рассматривается как

if (x[i] = (0 && x[i+1]) = 0) 

т.е. вы, получается, хотите присвоить значение 0 выражению

0 && x[i+1]

Т.е. сделать что-то вроде

5+3 = 2

присвоить 2 сумме 5+3 :)

А вообще, просто типичная ошибка — перепутать оператор присваивания = и сравнения на равенство ==. Явно хотели написать

if (x[i] == 0 && x[i+1] == 0)

ответ дан 6 дек 2020 в 10:40

Harry's user avatar

HarryHarry

210k15 золотых знаков114 серебряных знаков224 бронзовых знака

kukhtikov

2 / 2 / 0

Регистрация: 16.12.2012

Сообщений: 97

1

Ошибка: Выражение должно быть допустимым для изменения левосторонним значением

09.03.2013, 19:19. Показов 131336. Ответов 9

Метки нет (Все метки)


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
class ts_ch
{
    int zn;
public:
    ts_ch()
    {
        zn=0;
    }
    ts_ch(int a)
    {
        zn=a;
    }
    int proverka(int a)
    {
        zn=a;
        if (zn % 2 = 0)
        {
            std::cout << "Число четное";
            return 1;
        }
        else
        {
            std::cout << "Число не четное";
            return 0;
        }
    }
    void print()
    {
        std::cout << "Значение числа: " << zn << ". Проверка: " << proverka(zn);
    }
};

Условие задачи:

Кликните здесь для просмотра всего текста

Создать класс «целое число».
Элементы класса:
поле задает значение целого числа (статус доступа private);
конструктор для инициализации поля;
метод, возвращающий 1, если число четное, и 0, в противном случае.
Создать 1 объект данного класса, проверить четное ли число, вывести соответствующее сообщение.

В строке if (zn % 2 = 0) компилятор указывает на zn и пишет: Выражение должно быть допустимым для изменения левосторонним значением.
В чем у меня ошибка?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Черный ворон

137 / 131 / 57

Регистрация: 31.01.2012

Сообщений: 435

09.03.2013, 19:21

2

C++
1
if (zn % 2 == 0)

4

2 / 2 / 0

Регистрация: 16.12.2012

Сообщений: 97

09.03.2013, 19:48

 [ТС]

3

Черный ворон, спасибо) Тупая ошибка..

0

Kruti

0 / 0 / 0

Регистрация: 30.12.2019

Сообщений: 1

30.12.2019, 12:32

4

Добрый день у мене такая проблема:
E0137 выражение должно быть допустимым для изменения левосторонним значением TreeC++

C:UsersAdminsourcereposTreeC++TreeC++Main.c pp

вот код

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
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
using namespace std;
 
struct node
{
int key[1];
node* l, * r;
int day, month, year;
};
node p;
struct Porushena
{
int day, month, year;
};
Porushena pr;
void Enter()
{
cout << "Enter day:";
cin >> pr.day;
cout << "Enter month:";
cin >> pr.month;
cout << "Enter year:";
cin >> pr.year;
p.day = pr.day;
 
p.month = pr.month;
p.year = pr.year;
}
void Add(int a[4], node** t[5])
{
if ((*t) == NULL)
{
(*t[1]) = new node;
(*t[2])->l = (*t[2])->r;
(*t[2])->key = a[1];
(*t[3])->l = (*t[3])->r;
(*t[3])->day = a[2];
(*t[4])->l = (*t[4])->r;
(*t[4])->month = a[3];
(*t[5])->l = (*t[5])->r;
(*t[5])->day = a[4];
}
}
int main()
{
Enter();
system("pause");
return 0;
}

подскажите почему оно указывает на 36 строчку «(*t[2])->key = a[1];» ?

0

zayats80888

5667 / 3113 / 1299

Регистрация: 07.02.2019

Сообщений: 7,807

30.12.2019, 12:35

5

Цитата
Сообщение от Kruti
Посмотреть сообщение

(*t[2])->key = a[1];

C++
1
(*t[2])->key[0] = a[1];

0

1642 / 1091 / 487

Регистрация: 17.07.2012

Сообщений: 5,345

30.12.2019, 12:50

6

Kruti,
1) Официальные языки форума русский и английский. По правилам форума общаться можно только на этих языках.
2) Не надо вручную перед каждой строкой писать ее номер, достаточно выделить код, нажать на кнопку «C++» в редакторе сообщений и нумерация сама появится. + будет подсветка синтаксиса. Такой код читать намного проще. Не надо кидать код без тегов(когда нажимаете на кнопку, код автоматически обернется в теги [CPP]ваш код[/CPP]).
3) Для решения своей проблемы лучше создавать новую тему, а не писать в теме 6-летней давности.
Я понимаю, что на форуме вы первый день, но в следующий раз рекомендую действовать по правилам.

0

Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,019

30.12.2019, 12:53

7

Цитата
Сообщение от Kruti
Посмотреть сообщение

подскажите почему оно указывает на 36 строчку «(*t[2])->key = a[1];» ?

Потому что (*t[2])->key — это массив. Массивы не разрешается присваивать.

0

0 / 0 / 0

Регистрация: 01.12.2020

Сообщений: 1

01.12.2020, 22:39

8

У меня такая же проблема

Вот код:

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
srand(time(NULL));
setlocale(LC_ALL, «RUSSIAN»);
int n = 0;
int first_massiv[21];
int a[6][6];
cout << » 1) Рандомные числаn 2) Ручной ввод с клавиатуры n что хочешь: «;
cin >> n; // ЗДЕСЬ ПРОВЕРКА
switch (n)
{
case 1:
for (int i = 0; i < 21; i++)
{
a[i] = -10 + rand() % 21;
}
break;
case 2:
for (int i = 0; i < 11 && i > -11; i++)
{
cout << «Вводи число «;
cin >> n; // ЗДЕСЬ ПРОВЕРКА
first_massiv[i] = n;
}
break;
}

cout << endl;
for (int i = 0; i < 21; i++)
{
cout << first_massiv[i] << » «;
}
cout << endl;
cout << endl;

for (int i = 0, q = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
if (i == j || i > j)
{
a[i][j] = first_massiv[q];
q++;
}
else a[i][j] = 0;
}
}

for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
if (a[i][j] < 10) cout << a[i][j] << » «;
else cout << a[i][j] << » «;
}
cout << endl;
}

return 0;
}

Почему появилась ошибка в этом месте a[i] = -10 + rand() % 21?

0

41 / 26 / 17

Регистрация: 11.11.2019

Сообщений: 92

01.12.2020, 22:58

9

Цитата
Сообщение от Xeronchik
Посмотреть сообщение

Почему появилась ошибка в этом месте a[i] = -10 + rand() % 21?

Взгляните на массив a, какой он у вас при объявлении, а затем на массив a в цикле. Вы наверное хотели использовать массив first_massiv, но не заметили.

0

Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,019

01.12.2020, 22:58

10

Цитата
Сообщение от Xeronchik
Посмотреть сообщение

Почему появилась ошибка в этом месте a[i] = -10 + rand() % 21?

Почему код не оформлен тегами?

Что такое a[i] и почему вы пытаетесь что-то присваивать в a[i]?

0

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    C++ AMP — не комплируется пример из книги

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    22.03.17, 16:22

      Member

      **

      Рейтинг (т): нет

      Теперь пытаюсь поработать с C++ AMP. Windows 7, VS 2012. В программе из книги C++ AMP

      ExpandedWrap disabled

        #include <string>

        #include <iostream>

        #include <Windows.h>

        #include <memory.h>

        #include <stdio.h>

        #include <time.h>

        #include <amp.h>

        #include <ppl.h>

        using namespace std;

        using namespace concurrency;

        void AddArrays(int n, const double* const pA, const double* const pB, double* const pC)

        {

          clock_t start, finish, duration;

          start = clock();

          for(int i = 0; i < n; ++i)

          {

            pC[i] = pA[i] + pB[i];

          }

          finish = clock();

          duration = finish — start;

          cout << duration << » pC[i] = pA[i] + pB[i]» << » Время расчета без OpenMP» << endl;

        }

        void AddArraysAmp(int n, const int* const pA, const int* const pB, int* const pC)

        {

          clock_t start, finish, duration;

          start = clock();

          array_view<int, 1> a(n, pA);

          array_view<int, 1> b(n, pB);

          array_view<int, 1> c(n, pC);

          parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)

          {

            c[idx] = a[idx] + b[idx];

          });

          finish = clock();

          duration = finish — start;

          cout << duration << » pC[i] = pA[i] + pB[i]» << » Время расчета C++ AMP» << endl;

        }

        int main()

        {

          setlocale(LC_ALL, «»);

          int n = 15000;

          double* pA = (double*) malloc(sizeof(double)*n);

          double* pB = (double*) malloc(sizeof(double)*n);

          double* pC = (double*) malloc(sizeof(double)*n);

          for(int i = 0; i < n; ++i)

          {

            pA[i] = (double) i;

            pB[i] = (double) i;

            pC[i] = (double) 0;

          }

          AddArrays(n, pA, pB, pC);

          AddArraysAmp(n, pA, pB, pC);

          free(pA);

          free(pB);

          free(pC);

          system(«npause»);

        }

      получаю ошибки:
      error C2228: выражение слева от «.data» должно представлять класс, структуру или объединение c:program filesmicrosoft visual studio 11.0vcincludeamp.h 2250 1 CpuGpu
      error C2228: выражение слева от «.data» должно представлять класс, структуру или объединение c:program filesmicrosoft visual studio 11.0vcincludeamp.h 2253 1 CpuGpu
      error C2338: container element type and array view element type must match c:program filesmicrosoft visual studio 11.0vcincludeamp.h 2253 1 CpuGpu
      error C2228: выражение слева от «.size» должно представлять класс, структуру или объединение c:program filesmicrosoft visual studio 11.0vcincludeamp.h 2255 1 CpuGpu
      Почему возникает эта ошибка в заголовочном файле Microsoft? Проект прикрепил

      Прикреплённый файлПрикреплённый файлCpuGpuAmp.zip (2,25 Кбайт, скачиваний: 320)

      Сообщение отредактировано: tuchin — 22.03.17, 16:23


      Олег М



      Сообщ.
      #2

      ,
      22.03.17, 16:38

        Скорее всего, где-то требуется std::vector, вместо указателя

        Добавлено 22.03.17, 16:39
        Либо какой-то из массивов apm

        Добавлено 22.03.17, 16:44

        Цитата Олег М @ 22.03.17, 16:38

        array_view<int, 1> a(n, pA);

        Здесь требуется обычный указатель, а ты передаёшь константный, она не может найти конструктор


        tuchin



        Сообщ.
        #3

        ,
        23.03.17, 04:56

          Member

          **

          Рейтинг (т): нет

          Попробовал исправить, убрал const, не удается скомпилировать код. Буду разбираться дальше.


          Олег М



          Сообщ.
          #4

          ,
          23.03.17, 05:11

            Цитата tuchin @ 23.03.17, 04:56

            Попробовал исправить, убрал const, не удается скомпилировать код. Буду разбираться дальше.

            Сделай вот так
            void AddArraysAmp(int n, const int *pA, const int *pB, const int *pC)


            tuchin



            Сообщ.
            #5

            ,
            23.03.17, 16:30

              Member

              **

              Рейтинг (т): нет

              Не помогло


              Олег М



              Сообщ.
              #6

              ,
              23.03.17, 16:45

                Цитата tuchin @ 23.03.17, 16:30

                Не помогло

                А как у тебя вообще передаются указатели на double в функцию, которая требует указатели на int?


                tuchin



                Сообщ.
                #7

                ,
                23.03.17, 17:25

                  Member

                  **

                  Рейтинг (т): нет

                  Пробовал и так:

                  ExpandedWrap disabled

                    void AddArraysAmp(int n, const double* const pA, const double* const pB, double* const pC)

                    {

                      clock_t start, finish, duration;

                      start = clock();

                      array_view<double, 1> a(n, pA);

                      array_view<double, 1> b(n, pB);

                      array_view<double, 1> c(n, pC);

                      parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)

                      {

                        c[idx] = a[idx] + b[idx];

                      });

                      finish = clock();

                      duration = finish — start;

                      cout << duration << » pC[i] = pA[i] + pB[i]» << » Время расчета C++ AMP» << endl;

                    }

                    int main()

                    {

                      setlocale(LC_ALL, «»);

                      int n = 3;

                      double* pA = (double*) malloc(sizeof(double)*n);

                      double* pB = (double*) malloc(sizeof(double)*n);

                      double* pC = (double*) malloc(sizeof(double)*n);

                      for(int i = 0; i < n; ++i)

                      {

                        pA[i] = (double) i;

                        pB[i] = (double) i;

                        pC[i] = (double) 0;

                      }

                      AddArrays(n, pA, pB, pC);

                      free(pA);

                      free(pB);

                      free(pC);

                      system(«npause»);

                    }

                  Даже без включения AddArraysAmp в Main возникают те же ошибки. А функция без AMP void AddArrays(int n, const double* const pA, const double* const pB, double* const pC) работает нормально.

                  Добавлено 23.03.17, 17:29
                  Кроме того, проверил результаты в Windows 10 и VS2015, результаты те же. При этом определить, что в коде примера не так у меня не получается, ошибку дает только amp.h. А разобраться в коде заголовочного файла Microsoft для меня непосильная задача.


                  Олег М



                  Сообщ.
                  #8

                  ,
                  23.03.17, 17:30

                    Тебе нужен, насколько я понимаю, чтобы вызывался вот этот конструктор array_view (что значит restrict, я не знаю)

                    ExpandedWrap disabled

                      array_view(  

                         int _E0,  

                         const _Value_type * _Src  

                      )restrict(amp,cpu);

                    Т.е. const double *. А у тебя — const double* const.
                    Поэтому компилятор выбирает другой.
                    Сделай параметры const double *pA, ……..


                    tuchin



                    Сообщ.
                    #9

                    ,
                    23.03.17, 18:12

                      Member

                      **

                      Рейтинг (т): нет

                      При int и double в функции

                      ExpandedWrap disabled

                        void AddArraysAmp(int n, const double* pA, const double*  pB, double* pC)

                        {

                          clock_t start, finish, duration;

                          start = clock();

                          //array_view<double, 1> a(n, pA);

                          //array_view<double, 1> b(n, pB);

                          //array_view<double, 1> c(n, pC);

                          array_view<int, 1> a(n, pA);

                          array_view<int, 1> b(n, pB);

                          array_view<int, 1> c(n, pC);

                          parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)

                          {

                            c[idx] = a[idx] + b[idx];

                          });

                          finish = clock();

                          duration = finish — start;

                          cout << duration << » pC[i] = pA[i] + pB[i]» << » Время расчета C++ AMP» << endl;

                        }

                      получил те же результаты


                      Олег М



                      Сообщ.
                      #10

                      ,
                      23.03.17, 19:01

                        Цитата tuchin @ 23.03.17, 18:12

                        //array_view<double, 1> a(n, pA);
                          //array_view<double, 1> b(n, pB);
                          //array_view<double, 1> c(n, pC);

                        Раскоментируй это, а то, что ниже убери


                        tuchin



                        Сообщ.
                        #11

                        ,
                        23.03.17, 19:24

                          Member

                          **

                          Рейтинг (т): нет

                          ExpandedWrap disabled

                            void AddArraysAmp(int n, const double* pA, const double*  pB, double* pC)

                            {

                              clock_t start, finish, duration;

                              start = clock();

                              array_view<double, 1> a(n, pA);

                              array_view<double, 1> b(n, pB);

                              array_view<double, 1> c(n, pC);

                              //array_view<int, 1> a(n, pA);

                              //array_view<int, 1> b(n, pB);

                              //array_view<int, 1> c(n, pC);

                              parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)

                              {

                                c[idx] = a[idx] + b[idx];

                              });

                              finish = clock();

                              duration = finish — start;

                              cout << duration << » pC[i] = pA[i] + pB[i]» << » Время расчета C++ AMP» << endl;

                            }

                          не помогло


                          Олег М



                          Сообщ.
                          #12

                          ,
                          23.03.17, 19:44

                            Цитата tuchin @ 23.03.17, 19:24

                            array_view<double, 1> a(n, pA)

                            А попробуй сделать array_view<const double, 1>, для a и b


                            tuchin



                            Сообщ.
                            #13

                            ,
                            24.03.17, 05:05

                              Member

                              **

                              Рейтинг (т): нет

                              Ошибка (активно) выражение должно быть допустимым для изменения левосторонним значением CpuGpuVS2015 e:MyProgrammingCpuGpuVS2015CpuGpu.cpp 40
                              Ошибка C3892 Concurrency::array_view<const double,1>::operator []: невозможно присваивать значения переменной, которая объявлена как константа CpuGpuVS2015 e:myprogrammingcpugpuvs2015cpugpu.cpp 40
                              Другие ошибки исчезли


                              Олег М



                              Сообщ.
                              #14

                              ,
                              24.03.17, 05:11

                                Покажи код


                                tuchin



                                Сообщ.
                                #15

                                ,
                                24.03.17, 17:16

                                  Member

                                  **

                                  Рейтинг (т): нет

                                  Я забыл убрать const в array_view для c(n, pC). После исправления в программе

                                  ExpandedWrap disabled

                                    #include <string>

                                    #include <iostream>

                                    #include <Windows.h>

                                    #include <memory.h>

                                    #include <stdio.h>

                                    #include <time.h>

                                    #include <amp.h>

                                    using namespace std;

                                    using namespace concurrency;

                                    void AddArrays(int n, const double* const pA, const double* const pB, double* const pC)

                                    {

                                      clock_t start, finish, duration;

                                      start = clock();

                                      for(int i = 0; i < n; ++i)

                                      {

                                        pC[i] = pA[i] + pB[i];

                                      }

                                      finish = clock();

                                      duration = finish — start;

                                      cout << duration << » — время расчета без OpenMP.» << »  Результат: » << pC[2] << endl;

                                    }

                                    void AddArraysAmp(int n, const double* pA, const double*  pB, double* pC)

                                    {

                                      clock_t start, finish, duration;

                                      start = clock();

                                      array_view<const double, 1> a(n, pA);

                                      array_view<const double, 1> b(n, pB);

                                      array_view<double, 1> c(n, pC);

                                      parallel_for_each(c.extent, [=](index<1> idx) restrict(amp)

                                      {

                                        c[idx] = a[idx] + b[idx];

                                      });

                                      finish = clock();

                                      duration = finish — start;

                                      cout << duration << » pC[i] = pA[i] + pB[i]» << » Время расчета C++ AMP» << endl;

                                    }

                                    int main()

                                    {

                                      setlocale(LC_ALL, «»);

                                      int n = 16000;

                                      double* pA = (double*) malloc(sizeof(double)*n);

                                      double* pB = (double*) malloc(sizeof(double)*n);

                                      double* pC = (double*) malloc(sizeof(double)*n);

                                      for(int i = 0; i < n; ++i)

                                      {

                                        pA[i] = (double) i;

                                        pB[i] = (double) i;

                                        pC[i] = (double) 0;

                                      }

                                      AddArrays(n, pA, pB, pC);

                                      AddArraysAmp(n, pA, pB, pC);

                                      free(pA);

                                      free(pB);

                                      free(pC);

                                      system(«npause»);

                                    }

                                  В результате получаю
                                  Возникло необработанное исключение по адресу 0x751524F2 в CpuGpuVS2015.exe: исключение Microsoft C++: Concurrency::runtime_exception по адресу памяти 0x004FE81C.

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • C/C++: Системное программирование и WinAPI
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0441 ]   [ 17 queries used ]   [ Generated: 30.01.23, 05:47 GMT ]  

                                  if(user == USR && psw = PSW) // 2 ошибки: 1. Выражение E1037 должно быть изменяемым lvalue 2. ‘=’ левый операнд должен быть l-значением

                                  Ошибка здесь: psw = PSW

                                  Исходя из приоритета оператора,

                                  user == USR && psw = PSW

                                  становится

                                  ((user == USR) && psw) = PSW

                                  Теперь посмотрим ((user == USR) && psw). Как вы думаете, каким будет результат этого выражения? Это либоtrue или false, который не является lvalue.

                                  Что такое rvalues, lvalues, xvalues, glvalues ​​и prvalues?

                                  Простыми словами, что вы назначаете PSWк? Это не имеет смысла, потому что левая часть этого выражения не является переменной.

                                  Решение:

                                  Вы можете быть удивлены этими ошибками, потому что на самом деле вы просто хотели сравнить, psw равно PSW, но вы случайно использовали этот оператор присваивания.

                                  Заменить psw = PSW с psw == PSW.

                                  Понравилась статья? Поделить с друзьями:
                                • Ошибка e0120 c
                                • Ошибка e011 wilo
                                • Ошибка e011 whatsminer m21s
                                • Ошибка e01 счетчик меркурий
                                • Ошибка e01 стиральная машина zanussi