реклама на сайте
подробности

 
 
> вопрос по memcpy
Jenya7
сообщение Dec 2 2015, 07:16
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



функция копирует с младшего байта в младший байт. а нельзя как нибудь начиная со старшего байта в младший байт?
то есть сейчас
Код
dest[] = {0}
src[] = {1,2,3,4,5}
memcpy(dest,src,5);

и после выполнения
Код
dest = {1,2,3,4,5}

а я хочу
Код
dest = {5,4,3,2,1}



Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smalcom
сообщение Dec 3 2015, 00:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Исходник
Код
int main()
{
volatile int ps1 = 1;
volatile int cnt = 0;

#if 0
    while(ps1--)
    {
        cnt++;
        printf("%i, %i", cnt, ps1);
    }
    
#else
    if(ps1 > 0)
    {
        do
        {
            cnt++;
            printf("%i, %i", cnt, ps1);
        } while(--ps1);
    }
#endif

    return 0;
}


Для while{}
Код
00000000 <main>:
   0:    e3a02001     mov    r2, #1
   4:    e3a03000     mov    r3, #0
   8:    e52de004     push    {lr}       ; (str lr, [sp, #-4]!)
   c:    e24dd00c     sub    sp, sp, #12
  10:    e58d2000     str    r2, [sp]
  14:    e58d3004     str    r3, [sp, #4]



  18:    ea000006     b    38 <main+0x38>

  1c:    e59d3004     ldr    r3, [sp, #4]
  20:    e2833001     add    r3, r3, #1
  24:    e58d3004     str    r3, [sp, #4]

  28:    e59d1004     ldr    r1, [sp, #4]
  2c:    e59f0028     ldr    r0, [pc, #40]   ; 5c <main+0x5c>
  30:    e59d2000     ldr    r2, [sp]
  34:    ebfffffe     bl    0 <printf>

  38:    e59d3000     ldr    r3, [sp]
  3c:    e3530000     cmp    r3, #0
  40:    e2433001     sub    r3, r3, #1
  44:    e58d3000     str    r3, [sp]
  48:    1afffff3     bne    1c <main+0x1c>
  


  4c:    e3a00000     mov    r0, #0
  50:    e28dd00c     add    sp, sp, #12
  54:    e49de004     pop    {lr}       ; (ldr lr, [sp], #4)
  58:    e12fff1e     bx    lr
  5c:    00000000     .word    0x00000000


Для do {} while()
Код
00000000 <main>:
   0:    e3a03000     mov    r3, #0
   4:    e3a02001     mov    r2, #1
   8:    e52de004     push    {lr}       ; (str lr, [sp, #-4]!)
   c:    e24dd00c     sub    sp, sp, #12
  10:    e58d2000     str    r2, [sp]
  14:    e58d3004     str    r3, [sp, #4]



  18:    e59d3000     ldr    r3, [sp]
  1c:    e3530000     cmp    r3, #0
  20:    da00000b     ble    54 <main+0x54>

  24:    e59d3004     ldr    r3, [sp, #4]
  28:    e2833001     add    r3, r3, #1
  2c:    e58d3004     str    r3, [sp, #4]

  30:    e59d1004     ldr    r1, [sp, #4]
  34:    e59f0028     ldr    r0, [pc, #40]   ; 64 <main+0x64>
  38:    e59d2000     ldr    r2, [sp]
  3c:    ebfffffe     bl    0 <printf>
  
  40:    e59d3000     ldr    r3, [sp]
  44:    e2433001     sub    r3, r3, #1
  48:    e3530000     cmp    r3, #0
  4c:    e58d3000     str    r3, [sp]
  50:    1afffff3     bne    24 <main+0x24>



  54:    e3a00000     mov    r0, #0
  58:    e28dd00c     add    sp, sp, #12
  5c:    e49de004     pop    {lr}       ; (ldr lr, [sp], #4)
  60:    e12fff1e     bx    lr
  64:    00000000     .word    0x00000000


Компилятор gcc-5.2.0. Сборка arm-none-eabi-gcc -c 1.c -O2 -o 0.o

Что говорит букварь
Код
if() <- проверка - один раз; переход один раз в плохом случае
do
...
while <- проверка и переход каждую итерацию


Код
while <- проверка - каждую итерацию, переход - один раз в конце
{
...
} <- переход каждую итерацию

для while всегда имеем +1 переход

Цитата
но побоялся справедливого гнева настоящих кодеров, которые ассерты не используют.

программа, по воможности, должна работать при любых ошибках. assert - это аварийное завершение. по сути перекладывание проблемы с разработчика на пользователя.

когда запускаешь программу и видишь аварийный выход из-за какой-то ерунды во входных параметрах, хочется испепелить разработчика, который не осилил правильную передачу вверх ошибки или
использование исключения.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2015, 03:58
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(smalcom @ Dec 3 2015, 06:24) *
программа, по воможности, должна работать при любых ошибках. assert - это аварийное завершение. по сути перекладывание проблемы с разработчика на пользователя.
когда запускаешь программу и видишь аварийный выход из-за какой-то ерунды во входных параметрах, хочется испепелить разработчика, который не осилил правильную передачу вверх ошибки или
использование исключения.

Вы предлагаете не использовать assert-ы и тупо виснуть в случае неверных аргументов??? Странный подход......
Вообще-то - assert - это проверка входных условий функций. И используется как раз для отладки, для того, чтобы на стадии разработки и отладки выявить случаи передачи неверных аргументов.
Если этот assert возникает у юзера, это проблема не assert-а, а проблема в недостаточной отлаженности ПО. И даже в этом случае лучше пусть выполнится действие заложенное по assert (аварийный выход или там чего),
чем это ПО повиснет.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   вопрос по memcpy   Dec 2 2015, 07:16
- - aaarrr   Стандартно - нельзя   Dec 2 2015, 07:17
|- - Jenya7   Цитата(aaarrr @ Dec 2 2015, 13:17) Станда...   Dec 2 2015, 08:50
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 08:50) то ест...   Dec 2 2015, 08:58
|- - Jenya7   Цитата(CrimsonPig @ Dec 2 2015, 14:58) А ...   Dec 2 2015, 09:01
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 09:01) Кодvoi...   Dec 2 2015, 09:17
|- - Jenya7   Цитата(CrimsonPig @ Dec 2 2015, 15:17) За...   Dec 2 2015, 09:32
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 09:32) я не и...   Dec 2 2015, 09:35
|- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 11:35) Ст...   Dec 2 2015, 10:13
|- - CrimsonPig   Цитата(zltigo @ Dec 2 2015, 10:13) Не мен...   Dec 2 2015, 10:26
|- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 12:26) ко...   Dec 2 2015, 10:31
|- - CrimsonPig   Цитата(zltigo @ Dec 2 2015, 10:31) Это ес...   Dec 2 2015, 10:42
|- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 12:42) Эт...   Dec 2 2015, 10:51
- - smalcom   Кодvoid ReverseArray(uint8_t* pDestArr, uint8_...   Dec 2 2015, 10:45
|- - Сергей Борщ   Цитата(smalcom @ Dec 2 2015, 13:45) Да, о...   Dec 2 2015, 10:55
||- - CrimsonPig   Цитата(Сергей Борщ @ Dec 2 2015, 10:55) Д...   Dec 2 2015, 11:12
||- - Сергей Борщ   Цитата(CrimsonPig @ Dec 2 2015, 14:12) до...   Dec 2 2015, 11:18
|||- - Jenya7   Цитата(Сергей Борщ @ Dec 2 2015, 17:18) m...   Dec 2 2015, 11:46
|||- - Сергей Борщ   Цитата(Jenya7 @ Dec 2 2015, 14:46) вылета...   Dec 2 2015, 11:55
|||- - CrimsonPig   Цитата(Сергей Борщ @ Dec 2 2015, 11:55) Г...   Dec 2 2015, 12:37
|||- - Jenya7   Цитата(Сергей Борщ @ Dec 2 2015, 17:55) Г...   Dec 2 2015, 13:02
||- - zltigo   QUOTE (CrimsonPig @ Dec 2 2015, 13:12) до...   Dec 2 2015, 12:22
|- - Jenya7   ok...надо подумать...   Dec 2 2015, 11:35
|- - CrimsonPig   Цитата(Jenya7 @ Dec 2 2015, 11:35) спасиб...   Dec 2 2015, 11:40
- - smalcom   Цитатаdo { } while(--pSize) заменить на while(pSiz...   Dec 2 2015, 13:07
|- - CrimsonPig   Цитата(smalcom @ Dec 2 2015, 13:07) это з...   Dec 2 2015, 13:39
||- - smalcom   Цитата(CrimsonPig @ Dec 2 2015, 15:39) Та...   Dec 2 2015, 14:28
|- - Сергей Борщ   Цитата(Jenya7 @ Dec 2 2015, 16:02) я поня...   Dec 2 2015, 14:59
- - Mahagam   а как любители ассертов ассертят то, что src и dst...   Dec 2 2015, 15:20
|- - CrimsonPig   Цитата(Mahagam @ Dec 2 2015, 15:20) а как...   Dec 2 2015, 16:06
|- - Сергей Борщ   Цитата(smalcom @ Dec 3 2015, 03:24) Исход...   Dec 3 2015, 13:25
- - smalcom   ЦитатаВы предлагаете не использовать assert-ы и ту...   Dec 3 2015, 10:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 13:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016