Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача структуры в функцию через указатель
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Lmx2315
Здравствуйте уважаемые!
Можно передать структуру в функцию через посредника?

CODE
  typedef struct                //
{
  unsigned int   TNI[256];
  unsigned int   TKI[256];
  unsigned int   TNP[256];
  unsigned int   TKP[256];
  
} Sintez_struct;

Sintez_struct    Struk0,Struk1; //структуры массивов
Sintez_struct     * Sintez_str;   //указатель на структуру

if (a==0) Sintez_str = &Struk0; //проверка условия по которому передаётся либо одна структура либо другая
if (a==1) Sintez_str = &Struk1;

   PPI_massiv(Sintez_str ); //отработка


..я так собственно сделал и поймал кучу глюков, делал в VisualDSP.
Если передаю в функцию непосредственно структуры то проблем нет - вот так

if (a==0) PPI_massiv(&Struk0);
if (a==1) PPI_massiv(&Struk1);
ViKo
А функция PPI_massiv как определена, что принимает - структуру, указатель на структуру?
_pv
не получается ли так что например a = 2 или больше?
тогда во втором случае просто ничего не произойдет, а вот в первом в функцию отправится неинициализированный указатель.

Sintez_struct Struk0,Struk1; //структуры массивов
Sintez_struct * Sintez_str = Struk0; //указатель на структуру
aaarrr
Цитата(Lmx2315 @ May 22 2015, 15:21) *
..я так собственно сделал и поймал кучу глюков, делал в VisualDSP.

В первом случае можно получить проблемы, если a не равна ни нулю ни единице, а во втором это исключено.
Lmx2315
QUOTE (ViKo @ May 22 2015, 16:30) *
А функция PPI_massiv как определена, что принимает - структуру, указатель на структуру?

void PPI_massiv(Sintez_struct *S )
QUOTE (_pv @ May 22 2015, 16:33) *
не получается ли так что например a = 2 или больше?

..переменная "а" принимает только 0 или 1.
з.ы.
Глюки выглядят так - как вроде, часть передаваемой структуры присутствует , а часть наполнена мусором.
aaarrr
Цитата(Lmx2315 @ May 22 2015, 15:52) *
Глюки выглядят так - как вроде, часть передаваемой структуру присутствует , а часть наполнена мусором.

Структура используется в программе, или через периферию куда-то наружу уходит? В последнем случае можно заподозрить проблемы с кэшированием.
Lmx2315
QUOTE (aaarrr @ May 22 2015, 17:23) *
Структура используется в программе, или через периферию куда-то наружу уходит? В последнем случае можно заподозрить проблемы с кэшированием.

..никуда не уходит, структура передаётся из одной функции в другую по кругу, где-то меняется, где-то нет.
demiurg_spb
Цитата(Lmx2315 @ May 22 2015, 15:21) *
Может быть проблема с упаковкой/выравниванием полей структуры?
Посмотрите чему равен sizeof(struct)...
Также можно предположить, что наблюдается нехватка ОЗУ.
_pv
Цитата(Lmx2315 @ May 22 2015, 18:52) *
..переменная "а" принимает только 0 или 1.
з.ы.
Глюки выглядят так - как вроде, часть передаваемой структуру присутствует , а часть наполнена мусором.

visualDSP не самый безглючный в мире компилятор, но тут проблема не в нём.

добавте тогда
printf ("%d\n", &Struk0);
printf ("%d\n", &Struk1);

перед каждым вызовом
printf ("a= %d\n", a);

а в PPI_massiv(Sintez_struct * s ){
printf ("ppi: %d\n", s);
...
}
и посмотрите что именно туда передаётся.

если лично вы руками нигде "а" не меняете это еще не значит, что по ошибке в эту область памяти где она лежит никто не может записать что попало.
Lmx2315
Спасибо всем за участие.
Не стал дальше разбираться с указателем на структуры, выше описанным.
Стал передавать непосредственно структуры из одной функции в другую :
Цитата
if (a==0u) { Packet_TNC1(Alfa,&Struk1);}
else
if (a==1u) { Packet_TNC1(Alfa,&Struk0);}



if (a==0)
{
//--------------------------------------------Транспортная часть----------------------------------------------
if (flag_PPI_sz2==0) { PPI_massiv('g',&Struk0);} //отправка массива по шине PPI в синтезатор
if (flag_PPI_sz1==0) { PPI_massiv('s',&Struk0);} //отправка массива по шине PPI в синтезатор
if (flag_PPI_sinc>0u) { massiv_time_setka(&Struk0,Event_word);flag_PPI_sinc_D2=1;} //отправка массива по шине PPI в синхронизатор

//-------------------------------------------------------------------------------------------------------------
}
if (a==1)
{
//--------------------------------------------Транспортная часть----------------------------------------------
if (flag_PPI_sz2==0) { PPI_massiv('g',&Struk1);} //отправка массива по шине PPI в синтезатор
if (flag_PPI_sz1==0) { PPI_massiv('s',&Struk1);} //отправка массива по шине PPI в синтезатор
if (flag_PPI_sinc>0u) { massiv_time_setka(&Struk1,Event_word);flag_PPI_sinc_D2=1;} //отправка массива по шине PPI в синхронизатор

//-------------------------------------------------------------------------------------------------------------
}


всё заработало, я обрадовался и занялся другими делами.
Потом обратил внимание что есть сбои , а именно - в структуре ряд элементов массивов начинают принимать значение которое они в принципе по логике программы не могут принять.
Конкретно - массивы структур, например TNI[0] - становится равен нулю (всегда нулю, других неправильных значений нет).
хотя он нигде не может получить такое значение и даже инициализируется в процедуре Packet_TNC1() через 0xFFFFFFFF;

Единственная функция которая влияет на структуры - Packet_TNC1() , остальные функции через которые структуры проходят - только читают их.
В программе много прерываний, но структура и коэффициенты её касающиеся нигде в прерываниях не изменяются и даже не читаются.
такой вопрос - где можно покопаться в поиске причин обнулений части структур?

з.ы.
причём заметил следующее - чем меньше размер массивов в структуре тем чаще сбои, хотя по логике работы в массиве используется сейчас только первые 10 элементов.
Т.е. если структура описана с массивами unsigned int TNI[256]; - такого размера , то сбои будут раз в минуту например.
А если TNI[20] то в течении секунды. Причём индексы везде контролируются и не выходят за пределы массивов, по крайней мере я так думаю.
Также хочу отметить - несмотря на проблемы со структурами , сама программа не валится, продолжает работать.
Сергей Борщ
Очень похоже на нехватку стека.
_pv
учитывая как в первом сообщении Вы довольно небезопасно обошлись с передачей в фунуцию указателя, вероятно не инициализированного,
очень может так получиться, что в где-то в другом месте, какая-нибудь другая функция, вообще никак не связанная с PPI, тоже получает что попало в качестве указателя и по нему портит память в том месте где лежит ваша структура.
то что в зависимости от размера структуры хоть и неиспользуемой, глюки меняются - еще один довод за то что кто-то где-то портит память.
если нет отладчика чтобы брэйкпоинт на память в нужном месте поставить, понапихайте везде вывод значения через UART, соответственно увидите когда именно оно меняется, где меняться не должно.
Lmx2315
..отладчика нет.
Спасибо за советы, попробую половить где портятся.
(размер стека менял - не помогает, если я правильно это делал)

з.ы.
я заметил что портится всегда только одна структура, они идут в памяти последовательно одна за одной.
Lmx2315
Цитата(_pv @ Jul 13 2015, 13:12) *
учитывая как в первом сообщении Вы довольно небезопасно обошлись с передачей в фунуцию указателя, вероятно не инициализированного,
очень может так получиться, что в где-то в другом месте, какая-нибудь другая функция, вообще никак не связанная с PPI, тоже получает что попало в качестве указателя и по нему портит память в том месте где лежит ваша структура.

..дело оказалось в массиве, он применялся в двух файлах проекта, только в одном у него оказался один размер а в другом - другой , в разы больше.
После того как привёл к единообразию - сбои пропали, всё заработало.
Единственно не пойму - массив (судя по файлу NewProject.map.xml лежит даже не рядом с структурой,наверное что-то ещё портил)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.