Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
1

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

29.10.2013, 20:13. Просмотров 2291. Ответов 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;
}
Я знаю что так нельзя делать)
Как мне все поля сразу поменять, чтобы вручную не надо было каждое поле менять?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2013, 20:13
Ответы с готовыми решениями:

Поменять местами первый и последний элементы. Все единичные элементы массива заменить нулями
Люди добрые, помогите плиз с задачками. В массиве Р, размерности 150 150. поменять местами первый...

Найти первый минимальный и последний максимальный элементы массива. Поменять местами столбцы, содержащие эти элементы
Найти первый минимальный и последний максимальный элементы массива. Поменять местами столбцы,...

Поменять элементы массива местами
Помогите, пожалуйста. Мне дано массив Y. Каждый элемент массива должен соответствовать формуле...

Поменять местами элементы массива
В массиве A из N элементов поменять местами первый элемент с последним, второй - с предпоследним и...

Поменять местами элементы массива
в заданном массиве из n элементов поменять местами элементы с n/2+1 по n: a(индекс n/2+i)=a(индекс...

12
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
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;
}
1
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
29.10.2013, 20:47  [ТС] 3
А как сделать именно в том варианте, в котором я написал. В функцию передаются номера двух структур в массиве структур, указатель на который void *Mas.
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
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))
смысл тот же, передаешь функции массив, его длину и индексы структур которые меняешь, только лучше заполнить массив указателями на эти структуры и менять адреса структур, так проще будет, хотя по идеет оно так и происходит...ща попробую сам не помню уже)
1
29.10.2013, 20:51
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
29.10.2013, 20:57  [ТС] 5
У меня задание именно такое, ничего нельзя менять
0
ValeryS
Модератор
7842 / 5828 / 762
Регистрация: 14.02.2011
Сообщений: 20,021
Завершенные тесты: 1
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/
1
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
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]?
0
ValeryS
Модератор
7842 / 5828 / 762
Регистрация: 14.02.2011
Сообщений: 20,021
Завершенные тесты: 1
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))
1
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
29.10.2013, 21:25  [ТС] 9
Цитата Сообщение от ValeryS Посмотреть сообщение
говорит что у типа воид размер равен 0,так что фиг вам а не копирование
может он не может сосчитать размер структуры,хотя это странно
возьми размер экземпляра структуры
sizeof(t) вместо sizeof(ST)
а ты точно код скопировал? не написал ли случайно sizeof(&ST)?
Скопировал точно, подругому тоже попробавал(sizeof(t)), ошибка та же.
Сама ошибка при обращении &Mas[n].
0
ValeryS
Модератор
7842 / 5828 / 762
Регистрация: 14.02.2011
Сообщений: 20,021
Завершенные тесты: 1
29.10.2013, 21:28 10
а я понял понял
Цитата Сообщение от fishec Посмотреть сообщение
void *Mas;
приводить однако надо
это просто указатель он ничего не знает о структурах
как ты его приравниваешь к массиву?

Добавлено через 1 минуту
попробуй так, хотя не знаю так из голова придумал
(ST*)Mas[n]
1
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
29.10.2013, 21:28  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
сдвигаемся от начала на n * размер структуры байт(n *sizeof(ST))
Тут void *Mas, просто указатель на кусок памяти, откуда он знает, что размер нужно брать размер именно структуры ST?
0
ValeryS
Модератор
7842 / 5828 / 762
Регистрация: 14.02.2011
Сообщений: 20,021
Завершенные тесты: 1
29.10.2013, 21:30 12
Цитата Сообщение от fishec Посмотреть сообщение
Тут void *Mas, просто указатель на кусок памяти, откуда он знает, что размер нужно брать размер именно структуры ST?
еще раз повторяю
приведи кусок кода где ты объявляешь массив и как его приравниваешь к Mas
0
fishec
122 / 121 / 62
Регистрация: 07.09.2013
Сообщений: 343
29.10.2013, 21:36  [ТС] 13
&((ST*)Mas)[n] - такое обращение сработало) спасибо.
0
29.10.2013, 21:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 21:36

Поменять элементы массива местами
Дан массив, элементы которого равны либо единице, либо двойке. Напишите программу, которая...

Поменять местами элементы массива
Генерируется массив на n символов в диапазоне от 1 до 100; Для данного массива написать код,...

Поменять местами элементы массива
Есть задача:Найти макс. элемент одномерного массива, минимальный и поменять местами максимальный и...


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

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

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