|
|
  |
Передача структуры в функцию через указатель |
|
|
|
May 22 2015, 12:21
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Здравствуйте уважаемые! Можно передать структуру в функцию через посредника? 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);
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
May 22 2015, 12:52
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
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. з.ы. Глюки выглядят так - как вроде, часть передаваемой структуры присутствует , а часть наполнена мусором.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
May 22 2015, 13:37
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Lmx2315 @ May 22 2015, 15:21)  Может быть проблема с упаковкой/выравниванием полей структуры? Посмотрите чему равен sizeof(struct)... Также можно предположить, что наблюдается нехватка ОЗУ.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
May 22 2015, 13:49
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(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); ... } и посмотрите что именно туда передаётся. если лично вы руками нигде "а" не меняете это еще не значит, что по ошибке в эту область памяти где она лежит никто не может записать что попало.
|
|
|
|
|
Jul 13 2015, 08:21
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Спасибо всем за участие. Не стал дальше разбираться с указателем на структуры, выше описанным. Стал передавать непосредственно структуры из одной функции в другую : Цитата 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] то в течении секунды. Причём индексы везде контролируются и не выходят за пределы массивов, по крайней мере я так думаю. Также хочу отметить - несмотря на проблемы со структурами , сама программа не валится, продолжает работать.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Jul 13 2015, 09:12
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
учитывая как в первом сообщении Вы довольно небезопасно обошлись с передачей в фунуцию указателя, вероятно не инициализированного, очень может так получиться, что в где-то в другом месте, какая-нибудь другая функция, вообще никак не связанная с PPI, тоже получает что попало в качестве указателя и по нему портит память в том месте где лежит ваша структура. то что в зависимости от размера структуры хоть и неиспользуемой, глюки меняются - еще один довод за то что кто-то где-то портит память. если нет отладчика чтобы брэйкпоинт на память в нужном месте поставить, понапихайте везде вывод значения через UART, соответственно увидите когда именно оно меняется, где меняться не должно.
|
|
|
|
|
Jul 13 2015, 11:55
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(_pv @ Jul 13 2015, 13:12)  учитывая как в первом сообщении Вы довольно небезопасно обошлись с передачей в фунуцию указателя, вероятно не инициализированного, очень может так получиться, что в где-то в другом месте, какая-нибудь другая функция, вообще никак не связанная с PPI, тоже получает что попало в качестве указателя и по нему портит память в том месте где лежит ваша структура. ..дело оказалось в массиве, он применялся в двух файлах проекта, только в одном у него оказался один размер а в другом - другой , в разы больше. После того как привёл к единообразию - сбои пропали, всё заработало. Единственно не пойму - массив (судя по файлу NewProject.map.xml лежит даже не рядом с структурой,наверное что-то ещё портил)
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|