Работа с byte-массивами

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

 

Здравствуйте!

 

Есть необходимость присвоить одному byte-массиву другой, т.е.:

 

byte arr1[8];
byte arr2[8];
...
arr1=arr2;

 

Такой фокус не проходит. Поэлементное присвоение или перегрузка оператора...это выход, но есть ли метод универсальное?

И еще как сравнить байтовые массивы (не поэлементно)?

 

maksim
Offline
Зарегистрирован: 12.02.2012

только циклом 
 

int i = 0;
while(i < 8){
arr1[i] = arr2[i];
i++;
}

 или

 for(int i = 0; i < 8; i++){
    arr1[i] = arr2[i];
  }

 

 

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

Угу...Наверное это кротчайший вариант.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну можно еще вот так ) :

arr1[0] = arr2[0];
arr1[1] = arr2[1];
arr1[2] = arr2[2];
arr1[3] = arr2[3];
arr1[4] = arr2[4];
arr1[5] = arr2[5];
arr1[6] = arr2[6];
arr1[7] = arr2[7];


 кстати, когда размер массива маленький (к примеру 3) то так проще.

step962
Offline
Зарегистрирован: 23.05.2011

.c8r пишет:

 

Здравствуйте!

 

Есть необходимость присвоить одному byte-массиву другой, т.е.:

 

byte arr1[8];
byte arr2[8];
...
arr1=arr2;

 

Такой фокус не проходит. Поэлементное присвоение или перегрузка оператора...это выход, но есть ли метод универсальное? 

Так не пробовали?

memcpy(arr1,arr2,8);

 

 

whoim
Offline
Зарегистрирован: 03.11.2011

step962 пишет:

.c8r пишет:

 

Здравствуйте!

 

Есть необходимость присвоить одному byte-массиву другой, т.е.:

 

byte arr1[8];
byte arr2[8];
...
arr1=arr2;

 

Такой фокус не проходит. Поэлементное присвоение или перегрузка оператора...это выход, но есть ли метод универсальное? 

Так не пробовали?

memcpy(arr1,arr2,8);

 

 

о_О.. надо запомнить)

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

Да, удобный фокус. А как разместить такой массив в энергонезависимой памяти?

whoim
Offline
Зарегистрирован: 03.11.2011

 EEPROM или где сама программа хранится? Последнее - progmem

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

в eeprom, а во флеш тоже можно?

whoim
Offline
Зарегистрирован: 03.11.2011

.c8r пишет:

в eeprom, а во флеш тоже можно?

константой - чтобы сэкономить ОЗУ.

whoim
Offline
Зарегистрирован: 03.11.2011

 ЕЕЕПРОМ - куча библиотек, посмотри на EEEPROM2, ей проще сохранять не только байт-представления но и например int, сама два байта ложит/читает.

maksim
Offline
Зарегистрирован: 12.02.2012

whoim пишет:

step962 пишет:

.c8r пишет:

 

Здравствуйте!

 

Есть необходимость присвоить одному byte-массиву другой, т.е.:

 

byte arr1[8];
byte arr2[8];
...
arr1=arr2;

 

Такой фокус не проходит. Поэлементное присвоение или перегрузка оператора...это выход, но есть ли метод универсальное? 

Так не пробовали?

memcpy(arr1,arr2,8);

 

 

о_О.. надо запомнить)

Вот и я когда с этим столкнулся, спросил у знакомого программиста, который пишит на СИ: "Как один массив присвоить другому", а он мне ответил, что только циклом, а теперь, когда я говорю, что есть функция, он мне говорит, что это СИшная функция. Вот не мутант ли... я ему и звонил потому, что он пишет на СИ.

mixail844
Offline
Зарегистрирован: 30.04.2012

а есть функиция

char * strcpy ( char * destination, const char * source );

которая как раз то и делает.что копирует из одного массива букв в другой и возвращает адресс указателя куда был скопирован массив
 

для сравнения двух массивов

int strcmp ( const char * str1, const char * str2 );

возвращает 0 если массивы идентичны

возвращает значение >0 если str1>str2

возвращает значение <0 если str1<str2

еще удобно в качестве функции сравнения использовать :

const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 );

функция проверяет есть в нутри массива str1 последовательность в виде str2 и возвращает 1 если есть,и 0 если нет.

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

Вот и я когда с этим столкнулся, спросил у знакомого программиста, который пишит на СИ: "Как один массив присвоить другому", а он мне ответил, что только циклом, а теперь, когда я говорю, что есть функция, он мне говорит, что это СИшная функция. Вот не мутант ли... я ему и звонил потому, что он пишет на СИ.

Скорее всего он вам сказал что это "библиотечная функция". Или "это функция из стандартных си-шных библиотек".

И все верно он вам сказал - только циклом. Вопрос в том "кто этот цикл написал". Вы лично или взяли наработки предшественников. Внутри эта memcpy, не заклинаниями данные переносит, а именно циклом.

Вот ее реализация

void memcpy(void* dest, void* src, int n_size) {
char* d = (char*) dest;
char* s = (char*) src;
while(n_size– > 0) {
*d++ = *s++;
}
}

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

Правда в, в случае с ардуино, подключать или нет - за нас уже решили и подключили нам ее насильно (поэтому и пустой скетч имеет далеко не нулевой размер). Поэтому "истинные программеры" и не любят Arduino. Они привыкли сами решать что подлючать, а что нет.

Поэтому он вам и сказал "в ЯЗЫКЕ C" - только циклом. А уж какие либы у вас есть под рукой - он знать не мог (хотя могбы и предположить, и подсказать).

>Вот не мутант ли...

Мутант. Хотите или нет, а професия накладывает психологические деформации. Он дал вам абсолютно формально-правильный ответ. Вот если-бы вы спросили "а существуют ли какие-то библиотеки-функции готовые, для упрощения" - он бы вам рассказал про memcpy :)  Тут уж ничего не поделаешь. Нужно делать "поправку на ветер" при общении с нами.

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