Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
-1 / 1 / 0
Регистрация: 24.12.2018
Сообщений: 113
1

Портятся данные при использовании memcpy()

20.08.2020, 16:33. Показов 1062. Ответов 9

Мне нужно "переганять" большие массивы данных, поэтому решил использовать функцию memcpy().
Почему-то она портит данные даже в таком примитивном случае, как в примере кода ниже.
Может есть нюансы, когда тип данных
Код
valarray
??


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
#include <iostream>
#include <complex>
#include <valarray>
 
std::valarray<std::complex<double>> in_Buf;
std::valarray<std::complex<double>> out_Buf;
 
void func(std::valarray<std::complex<double>>* in, std::valarray<std::complex<double>>* out, int ydim);
 
int main()
{
 
 
    in_Buf.resize(10);
    out_Buf.resize(10);
 
    double test1[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
    double test2[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
 
    for (unsigned long i = 0; i < in_Buf.size(); i++) in_Buf[i] = { test1[i],test2[i] };
    func(&in_Buf, &out_Buf, 10);
 
}
 
void func(std::valarray<std::complex<double>>* in, std::valarray<std::complex<double>>* out, int ydim)
{
    int pvt = (ydim % 2 == 0) ? (ydim / 2) : ((ydim - 1) / 2);
    int right = ydim - pvt;
    int left = pvt;
 
    memcpy(out, in + pvt, sizeof(std::valarray<std::complex<double>>) * right);                                                                                         
    memcpy(out + right, in, sizeof(std::valarray<std::complex<double>>) * left);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2020, 16:33
Ответы с готовыми решениями:

Ошибка при использовании memcpy
При использовании функции memcpy возникает ошибка typedef struct _xJSRdGWtWnLjwW2w { void*...

Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy
Бывает ли на практике такое, что код #define size 1000; // some value int x, y; /* ... */...

При выполнении оператора портятся данные
//Лабораторная работа№2 //выполнил Смирнов П.Д. ММ09-2 /* ДОДЕЛАТЬ 1) округление...

Портятся данные при большой частоте прихода сообщений
Сложно привести огромный код.. В каких случаях может приходить испорченная информация при...

9
262 / 181 / 87
Регистрация: 03.05.2020
Сообщений: 790
20.08.2020, 16:35 2
memmove попробовать?
0
1028 / 710 / 316
Регистрация: 26.02.2015
Сообщений: 3,225
20.08.2020, 16:37 3
Почему нельзя передать параметры по ссылке просто?

Добавлено через 12 секунд
Или воспользоваться семантикой перемещения?
0
-1 / 1 / 0
Регистрация: 24.12.2018
Сообщений: 113
20.08.2020, 16:38  [ТС] 4
memmove() тоже работает некорректно.
Думаю, что лажа может быть в вычислении размера
sizeof(std::valarray<std::complex<double>>)
0
6739 / 4537 / 1840
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
20.08.2020, 16:44 5
Цитата Сообщение от prokino Посмотреть сообщение
Мне нужно "переганять" большие массивы данных, поэтому решил использовать функцию memcpy().
std::valarray нельзя копировать при помощи memcpy. Используй его методы или алгоритмы, они работает достаточно эффективно

Добавлено через 43 секунды
В частности, если данные можно скопировать при при помощи memcpy, они так и сделают
1
1028 / 710 / 316
Регистрация: 26.02.2015
Сообщений: 3,225
20.08.2020, 16:45 6
Почему нельзя так сделать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <complex>
#include <valarray>
 
 
std::valarray<std::complex<double>> in_Buf;
std::valarray<std::complex<double>> out_Buf;
 
int main()
{
 
    in_Buf.resize(10);
    out_Buf.resize(10);
 
    double test1[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
    double test2[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
 
    for (unsigned long i = 0; i < in_Buf.size(); i++) in_Buf[i] = { test1[i],test2[i] };
 
    out_Buf = std::move(in_Buf);
    
 
}
0
-1 / 1 / 0
Регистрация: 24.12.2018
Сообщений: 113
20.08.2020, 16:52  [ТС] 7
out_Buf = std::move(in_Buf); - так нельзя сделать, потому что теряется логика работы.

Нужно скопировать элементы согласно этого замысла:
memcpy(out, in + pvt, sizeof(std::valarray<std::complex<double>>) * right);
memcpy(out + right, in, sizeof(std::valarray<std::complex<double>>) * left);


Подскажите, каким способом можно сделать то же самое, но используя методы или алгоритмы valarray
0
1028 / 710 / 316
Регистрация: 26.02.2015
Сообщений: 3,225
20.08.2020, 16:56 8
Цитата Сообщение от prokino Посмотреть сообщение
Подскажите, каким способом можно сделать то же самое
C++
1
out_Buf = in_Buf;
Добавлено через 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
#include <iostream>
#include <complex>
#include <valarray>
 
std::valarray<std::complex<double>> in_Buf;
std::valarray<std::complex<double>> out_Buf;
 
int main()
{
 
    
 
    in_Buf.resize(10);
    out_Buf.resize(10);
 
    double test1[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
    double test2[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
 
    for (unsigned long i = 0; i < in_Buf.size(); i++) in_Buf[i] = { test1[i],test2[i] };
 
    out_Buf = in_Buf;
    
}
0
6739 / 4537 / 1840
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
20.08.2020, 16:59 9
Лучший ответ Сообщение было отмечено prokino как решение

Решение

Цитата Сообщение от prokino Посмотреть сообщение
Подскажите, каким способом можно сделать то же самое, но используя методы или алгоритмы valarray
Что-то типа
C++
1
2
3
4
5
6
7
8
9
void func(std::valarray<std::complex<double>> &in, std::valarray<std::complex<double>> &out, int ydim)
{
    int pvt = (ydim % 2 == 0) ? (ydim / 2) : ((ydim - 1) / 2);
    int right = ydim - pvt;
    int left = pvt;
 
    std::copy(std::begin(in) + pvt, right, std::begin(out));
    std::copy(std::begin(in), left, std::begin(out) + right);
}
0
Nishen
20.08.2020, 17:04     Портятся данные при использовании memcpy()
  #10

Не по теме:

Господи, что с моей внимательностью. :-(

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2020, 17:04

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

atmega48pa + adm483 портятся данные при передаче
Всем привет. Собираю одно устройство и возникла проблема. Суть в том, что передаваемые данные от...

При выходе из функции "портятся" данные в char**
есть структура: struct response { char *type; char *dns; int status; char *error; char...

Данные в сессии портятся
Привет! Дело вот в чем: при идентификации пользователя в сессию записывается 2-х мерный массив с...

Портятся данные в очереди
Всем привет. Программа работает с UART на прерываниях. Возникла проблема. Через не определённый...

Как передавать данные при использовании ссылок?
Nikak ne mogu razobratsa, kak mozhno peredat danniye pri ispolzovnii sskilok.... Na odnoy stranitse...

Как получить данные при использовании jquery-ui?
Здравствуйте, уважаемые программисты. Есть у меня файловый менеджер (см. скриншот) И я хочу...


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

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

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