Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CVAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
*SERG
Передаю массив в усапп, обращаюсь к массиву с помощью массива указателя, даг вот вопрос КАК ОПРЕДЕЛИТЬ ЧТО МАССИВ ПЕРЕДАН
IgorKossak
Конец массива - по счётчику длинны массива или по нулевому значению в конце массива если массив - текстовая строка.
Конец передачи - по прерыванию или по флагу TXC после передачи последнего байта в UDR.
*SERG
Да это то в курсах......................., как определить что именно последний элемент массива передан?
нули собаки тож есть, можно конечно переменной которая ни где не встречается, но это немеренно в принцепе "ненужных" переменных
Сравнивать последние элементы с какой то константой не реально, массивов штук 200, да и элементы массива повторяются..................например 5ый=10ому
Что делать?
Я думаю может функция какая есть, в принцепе с этой целью вопрос и задал............
Так то выслушаю все варианты smile.gif
Размер массивов то ж разный
prottoss
Цитата(*SERG @ Dec 15 2005, 20:27) *
Да это то в курсах......................., как определить что именно последний элемент массива передан?
нули собаки тож есть, можно конечно переменной которая ни где не встречается, но это немеренно в принцепе "ненужных" переменных
Сравнивать последние элементы с какой то константой не реально, массивов штук 200, да и элементы массива повторяются..................например 5ый=10ому
Что делать?
Я думаю может функция какая есть, в принцепе с этой целью вопрос и задал............
Так то выслушаю все варианты smile.gif
Размер массивов то ж разный


Ну а чем Вам счетчик длины массива то не нравится? По моему самое простое и стандартное решение. И, главное, ресурсов много не занимает - всего одна переменная, содержимое которой уменьшается (или увеличивается) с передачей каждого байта массива. Как только она стала равной нулю (или константе - длине массива), все массив передан. Она же, обычно, является и указателем на передаваемый элемент массива, то есть индексом. За чем усложнять то, что очевидно?
Виктория
Цитата(*SERG @ Dec 15 2005, 17:27) *
Да это то в курсах......................., как определить что именно последний элемент массива передан?
нули собаки тож есть, можно конечно переменной которая ни где не встречается, но это немеренно в принцепе "ненужных" переменных
Сравнивать последние элементы с какой то константой не реально, массивов штук 200, да и элементы массива повторяются..................например 5ый=10ому
Что делать?
Я думаю может функция какая есть, в принцепе с этой целью вопрос и задал............
Так то выслушаю все варианты smile.gif
Размер массивов то ж разный


Так чем ответ IgorKossak - не устроил? Чудес в природе не бывает, никто за нас нашу работу не выполнит (шуткаsmile.gif).
Либо байт с константой, несколько байт с константой (константами) и контроль условия совпадения (все равно тяжеловато и может встретится, хотя если 0x55, 0x55, ..., 0x55, то вероятность для числовых данных ничтожная).
Либо Ваша функция передачи массива по последовательному интерфейсу должна иметь входной параметр длина массива. При вызове функции он точно всегда известен.
BVU
Можете делать конвертацию своих данных при передаче, например в ASCII или unicode (выбор - что более подходит под задачу). В таблице этих стандартов есть управляющие символы, которые определены как старт и терминатор. Правда увеличивается несколько время на кодировку/декодировку, но зато с распарсиванием проблемы не будет никакой!
Другой вариант: в зависимости от диапазона используемых значений можно делать маркировку старшего разряда '0' - все кроме последнего, '1' - конечный элемент массива.
*SERG
oK ВСЕМ СПАСИБО
*SERG
Цитата(prottoss @ Dec 15 2005, 16:57) *
Цитата(*SERG @ Dec 15 2005, 20:27) *
Да это то в курсах......................., как определить что именно последний элемент массива передан?
нули собаки тож есть, можно конечно переменной которая ни где не встречается, но это немеренно в принцепе "ненужных" переменных
Сравнивать последние элементы с какой то константой не реально, массивов штук 200, да и элементы массива повторяются..................например 5ый=10ому
Что делать?
Я думаю может функция какая есть, в принцепе с этой целью вопрос и задал............
Так то выслушаю все варианты smile.gif
Размер массивов то ж разный


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


Задача прояснилась конкретней, есть 150-200 массивов, записаны байты, длинна изменяется от 3 до 7, массивы заданны так:

flash unsigned char hex2D[3]={0b01111111,0b00001000,0b00001000};//?
flash unsigned char hex2E[4]={0b00111110,0b01000001,0b01000001,0b01000001};//?
flash unsigned char hex2F[5]={0b01111111,0b00000001,0b00000001,0b00000001,0b01111111};//?

т.е. количество элементов массива "известны" (записанны в объявленни массива в []), помоему ваш вариант подходит. Но не соображу как это зделать на функциях СИ, как определять какое количество элементов в данном массиве, какой функцией воспользоваться???
Хотелось бы чтонибудь типа такого:

x= функция(hex2D[3]);
где х- количество элементов массива, т.е в данном случае x=3; smile.gif
Если можно то примерчик приведите плиз
vet
Оператор sizeof возвращает размер переменной, в т.ч. массива, в байтах, на этапе компиляции. Размерность массива - это его размер, делённый на размер элемента массива; учитывая, что char занимает 1 байт, получаем
x = sizeof(hex2D);
Виктория
200 массивов - на этапе компиляции???

1 вариант - дописать нуль в конце каждого массива, тогда x=strlen(hex2D) - 200 байт накладных

2 вариант - длины массивов - переменные (либо отдельный массив из 200 длин, либо первый или последний элемент каждого из массивов hex).

Собственно, все это уже говорили выше.
*SERG
Цитата(vet @ Jan 16 2006, 11:28) *
Оператор sizeof возвращает размер переменной, в т.ч. массива, в байтах, на этапе компиляции. Размерность массива - это его размер, делённый на размер элемента массива; учитывая, что char занимает 1 байт, получаем
x = sizeof(hex2D);

ОООООООООООООООООООООООООООО, то что надо благодарю!!!
Щас проверю smile.gif
Виктория
*SERG????
На этапе компиляции Вам и так известна длина каждого из массивов, а по указателю массива sizeof не сработает!
*SERG
Эххххххххххххххххххх, то............... да немного не то, это ж только на этапе компиляции т.е сколько массивов столько и этих переменных шлёпать чтоли??? А потом ещё соответствие какето вводить.........

Проще наверно нулевой элемент массива вводить равный длинне массива и от него уже плясать ( стандартно декрементировать до нуля), т.к "нули" и различные переменные есть в массивах, можно сказать что всё от 0 до 0XFF занятоsad.gif, а нулевой элемент массива уже однозначно определит его длинну!!! Наверно так и зделаю
Может ещё что нибудь подскажите???
*SERG
Цитата(Vic1 @ Jan 16 2006, 12:08) *
*SERG????
На этапе компиляции Вам и так известна длина каждого из массивов, а по указателю массива sizeof не сработает!

Нооооооооооооо, уже дошло sad.gif
vet
Цитата(Vic1 @ Jan 16 2006, 12:08) *
*SERG????
На этапе компиляции Вам и так известна длина каждого из массивов, а по указателю массива sizeof не сработает!


1) Не всегда известна:
char s[]="some arbitrary string";
2) Сработает для массива, если это не параметр функции.
*SERG
Всё таки проще будет если нулевой элемент будет равен длине массива
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.