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

 
 
> CVAVR, Обнаружение конца массива
*SERG
сообщение Dec 15 2005, 13:14
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Передаю массив в усапп, обращаюсь к массиву с помощью массива указателя, даг вот вопрос КАК ОПРЕДЕЛИТЬ ЧТО МАССИВ ПЕРЕДАН
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
IgorKossak
сообщение Dec 15 2005, 13:23
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Конец массива - по счётчику длинны массива или по нулевому значению в конце массива если массив - текстовая строка.
Конец передачи - по прерыванию или по флагу TXC после передачи последнего байта в UDR.
Go to the top of the page
 
+Quote Post
*SERG
сообщение Dec 15 2005, 13:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Да это то в курсах......................., как определить что именно последний элемент массива передан?
нули собаки тож есть, можно конечно переменной которая ни где не встречается, но это немеренно в принцепе "ненужных" переменных
Сравнивать последние элементы с какой то константой не реально, массивов штук 200, да и элементы массива повторяются..................например 5ый=10ому
Что делать?
Я думаю может функция какая есть, в принцепе с этой целью вопрос и задал............
Так то выслушаю все варианты smile.gif
Размер массивов то ж разный

Сообщение отредактировал *SERG - Dec 15 2005, 13:35
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 15 2005, 13:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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


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


--------------------
Go to the top of the page
 
+Quote Post
Виктория
сообщение Dec 15 2005, 13:58
Сообщение #5


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



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


Так чем ответ IgorKossak - не устроил? Чудес в природе не бывает, никто за нас нашу работу не выполнит (шуткаsmile.gif).
Либо байт с константой, несколько байт с константой (константами) и контроль условия совпадения (все равно тяжеловато и может встретится, хотя если 0x55, 0x55, ..., 0x55, то вероятность для числовых данных ничтожная).
Либо Ваша функция передачи массива по последовательному интерфейсу должна иметь входной параметр длина массива. При вызове функции он точно всегда известен.
Go to the top of the page
 
+Quote Post
BVU
сообщение Dec 15 2005, 14:30
Сообщение #6


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Можете делать конвертацию своих данных при передаче, например в ASCII или unicode (выбор - что более подходит под задачу). В таблице этих стандартов есть управляющие символы, которые определены как старт и терминатор. Правда увеличивается несколько время на кодировку/декодировку, но зато с распарсиванием проблемы не будет никакой!
Другой вариант: в зависимости от диапазона используемых значений можно делать маркировку старшего разряда '0' - все кроме последнего, '1' - конечный элемент массива.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
*SERG
сообщение Dec 19 2005, 07:02
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



oK ВСЕМ СПАСИБО
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 16 2006, 07:51
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Цитата(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
Если можно то примерчик приведите плиз
Go to the top of the page
 
+Quote Post
vet
сообщение Jan 16 2006, 08:28
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Оператор sizeof возвращает размер переменной, в т.ч. массива, в байтах, на этапе компиляции. Размерность массива - это его размер, делённый на размер элемента массива; учитывая, что char занимает 1 байт, получаем
x = sizeof(hex2D);


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Виктория
сообщение Jan 16 2006, 08:39
Сообщение #10


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



200 массивов - на этапе компиляции???

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

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

Собственно, все это уже говорили выше.
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 16 2006, 09:00
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



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

ОООООООООООООООООООООООООООО, то что надо благодарю!!!
Щас проверю smile.gif
Go to the top of the page
 
+Quote Post
Виктория
сообщение Jan 16 2006, 09:08
Сообщение #12


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



*SERG????
На этапе компиляции Вам и так известна длина каждого из массивов, а по указателю массива sizeof не сработает!
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 16 2006, 09:21
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Эххххххххххххххххххх, то............... да немного не то, это ж только на этапе компиляции т.е сколько массивов столько и этих переменных шлёпать чтоли??? А потом ещё соответствие какето вводить.........

Проще наверно нулевой элемент массива вводить равный длинне массива и от него уже плясать ( стандартно декрементировать до нуля), т.к "нули" и различные переменные есть в массивах, можно сказать что всё от 0 до 0XFF занятоsad.gif, а нулевой элемент массива уже однозначно определит его длинну!!! Наверно так и зделаю
Может ещё что нибудь подскажите???

Сообщение отредактировал *SERG - Jan 16 2006, 09:32
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 16 2006, 09:34
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



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

Нооооооооооооо, уже дошло sad.gif
Go to the top of the page
 
+Quote Post
vet
сообщение Jan 16 2006, 10:44
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



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


1) Не всегда известна:
char s[]="some arbitrary string";
2) Сработает для массива, если это не параметр функции.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
*SERG
сообщение Jan 16 2006, 10:59
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Всё таки проще будет если нулевой элемент будет равен длине массива
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 10:08
Рейтинг@Mail.ru


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