Другие языки программирования и технологии
Напишите пожалуйста функцию обмена значений двух переменных на си (не c++) для любого типа данных
если переменные передаются в формате void*. Шаблоны и перегрузку нельзя использовать. Заранее спасибо!
Ннасяльника сказай функсию, атнака...
#include <stdio.h>
#include <limits.h>
void uswap(void*, void*, size_t);
int main() {
unsigned int a = UINT_MAX, b = 5;
printf("%u %u\n", a, b);
uswap(&a, &b, sizeof(unsigned int));
printf("%u %u\n", a, b);
getchar();
}
void uswap(void* a, void* b, size_t size) {
char ch;
short sh;
long lg;
double db;
switch (size) {
case 1:
ch = *(char*)a;
*(char*)a = *(char*)b;
*(char*)b = ch;
break;
case 2:
sh = *(short*)a;
*(short*)a = *(short*)b;
*(short*)b = sh;
break;
case 4:
lg = *(long*)a;
*(long*)a = *(long*)b;
*(long*)b = lg;
break;
case 8:
db = *(double*)a;
*(double*)a = *(double*)b;
*(double*)b = db;
break;
}
}
#include <stdio.h>
#include <limits.h>
void uswap(void*, void*, size_t);
int main() {
unsigned int a = UINT_MAX, b = 5;
printf("%u %u\n", a, b);
uswap(&a, &b, sizeof(unsigned int));
printf("%u %u\n", a, b);
getchar();
}
void uswap(void* a, void* b, size_t size) {
char ch;
short sh;
long lg;
double db;
switch (size) {
case 1:
ch = *(char*)a;
*(char*)a = *(char*)b;
*(char*)b = ch;
break;
case 2:
sh = *(short*)a;
*(short*)a = *(short*)b;
*(short*)b = sh;
break;
case 4:
lg = *(long*)a;
*(long*)a = *(long*)b;
*(long*)b = lg;
break;
case 8:
db = *(double*)a;
*(double*)a = *(double*)b;
*(double*)b = db;
break;
}
}
Baysangur! Baysangur!
как ты замутил отступы?
Если указателям можно менять адрес
void obm(void* x, void* y)
{
void *p;
p = x;
x = y;
y = p;
}
иначе надо передать длину типа как параметр и обмен вести побайтно.
void obm(void* x, void* y)
{
void *p;
p = x;
x = y;
y = p;
}
иначе надо передать длину типа как параметр и обмен вести побайтно.
Азамат Койшибаев
void* - указатель на любую структуру, но через него нельзя обращаться к полям?
Сишник? откуда вас понабралось? Держи макрос:
#define SWAP(x,y) do \
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
memcpy(swap_temp,&y,sizeof(x)); \
memcpy(&y,&x, sizeof(x)); \
memcpy(&x,swap_temp,sizeof(x)); \
} while(0)
#define SWAP(x,y) do \
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
memcpy(swap_temp,&y,sizeof(x)); \
memcpy(&y,&x, sizeof(x)); \
memcpy(&x,swap_temp,sizeof(x)); \
} while(0)
void - пустой тип данных, что там Вы обменивать собрались?
P.S. Я долго не спал, забыл, что значит указатель void, поправьте меня инапомните пожалуйста, тк тут что-то не просто так, что указатель типа void. Не помню, что это значит.
P.S. Я долго не спал, забыл, что значит указатель void, поправьте меня инапомните пожалуйста, тк тут что-то не просто так, что указатель типа void. Не помню, что это значит.
Похожие вопросы
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?
- C++ Про выбор типа данных. Int, char и т. д.
- C++. Типы данных. Создание типа данных.
- Как проверить тип данных на си?
- Напишите программу которая будет считать значения целых переменных
- Зачем и для чего нужен тип данных bool в C++? Пожалуйста, объясните развёрнутым ответом. Заранее спасибо.
- C++ Проверка правильности ввода данных.
- C# почему когда создаю тип данных byte - он его автоматически преобразовывает в тип int?
- C++. Работа с символьными данными. Напишите пожалуйста
- Почему в C++ передача аргумента функции по значению считается более быстрой, чем по ссылке?