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

 
 
 
Reply to this topicStart new topic
> Передача структуры в функцию через указатель
Lmx2315
сообщение May 22 2015, 12:21
Сообщение #1


отэц
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 22 2015, 12:30
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А функция PPI_massiv как определена, что принимает - структуру, указатель на структуру?
Go to the top of the page
 
+Quote Post
_pv
сообщение May 22 2015, 12:33
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



не получается ли так что например a = 2 или больше?
тогда во втором случае просто ничего не произойдет, а вот в первом в функцию отправится неинициализированный указатель.

Sintez_struct Struk0,Struk1; //структуры массивов
Sintez_struct * Sintez_str = Struk0; //указатель на структуру
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 22 2015, 12:34
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Lmx2315 @ May 22 2015, 15:21) *
..я так собственно сделал и поймал кучу глюков, делал в VisualDSP.

В первом случае можно получить проблемы, если a не равна ни нулю ни единице, а во втором это исключено.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение May 22 2015, 12:52
Сообщение #5


отэц
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 22 2015, 13:23
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Структура используется в программе, или через периферию куда-то наружу уходит? В последнем случае можно заподозрить проблемы с кэшированием.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение May 22 2015, 13:34
Сообщение #7


отэц
*****

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



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

..никуда не уходит, структура передаётся из одной функции в другую по кругу, где-то меняется, где-то нет.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 22 2015, 13:37
Сообщение #8


неотягощённый злом
******

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



Цитата(Lmx2315 @ May 22 2015, 15:21) *
Может быть проблема с упаковкой/выравниванием полей структуры?
Посмотрите чему равен sizeof(struct)...
Также можно предположить, что наблюдается нехватка ОЗУ.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_pv
сообщение May 22 2015, 13:49
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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);
...
}
и посмотрите что именно туда передаётся.

если лично вы руками нигде "а" не меняете это еще не значит, что по ошибке в эту область памяти где она лежит никто не может записать что попало.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 13 2015, 08:21
Сообщение #10


отэц
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 13 2015, 09:09
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Очень похоже на нехватку стека.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_pv
сообщение Jul 13 2015, 09:12
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



учитывая как в первом сообщении Вы довольно небезопасно обошлись с передачей в фунуцию указателя, вероятно не инициализированного,
очень может так получиться, что в где-то в другом месте, какая-нибудь другая функция, вообще никак не связанная с PPI, тоже получает что попало в качестве указателя и по нему портит память в том месте где лежит ваша структура.
то что в зависимости от размера структуры хоть и неиспользуемой, глюки меняются - еще один довод за то что кто-то где-то портит память.
если нет отладчика чтобы брэйкпоинт на память в нужном месте поставить, понапихайте везде вывод значения через UART, соответственно увидите когда именно оно меняется, где меняться не должно.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 13 2015, 09:22
Сообщение #13


отэц
*****

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



..отладчика нет.
Спасибо за советы, попробую половить где портятся.
(размер стека менял - не помогает, если я правильно это делал)

з.ы.
я заметил что портится всегда только одна структура, они идут в памяти последовательно одна за одной.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 13 2015, 11:55
Сообщение #14


отэц
*****

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



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

..дело оказалось в массиве, он применялся в двух файлах проекта, только в одном у него оказался один размер а в другом - другой , в разы больше.
После того как привёл к единообразию - сбои пропали, всё заработало.
Единственно не пойму - массив (судя по файлу NewProject.map.xml лежит даже не рядом с структурой,наверное что-то ещё портил)


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:39
Рейтинг@Mail.ru


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