Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2011, 13:54   #1
nibir
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 11
По умолчанию Передача указателей на массив в функцию.

Программирую под микроконтроллер. Задача получать из АЦП данные и суммировать. Столкнулся с такой трудностью.
Есть некое место кода в котором есть кусок кода:
(кусок искусственный и написан для иллюстрации проблемы)
Код:
static uint8_t inp3[2]={0x00,0x00};
	static uint8_t outp3[2];
	static uint16_t voltage_sr;
	static uint16_t voltage_ch;
	static int		i;
....
//----------------------ACPV-----------------------------------------
			i=0;
			voltage_sr = 0;
			SPI_MasterTrRc(inp3, outp3, ACPV);
			while (i<=1)
			{
				
				voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213; // 2.5/4096*100 делитель на 100 стоит на входе
				++i;
			}		
			...
			//-------------------------------------------------------------------
Внимание нужно обратить на функцию SPI_MasterTrRc(inp3, outp3, ACPV); В ней вся проблема. Если ее поместить вне цикла (как сейчас), то все прекрасно, если засунуть внутрь - начинает МК глючить (куда-то вне памяти что ли пишется т.к. глюки очень различные и начинают зависеть от "расположения буковок в коде")
Тело функции такое:
Код:
void SPI_MasterTrRc(uint8_t *cDataIn, uint8_t *cDataOut, int dev)
{
	// чтение и запись из cDataIn вида cDataIn[0] = чему-то или что то =  cDataIn[1]
}
Собственно вопросы:
1) Чем отличается передача такая: SPI_MasterTrRc(inp3, outp3, ACPV); от такой SPI_MasterTrRc(&inp3[0], &outp3[0], ACPV); ?
2) Точно ли всегда массивы inp3 и out3 имеют одни и те же адреса? Когда аллоцируется память для этих 2 байт в массивах и когда освобождается?


Замечания:
Если написать просто так без цикла:
Код:
SPI_MasterTrRc(inp3, outp3, ACPV);
voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213; 

SPI_MasterTrRc(inp3, outp3, ACPV);
voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213;
работает и все складывается!
nibir вне форума Ответить с цитированием
Старый 05.07.2011, 15:58   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Я уверен, что передача inp3 ни чем не отличается от &inp3[0].
Массивы мало того, что не динамические, да еще объявлены static.
Выделение памяти под нединамические переменные должно в теории происходить при появлении их в зоне видимости. А освобождение, раз речь идет о static, при завершении программы.
Так что формально все правильно. Вы, стараясь популярнее изложить вопрос, видимо выхолостили проблему.
EUGY вне форума Ответить с цитированием
Старый 06.07.2011, 00:12   #3
nibir
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 11
По умолчанию

Спасибо за комментарий по проблеме.
Забыл сказать важное - мы на протяжении этого кода, можем вываливаться в прерывания везде и вываливаемся очень часто.

+Добавлю вовсе "наркоманию" (пусть будет всего ОДИН проход, i=1 стало):
Так работает
Код:
                        i=1;
			voltage_sr = 0;
			SPI_MasterTrRc(inp3, outp3, ACPV);
			while (i<=1)
			{
				
				voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213; // 2.5/4096*100 делитель на 100 стоит на входе
				++i;
			}
а так - нет
Код:
                        i=1;
			voltage_sr = 0;
			
			while (i<=1)
			{
				SPI_MasterTrRc(inp3, outp3, ACPV);
				voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213; // 2.5/4096*100 делитель на 100 стоит на входе
				++i;
			}
В чем могут быть проблемы? Ну хоть теоретически куда "рыть"? Как влияют на адреса/память переменных конструкции типа
Код:
 while (BOOL) {}

Последний раз редактировалось nibir; 06.07.2011 в 00:19.
nibir вне форума Ответить с цитированием
Старый 06.07.2011, 00:21   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А так?

Код:
i=1;
voltage_sr = 0;

lab:

	SPI_MasterTrRc(inp3, outp3, ACPV);
	voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213;
	++i;

if (i <= 1) goto lab;
А теперь так?
Код:
i=1;
voltage_sr = 0;

{
	SPI_MasterTrRc(inp3, outp3, ACPV);
	voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213;
        ++i;
}
Carbon вне форума Ответить с цитированием
Старый 06.07.2011, 00:37   #5
nibir
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 11
По умолчанию

Интересная мысль, тов. Carbon. Приду завтра на работу к микроконтроллеру и протестирую.

Вообще у меня отладчик есть аппаратный для него (микроконтроллера), но ввиду сложности моей программы и куче таймеров, прерываний, обработчиков в ней использование отладчика, думаю, там будет проблематично.
nibir вне форума Ответить с цитированием
Старый 06.07.2011, 00:39   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Есть мнение, товарищ nibir, что у вас палёный компилер.
Carbon вне форума Ответить с цитированием
Старый 06.07.2011, 00:43   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

static int i;
Она объявлена глобально?
Не может ли она случайно участвовать в коде самой функции.
Нутро функции Вы не привели, и я могу предположить, что в ней может есть какой-нибудь итератор тоже с именем i, но вы его, допустим, забыли объявить в теле функции.
EUGY вне форума Ответить с цитированием
Старый 06.07.2011, 11:42   #8
nibir
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
А так?

Код:
i=1;
voltage_sr = 0;

lab:

	SPI_MasterTrRc(inp3, outp3, ACPV);
	voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213;
	++i;

if (i <= 1) goto lab;
А теперь так?
Код:
i=1;
voltage_sr = 0;

{
	SPI_MasterTrRc(inp3, outp3, ACPV);
	voltage_sr += ((((uint16_t)outp3[0])<<8)+outp3[1])*13/213;
        ++i;
}
Первый способ не работает (поведение то же), второй работает. Пробовал и одно и несколько проходок (суммирований)
nibir вне форума Ответить с цитированием
Старый 06.07.2011, 11:43   #9
nibir
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
static int i;
Она объявлена глобально?
Не может ли она случайно участвовать в коде самой функции.
Нутро функции Вы не привели, и я могу предположить, что в ней может есть какой-нибудь итератор тоже с именем i, но вы его, допустим, забыли объявить в теле функции.
Нет она не объявлена глобально, на всякий случай попробовал все что тут писали и с именем ii вместо i - результат тот же.
nibir вне форума Ответить с цитированием
Старый 06.07.2011, 11:44   #10
nibir
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Есть мнение, товарищ nibir, что у вас палёный компилер.
Да что вы такое говорите! avr-gcc же!
nibir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача в функцию указателя на динамический массив Airou Общие вопросы C/C++ 4 05.05.2011 17:07
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
скорость работы указателей на функцию coinkrsk Общие вопросы C/C++ 3 31.10.2010 21:13
Передача списка указателей (TList) как параметр в dll sneksnek2006 Общие вопросы C/C++ 1 28.10.2010 11:33
Передача указателя на массив в функцию loser Общие вопросы C/C++ 2 19.02.2010 19:41