Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
someone307
2 / 2 / 0
Регистрация: 04.11.2012
Сообщений: 47
#1

Написать функцию, которая будет инвертировать любые массивы любого типа данных

04.11.2012, 17:52. Просмотров 657. Ответов 2
Метки нет (Все метки)

Добрый день,

Столкнулся с проблемой, кратко опишу ситуацию:

Надо: написать функцию, которая будет инвертировать любые массивы любого типа данных.
Т.е., например, из "5, 2, 7, 8" сделает "8, 7, 2, 5", или
из "{1, 2}, {1, 1}, {3, 2}" сделает "{3, 2}, {1, 1}, {1, 2}".
Функция должна иметь прототип вида "void reverse (void *base, int nel, int width)", где
*base - указатель на начало массива,
nel - количество элементов в массиве, а
width - размер одного элемента массива.

Сделано: функция, которая инвертирует массивы из одиночных элементов. Если же, например, пытаться инвертировать что-нибудь вроде второго варианта, где надо поменять местами строки, а не все элементы, метод не сработает.

Не получается: сделать то же, но уже для всех возможных вариантов через memcpy.

Код рабочего варианта с указателями
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void reverse (void *base, int nel, int width) 
{ 
    int i, j;
    char ch;
    char *p_base = (char *)base;
    
    i = (nel - 1) / 2;
    for (i; i>=0; i--)
        for (j=0; j<width; j++)
        {
            ch = *(p_base + j + i * width);
            *(j + p_base + i * width) = *(j + p_base + (nel - i - 1) * width);
            *(j + p_base + (nel - i - 1 ) * width) = ch;    
        };
    printf("Complete. \n");
}



Код с ошибкой, вариант с memcpy
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void reverse (void *base, int nel, int width) 
{ 
    int i, j;
    char *tmp = (char*)malloc(width);
    char *p_base = (char *)base;
    
    i = (nel - 1) / 2;
    for (i; i>=0; i--)
        for (j=0; j<width; j++)
        {
            memcpy(tmp, p_base + j + i * width, width);
            memcpy(p_base + j + i * width, p_base + j + (nel - i - 1) * width, width);
            memcpy(p_base + j + (nel - i - 1 ) * width, tmp, width);
        };
    printf("Complete. \n");
    free(tmp);
}


Данные на входе

Код
#|  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
C|  A  B  C  D  E  F  G  H  I  J
L|  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
M| {1, 2, 3}{4, 5, 6}{7, 8, 9}{10, 11, 12}{13, 14, 15}

Результат работы первого варианта(через указатели)

Код
#|  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
C|  J  I  H  G  F  E  D  C  B  A
L|  15  14  13  12  11  10  9  8  7  6  5  4  3  2  1
M| {15, 14, 13}{12, 11, 10}{9, 8, 7}{6, 5, 4}{3, 2, 1}

Результат работы второго варианта(через memcpy)

Код
#|  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
C|   I     G  F  E  D  C  B  A
L|  9  1  15  14  13  12  11  10  7  6  5  4  3  2  1
M| {9, 4718666, 15}{14, 13, 12}{11, 10, 7}{6, 5, 4}{3, 2, 8}

А вот как надо

Код
#|  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
C|  J  I  H  G  F  E  D  C  B  A
L|  15  14  13  12  11  10  9  8  7  6  5  4  3  2  1
M| {13, 14, 15}{10, 11, 12}{7, 8, 9}{4, 5, 6}{1, 2, 3}

Прошу помочь понять, почему второй вариант не работает как надо.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 17:52
Ответы с готовыми решениями:

Написать функцию, которая будет инвертировать в булевом векторе P разрядов, начиная с K-го
задача:написать функцию,которая будет инвертировать в булевом векторе P...

Написать функцию, которая будет складывать двумерные массивы
1. Нужно написать функцию, которая будет складывать двумерные массивы (можно...

Решение системы уравнений: написать функцию, которая как параметр будет использовать другую функцию
Ребята помогите разобраться с указателем на функцию! у меня решается система...

Написать функцию remove(), которая будет удалять i-тую строку из файла
Доброго времени суток!) есть задача, вызвавшая затруднение...необходимо...

Написать функцию которая будет записывать в файл по убыванию значения в одном из полей
здраствуйте помогите пожалуйста написать функцию которая будет записывать в...

2
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,181
04.11.2012, 18:03 #2
Ты копируешь кусок в длину элемента сначала начиная с первого байта, потом со смещением в один байт, потом в два... Причём всё на одно и тоже место. Короче говоря, выкинь цикл по j.
1
someone307
2 / 2 / 0
Регистрация: 04.11.2012
Сообщений: 47
04.11.2012, 18:08  [ТС] #3
Блин, надо было всмотреться в свой код внимательней, а не копипастить куски кода туда-сюда, в надежде, что он заработает
Спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 18:08

Написать и протестировать функцию, которая преобразует заданный текст в значение целого типа
Задание - &quot;Написать и протестировать функцию, которая преобразует заданный...

Написать функцию, которая открывает файлы и инициализирует указатели типа FILE вне функции
Требуется написать функцию, которая открывает файлы и инициализирует указатели...

Функция которая принимает структуру любого типа в качестве параметра
Дана функция которая может принимать структуру любого типа (т. е. может хранить...


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

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

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