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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
#1

Поменять местами элементы массива - C++

29.10.2013, 20:13. Просмотров 1645. Ответов 12
Метки нет (Все метки)

Есть указатель Mas
C++
1
void *Mas;
на массив структур вида.
C++
1
2
3
4
5
6
struct ST{
int a;
int b;
int c;
int d;
};
Нужно написать функцию, которая меняет местами структуры под номером n и m.
C++
1
2
3
4
5
6
void SWAP(int n,int m){
ST t;
t=Mas[n];
Mas[n]=Mas[m];
Mas[m]=t;
}
Я знаю что так нельзя делать)
Как мне все поля сразу поменять, чтобы вручную не надо было каждое поле менять?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2013, 20:13     Поменять местами элементы массива
Посмотрите здесь:

Поменять местами первый и последний элементы. Все единичные элементы массива заменить нулями C++
C++ Поменять элементы массива местами
C++ Поменять местами элементы массива
C++ Поменять местами элементы массива
Поменять местами элементы массива C++
Поменять местами элементы массива C++
C++ Поменять местами элементы соседние массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
29.10.2013, 20:45     Поменять местами элементы массива #2
надо через ссылки или указатели
[/PHP]

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
#include <iostream>
 
using namespace std;
struct ST
{
int a;
int b;
int c;
int d;
};
void SWAP(ST &n,ST &m)
{
ST t;
t=m;
m=n;
n=t;
}
void print(ST x)
{
    cout<<x.a<<endl;
    cout<<x.b<<endl;
    cout<<x.c<<endl;
    cout<<x.d<<endl;
}
int main()
{
ST N={1,2,3,4};
ST M={5,6,7,8};
cout<<"N"<<endl;
print(N);
cout<<"M"<<endl;
print(M);
SWAP(N,M);
cout<<"after swap N"<<endl;
print(N);
cout<<"after swap M"<<endl;
print(M);
    return 0;
}
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
29.10.2013, 20:47  [ТС]     Поменять местами элементы массива #3
А как сделать именно в том варианте, в котором я написал. В функцию передаются номера двух структур в массиве структур, указатель на который void *Mas.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
29.10.2013, 20:51     Поменять местами элементы массива #4
Цитата Сообщение от fishec Посмотреть сообщение
Есть указатель Mas
C++
1
void *Mas;
на массив структур вида.
C++
1
2
3
4
5
6
struct ST{
int a;
int b;
int c;
int d;
};
Нужно написать функцию, которая меняет местами структуры под номером n и m.
C++
1
2
3
4
5
6
void SWAP(int n,int m){
ST t;
t=Mas[n];
Mas[n]=Mas[m];
Mas[m]=t;
}
Я знаю что так нельзя делать)
Как мне все поля сразу поменять, чтобы вручную не надо было каждое поле менять?
если массив структур, то указатель будет явно не void))
смысл тот же, передаешь функции массив, его длину и индексы структур которые меняешь, только лучше заполнить массив указателями на эти структуры и менять адреса структур, так проще будет, хотя по идеет оно так и происходит...ща попробую сам не помню уже)
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
29.10.2013, 20:57  [ТС]     Поменять местами элементы массива #5
У меня задание именно такое, ничего нельзя менять
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
29.10.2013, 21:02     Поменять местами элементы массива #6
Цитата Сообщение от fishec Посмотреть сообщение
Я знаю что так нельзя делать)
Как мне все поля сразу поменять, чтобы вручную не надо было каждое поле менять?
можно использовать
memcpy (копирование памяти)

C++
1
2
3
4
5
6
void SWAP(int n,int m){
ST t;
memcpy(&t, &Mas[n],sizeof(ST));
memcpy(&Mas[n],& Mas[m],sizeof(ST));
memcpy(&Mas[m],&t,sizeof(ST));
}
http://cppstudio.com/spravochnik/sta...nkciya-memcpy/
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
29.10.2013, 21:21  [ТС]     Поменять местами элементы массива #7
Цитата Сообщение от ValeryS Посмотреть сообщение
memcpy (копирование памяти)
E2453 Size of the type 'void' is unknown or zero
E2109 Not an allowed type
Выдает такую ошибку в строках с memcpy. В чем может быть проблема?

Добавлено через 1 минуту
По сути Mas - указатель на кусок памяти, в котором подряд лежат структуры.

Добавлено через 3 минуты
Что происходит про обращении Mas[n]?
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
29.10.2013, 21:24     Поменять местами элементы массива #8
Цитата Сообщение от fishec Посмотреть сообщение
E2453 Size of the type 'void' is unknown or zero
E2109 Not an allowed type
говорит что у типа воид размер равен 0,так что фиг вам а не копирование
может он не может сосчитать размер структуры,хотя это странно
возьми размер экземпляра структуры
sizeof(t) вместо sizeof(ST)
а ты точно код скопировал? не написал ли случайно sizeof(&ST)?

Добавлено через 2 минуты
Цитата Сообщение от fishec Посмотреть сообщение
По сути Mas - указатель на кусок памяти, в котором подряд лежат структуры.
точно
Цитата Сообщение от fishec Посмотреть сообщение
Что происходит про обращении Mas[n]?
сдвигаемся от начала на n * размер структуры байт(n *sizeof(ST))
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
29.10.2013, 21:25  [ТС]     Поменять местами элементы массива #9
Цитата Сообщение от ValeryS Посмотреть сообщение
говорит что у типа воид размер равен 0,так что фиг вам а не копирование
может он не может сосчитать размер структуры,хотя это странно
возьми размер экземпляра структуры
sizeof(t) вместо sizeof(ST)
а ты точно код скопировал? не написал ли случайно sizeof(&ST)?
Скопировал точно, подругому тоже попробавал(sizeof(t)), ошибка та же.
Сама ошибка при обращении &Mas[n].
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
29.10.2013, 21:28     Поменять местами элементы массива #10
а я понял понял
Цитата Сообщение от fishec Посмотреть сообщение
void *Mas;
приводить однако надо
это просто указатель он ничего не знает о структурах
как ты его приравниваешь к массиву?

Добавлено через 1 минуту
попробуй так, хотя не знаю так из голова придумал
(ST*)Mas[n]
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
29.10.2013, 21:28  [ТС]     Поменять местами элементы массива #11
Цитата Сообщение от ValeryS Посмотреть сообщение
сдвигаемся от начала на n * размер структуры байт(n *sizeof(ST))
Тут void *Mas, просто указатель на кусок памяти, откуда он знает, что размер нужно брать размер именно структуры ST?
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
29.10.2013, 21:30     Поменять местами элементы массива #12
Цитата Сообщение от fishec Посмотреть сообщение
Тут void *Mas, просто указатель на кусок памяти, откуда он знает, что размер нужно брать размер именно структуры ST?
еще раз повторяю
приведи кусок кода где ты объявляешь массив и как его приравниваешь к Mas
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 21:36     Поменять местами элементы массива
Еще ссылки по теме:

C++ Поменять элементы массива местами
Поменять местами элементы массива C++
C++ Если максимальный элемент массива А больше минимального элемента массива В, поменять данные элементы местами
Поменять местами элементы массива C++
C++ Поменять местами элементы массива

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

Или воспользуйтесь поиском по форуму:
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
29.10.2013, 21:36  [ТС]     Поменять местами элементы массива #13
&((ST*)Mas)[n] - такое обращение сработало) спасибо.
Yandex
Объявления
29.10.2013, 21:36     Поменять местами элементы массива
Ответ Создать тему
Опции темы

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