Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ Программирование _ Навигация по строкам

Автор: Jenya7 Jul 24 2018, 09:30

Есть массив строк

Код
char *s_MainMenu[] =
{
    "MAINT ",
    " AUTO ",
    "MANUAL",
    "FAILS ",
    "MUXBUS"
};
и структура
Код
typedef struct
{
    char **WordstoDisplay;
    uint8_t  MenuState;
    uint8_t  MaxStringIndex;
}g_sDisplay;

g_sDisplay g_DisplayStates;
я ее инициализирую
Код
void set_display_state(uint8_t state_val, uint8_t state_maxind, char **words)
{
    g_DisplayStates.MenuState = state_val;
    g_DisplayStates.MaxStringIndex = state_maxind;
    g_DisplayStates.WordstoDisplay = words;
}
set_display_state(MAIN_STATE,MAX_MAIN_INDEX, s_MainMenu);

по идее g_DisplayStates.WordstoDisplay теперь указывает на s_MainMenu
теперь я кнопками перебираю строки и печатаю их
Код
WriteText((uint8_t *)(*g_DisplayStates.WordstoDisplay + g_uiCounterPush));
пробовал и так
WriteText((uint8_t *)(g_DisplayStates.WordstoDisplay + g_uiCounterPush));
Но вижу мусор. Очевидно я неправильно делаю математику с указателями. Что нужно поправить?

Автор: Forger Jul 24 2018, 09:52

Цитата(Jenya7 @ Jul 24 2018, 12:30) *
Что нужно поправить?

Покажите код WriteText

Цитата
Очевидно я неправильно делаю математику с указателями.

Очевидно другое - вы не понимаете своего же кода wink.gif

Как минимум, попытайтесь отказаться хотя бы от двойных указателей и бездумных приведений типа (см. применение WriteText).

Автор: Jenya7 Jul 24 2018, 10:03

Цитата(Forger @ Jul 24 2018, 14:52) *
Покажите код WriteText


Очевидно другое - вы не понимаете своего же кода wink.gif

Как минимум, попытайтесь отказаться хотя бы от двойных указателей и бездумных приведений типа (см. применение WriteText).


с WriteText все в порядке. если я передаю постоянную строку WriteText("PREVED MEDVED") она отображается правильно.


Автор: Forger Jul 24 2018, 10:13

Цитата(Jenya7 @ Jul 24 2018, 13:03) *
с WriteText все в порядке. если я передаю постоянную строку WriteText("PREVED MEDVED") она отображается правильно.

Покажите хотя бы прототип WriteText


Цитата
если я передаю постоянную строку WriteText("PREVED MEDVED") она отображается правильно.

Вот исходя из этого факта, поэтапно разберитесь где именно в вашем "коде" ошибки.

Автор: XVR Jul 24 2018, 10:35

Цитата(Jenya7 @ Jul 24 2018, 12:30) *
по идее g_DisplayStates.WordstoDisplay теперь указывает на s_MainMenu
теперь я кнопками перебираю строки и печатаю их
Код
WriteText((uint8_t *)(*g_DisplayStates.WordstoDisplay + g_uiCounterPush));
пробовал и так
WriteText((uint8_t *)(g_DisplayStates.WordstoDisplay + g_uiCounterPush));
Но вижу мусор. Очевидно я неправильно делаю математику с указателями. Что нужно поправить?


Код
WriteText(g_DisplayStates.WordstoDisplay [g_uiCounterPush]);


Автор: jcxz Jul 24 2018, 10:55

Цитата(Jenya7 @ Jul 24 2018, 12:30) *
Но вижу мусор. Очевидно я неправильно делаю математику с указателями. Что нужно поправить?

Вангую: WriteText(g_DisplayStates.WordstoDisplay[g_uiCounterPush]);
если: g_uiCounterPush - индекс внутри s_MainMenu; а WriteText объявлена типа WriteText(char const *)

PS: И ещё раз недвусмысленно намекаю на необходимость изучения языка си ТС-ом и в частности - ключевого слова const. Чего как видно из этого примера ТС не знает (да и из других сообщений от данного автора).

Автор: x893 Jul 24 2018, 11:14

Да хрен с ними с книжками. Отладчиком можно посмотреть.
Да и ИИ уже сделали - загружаешь туда программу, а он говорит что неправильно.

Автор: Jenya7 Jul 24 2018, 11:18

Цитата(XVR @ Jul 24 2018, 15:35) *
Код
WriteText(g_DisplayStates.WordstoDisplay [g_uiCounterPush]);


спасибо. изначально так и сделал. забыл добавить в аргумент второе измерение char *words[]

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)