Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Elena_Tu
1 / 1 / 0
Регистрация: 07.02.2011
Сообщений: 221
#1

Реализовать аналог `void *memmove(void *to, void *from, size_t n)` - C (СИ)

17.09.2012, 08:09. Просмотров 2622. Ответов 25
Метки нет (Все метки)

Добрый день, подскажите пожалуйста, как реализовать такой метод самостоятельно?
который копирует из одного массива в другой n элементов
Спсибо, буду рада любому совету!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 08:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Реализовать аналог `void *memmove(void *to, void *from, size_t n)` (C (СИ)):

Возможна ли инициализация связного списка в функции void (void)? - C (СИ)
Всем привет. В связи с полученным в универе заданием возник вопрос, а возможна ли в принципе инициализация связного списка с помощью...

Ошибка: error C2143 функция void deleteEnd(void) - C (СИ)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #define MAXNAME 56 struct tagBook { char name; ...

Работа с void* - C (СИ)
Понадобилось поработать с си да ещё и в придачу с void*, не пойму почему моя функция func не видит строку, а точнее печатает её как...

Функция void на си - C (СИ)
Помогите задать функцию void в коде. #include <stdio.h> #include <conio.h> #include <math.h> #include <time.h> int main() { ...

Присваивание void * - C (СИ)
Написал программу, но ошибки в присваивании с раскрытием указателя на void. Google не помог. В gcc: new.c: In function...

Void в скобочках - C (СИ)
Столкнулся с таким кодом на си: static void cdcacm_data_rx_cb(u8 ep) { (void)ep; // Что это?? char buf; /* ... */ }

25
alkagolik
Заблокирован
19.09.2012, 01:01 #16
молодец. теперь попробуй переделать так чтобы копировались сразу 4 или 8 байт за одну итерацию цикла. В зависимости от значения WORDSIZE.
0
accept
4832 / 3253 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
19.09.2012, 04:09 #17
Цитата Сообщение от Evg Посмотреть сообщение
Иногда это повод (и иногда люди действительно так поступают, понимая при этом, как работает компилятор).
если ты пишешь непереносимый код, ты можешь делать любые хаки, привязываясь к компилятору
когда этого компилятора не окажется под рукой, тебе заново придётся всё это писать, либо же пытаться установить тот компилятор

так что скорость не может служить оправданием

Цитата Сообщение от Evg Посмотреть сообщение
Потому что EOF и -1 - это контекстная замена одного на другое и нарушение стандарта не даёт никаких преимуществ, чтобы на него идти
даёт, -1 можно использовать в арифметическом выражении

Цитата Сообщение от Evg Посмотреть сообщение
здесь формально используется читерство
используется хак, переводящий указатели в числа, основыванный на данных о том, как компилятор создаёт множество адресов
0
Evg
Эксперт CАвтор FAQ
18909 / 6868 / 503
Регистрация: 30.03.2009
Сообщений: 19,336
Записей в блоге: 30
19.09.2012, 09:11 #18
Цитата Сообщение от accept Посмотреть сообщение
если ты пишешь непереносимый код, ты можешь делать любые хаки, привязываясь к компилятору
когда этого компилятора не окажется под рукой, тебе заново придётся всё это писать, либо же пытаться установить тот компилятор
Непереносимости тут нет. Данный код будет переносим на любую "нормальную" архитектуру. Когда речь идёт о специфических архитектурах типа сигнальных процессоров, то под них практически любой код нужно переписывать и он всё равно останется непереносимым на другие варианты специфических процессоров. Опять-таки никто к компилятору в данных кодах не привязывается. Любой компилятор отработает правильно. Ни у одного компилятора нет даже теоретических шансов отработать неправильно. Т.е. те страшилки, о которых ты говоришь - они надуманные.

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

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

Цитата Сообщение от accept Посмотреть сообщение
даёт, -1 можно использовать в арифметическом выражении
И какие это даёт преимущества? Никаких. А потому пример с EOF'ом неинтересен, ибо никак не показывает случаев, зачем используются коды, не удовлетворяющие стандарту

Цитата Сообщение от accept Посмотреть сообщение
используется хак
Я не вижу принципиальной разницы между тем, назвать это "хак" или "читерство". В любом случае это осознанное нарушение стандарта, которое ни при каких обстоятельствах не приведёт к неправильно работающей программе. Разумеется, в рамках текущего построения процессоров и организации памяти. Если кто-то когда-то изобретёт наноархитектуры с принципиально другой организацией памяти (в котором, к примеру, пользователю вообще будет недоступно значение указателя), тогда будет предмет для разговора. Но в этом случае всё равно ВЕСЬ современный софт окажется непригоден для такой архитектуры
0
accept
4832 / 3253 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
19.09.2012, 09:39 #19
Цитата Сообщение от Evg Посмотреть сообщение
Непереносимости тут нет. Данный код будет переносим на любую "нормальную" архитектуру.
то, как организована адресация в программе, зависит от компилятора, а не от архитектуры

Цитата Сообщение от Evg Посмотреть сообщение
Ни у одного компилятора нет даже теоретических шансов отработать неправильно. Т.е. те страшилки, о которых ты говоришь - они надуманные.
ты не знаешь
0
Evg
Эксперт CАвтор FAQ
18909 / 6868 / 503
Регистрация: 30.03.2009
Сообщений: 19,336
Записей в блоге: 30
19.09.2012, 11:57 #20
Цитата Сообщение от accept Посмотреть сообщение
то, как организована адресация в программе, зависит от компилятора, а не от архитектуры
Да ну? От компилятора зависит только то, какой объект по какому адресу расположен. А организация памяти - зависит от архитектуры. Способ выяснения пересекающихся блоков памяти так же зависит от архитектуры. И на всех "нормальных" архитектурах он выглядит абсолютно одинаково

Цитата Сообщение от accept Посмотреть сообщение
ты не знаешь
Что я не знаю?
0
accept
4832 / 3253 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
19.09.2012, 12:56 #21
Цитата Сообщение от Evg Посмотреть сообщение
От компилятора зависит только то, какой объект по какому адресу расположен.
от компилятора зависят сами эти номера, для упрощения они во всех системах представляются одинаково
0
Evg
Эксперт CАвтор FAQ
18909 / 6868 / 503
Регистрация: 30.03.2009
Сообщений: 19,336
Записей в блоге: 30
19.09.2012, 12:59 #22
Цитата Сообщение от accept Посмотреть сообщение
от компилятора зависят сами эти номера, для упрощения они во всех системах представляются одинаково
Только вот представленый алгоритм memmove никак не зависит от конкретных значений адресов (он будет работать с любыми значениями). Но алгоритм зависит от реализации памяти. Что память - это сплошное пространство, адресация в котором идёт от меньших адресов к большим и адресация исчисляется в терминах целочисленных величин. И такая реализация памяти на всех процессорах (независимо от компилятора)
0
accept
4832 / 3253 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
19.09.2012, 13:22 #23
Цитата Сообщение от Evg Посмотреть сообщение
Только вот представленый алгоритм memmove никак не зависит от конкретных значений адресов (он будет работать с любыми значениями).
Цитата Сообщение от Evg Посмотреть сообщение
C
1
len -= (-dstp) % OPSIZ;
каково будет значение -dstp при максимальном dstp ?
0
alkagolik
Заблокирован
19.09.2012, 13:23 #24
Цитата Сообщение от accept Посмотреть сообщение
используется хак, переводящий указатели в числа, основыванный на данных о том, как компилятор создаёт множество адресов
а чем указатели не числа? те же целочисленные величины без знака. Только именуются виртуальными адресами.
Цитата Сообщение от accept Посмотреть сообщение
то, как организована адресация в программе, зависит от компилятора, а не от архитектуры
компилятор имеет право "перетасовать" гипотетически имеющиеся в его распоряжении адреса. Организация же адресации (ЧТ=ВА->ФА->данные, ЗП=данные->ВА->ФА) осуществляется "под" компилятором, т.е. ниже.
0
accept
4832 / 3253 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
19.09.2012, 13:27 #25
Цитата Сообщение от alkagolik Посмотреть сообщение
а чем указатели не числа?
они обрабатываются по правилам стандарта
0
Evg
Эксперт CАвтор FAQ
18909 / 6868 / 503
Регистрация: 30.03.2009
Сообщений: 19,336
Записей в блоге: 30
19.09.2012, 14:03 #26
Цитата Сообщение от accept Посмотреть сообщение
каково будет значение -dstp при максимальном dstp ?
Если я правильно понимаю вопрос и dstp=0xff.....

C
len -= (-dstp) % OPSIZ;
len -= ((unsigned long)(0 - 0xffffffffUL)) % OPSIZ;
len -= (1) % OPSIZ;
len -= 1;
С учётом того, что при dstp=0xfff... значение len может быть либо 0, либо 1 (любые другие значения говорят о том, что пользователь подал некорректные данные), и приналичии условия if (len >= OP_T_THRES) в эту ветку мы вообще никогда не попадём
0
19.09.2012, 14:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 14:03
Привет! Вот еще темы с ответами:

Ошибка void value not ignored as it ought to be - C (СИ)
Выдается следующая ошибка в функции zamena 56 строчка Помогите #include <stdio.h> #include <stdlib.h> #include <windows.h> ...

Cannot convert 'void*' to 'int*' - C (СИ)
Доброго времени суток. На этот код компилятор выдаёт ошибку "cannot convert 'void*' to 'int*'". Что не так? #include <stdio.h.> ...

Cannot convert int to Void* - C (СИ)
Возникает ошибка при динамическом расширении памяти. вот фрагменты большой курсовой. #include <stdlib.h> #include <stdio.h> ...

Преобразование void* в char* - C (СИ)
Мне нужно написать абстрактную функцию двоичного поиска для любого типа данных, в котором функция сравнения является параметром. Я не знал,...


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

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

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