Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
sptes
7 / 7 / 1
Регистрация: 16.02.2011
Сообщений: 147
1

Как вытащить const указатель из массива структур?

24.02.2017, 19:12. Просмотров 861. Ответов 10
Метки нет (Все метки)

Здравствуйте. Пишу на pic в mplab. Хочу вытащить const указатель из массива структур, чтобы сравнить его с другим const указателем... Компилятор ругается.
C
1
2
3
4
5
if(msg_vars[uc_index].ptr_mes == ptr_mes) 
{
    uc_sort = uc_index;
    ...
}
Добавлено через 18 минут
внутри структуры const unsigned char *ptr_mes. В функции ptr_mes - аналогично const unsigned char *ptr_mes
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2017, 19:12
Ответы с готовыми решениями:

Передать функции структуру из массива структур или указатель на неё
передать функции структуру из массива структур или указатель на неё в качестве параметра. покажите...

Как передвигать указатель на следующий элемент массива структур?
Вопрос относительно использования символа стрелка '->'. Допустим, есть такой код:...

Передача массива структур в функцию через указатель
вот пример куска кода, не могу понять почему ругается на: void Add(student *ptr) { for(int i =...

Как вытащить массив структур?
Вот собственно код: struct CandyBar { char name; float weight; int...

В программе имеется следующий фрагмент: const char a='*'; char ch; как объявится указатель-переменная
В программе имеется следующий фрагмент: const char a='*'; char ch; как объявляется...

10
ShadowKing
28 / 28 / 23
Регистрация: 18.04.2015
Сообщений: 81
Завершенные тесты: 1
24.02.2017, 19:36 2
Вроде всё правильно, на первый взгляд. Какую ошибку компилятор выводит?
0
sptes
7 / 7 / 1
Регистрация: 16.02.2011
Сообщений: 147
24.02.2017, 19:41  [ТС] 3
Вот

Не очень-то он разговорчивый)
0
Миниатюры
Как вытащить const указатель из массива структур?  
shvyrevvg
809 / 596 / 303
Регистрация: 12.05.2016
Сообщений: 1,736
24.02.2017, 19:53 4
sptes, можно полный код увидеть? (Объявление и использование)
1
24.02.2017, 19:53
sptes
7 / 7 / 1
Регистрация: 16.02.2011
Сообщений: 147
24.02.2017, 19:55  [ТС] 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Структура сообщений.
typedef struct MESSAGE_VARS
{
    // Указатель на подготовленный шаблон текста сообщения.
    const unsigned char *ptr_mes;
    
    // Флаг вывода статуса SIM900 в сообщении.
    unsigned char f_show_status;
    
    // Структур статуса SIM900.
    struct SIM900_MODULE_VARS sim900_status;
    
    // Флаг вывода времени в сообщени.
    unsigned char f_show_time;
    
    // Время вывода сообщения. Часы, минуты.
    unsigned char uc_time_hour;
    unsigned char uc_time_min;
    
    // Время жизни сообщения.
    unsigned long ul_life_time;
};
 
struct MESSAGE_VARS msg_vars[C_MESSAGE_COUNT];
 
void SetMessage(unsigned char uc_mode, const unsigned char *ptr_mes, unsigned char f_show_time, unsigned char f_show_status)
{
    unsigned char uc_index;
    unsigned char uc_sort;
    unsigned long ul_min_life = C_TIME_MS_MESSAGE_LIFE;
    
    // Заносим важное сообщение. Заносим по индекс 0.
    if     (uc_mode == C_VIEW_IMPORTANT_MESSAGE) uc_sort = 0;
    // Заносим обычное сообщение. Выбираем индекс по сортировке самого старого сообщения.
    else if(uc_mode == C_VIEW_UNIMPORTANT_MESSAGE)
    {
        // Начинаем индекс с 1 до максимального количества сообщений.
        for(uc_index = 1; uc_index < C_MESSAGE_COUNT; uc_index++)
        {
            // Временная переменая больше текущего по времени. Запоминем значение и выставляем сортировку по этому индексу.
            if( ul_min_life >= msg_vars[uc_index].ul_life_time) 
            {
                uc_sort = uc_index;
                ul_min_life = msg_vars[uc_index].ul_life_time;
            }
            
            // Сообщение подобного характера уже выведено и время жизни сообщения ещё не закончено.
            if(*msg_vars[uc_index].ptr_mes != *ptr_mes) 
            {
                uc_sort = uc_index;
                break;
            }
        }
    }
    
    // Заносим значение.
    msg_vars[uc_sort].ptr_mes                     = ptr_mes;
    msg_vars[uc_sort].uc_time_hour                = uc_rtc_hour_cnt;
    msg_vars[uc_sort].uc_time_min                 = uc_rtc_min_cnt;
    msg_vars[uc_sort].f_show_time                 = f_show_time;
    msg_vars[uc_sort].f_show_status               = f_show_status;
    msg_vars[uc_sort].sim900_status.uc_err_code   = sim900_module_vars.uc_err_code;
    msg_vars[uc_sort].sim900_status.uc_request    = sim900_module_vars.uc_request;
    msg_vars[uc_sort].sim900_status.uc_transit    = sim900_module_vars.uc_transit;
    msg_vars[uc_sort].sim900_status.uc_step       = sim900_module_vars.uc_step;
    msg_vars[uc_sort].ul_life_time                = C_TIME_MS_MESSAGE_LIFE;
}
0
ShadowKing
28 / 28 / 23
Регистрация: 18.04.2015
Сообщений: 81
Завершенные тесты: 1
24.02.2017, 20:03 6
sptes, что интересно, в отправленном вами коде строчки с ошибкой нет...
А вы не могли где-нибудь перед
C++
1
if(msg_vars[uc_index].ptr_mes == ptr_mes)
пропустить точку с запятой?
0
sptes
7 / 7 / 1
Регистрация: 16.02.2011
Сообщений: 147
24.02.2017, 20:04  [ТС] 7
ой, я ток что изменил, там именно такая строчка
"if(msg_vars[uc_index].ptr_mes == ptr_mes)". Вроде нет, всё правильно там. если поставить const указатель без структуры, то всё проходит ровно, а если пытаюсь получить указатель из массива структуры, то выходит вот такое.
0
ShadowKing
28 / 28 / 23
Регистрация: 18.04.2015
Сообщений: 81
Завершенные тесты: 1
24.02.2017, 20:55 8
Лучший ответ Сообщение было отмечено sptes как решение

Решение

Визуально в коде ошибок не нашёл. В visual c++ и dec-c++ всё нормально компилируется. Похоже, проблема в самом mplab...
1
sptes
7 / 7 / 1
Регистрация: 16.02.2011
Сообщений: 147
24.02.2017, 22:16  [ТС] 9
Спасибо Вам за помощь. Очень признателен Вам. Буду разбираться. Теперь я могу хоть от чего-то отталкиваться.

Добавлено через 43 минуты
Компилятор не ругается!
C
1
2
3
4
5
            if(msg_vars[0].ptr_mes == msg_vars[1].ptr_mes) 
            {
                uc_sort = uc_index;
                break;
            }
Как выясняется, компилятор так получается перестраховывается? Как ему явно указать, что в этой структуре конкретный тип. попытки типа
C
1
if((const unsigned char *)(msg_vars[0].ptr_mes) == ptr_mes)
не венчаются успехом.

Добавлено через 15 минут
Пока что реализовал вот так...


C
1
2
3
4
5
6
7
8
           // Сообщение подобного характера уже выведено и время жизни сообщения ещё не закончено. 
            // Выходим из сортировки и записываем данные по этому индексу.
            msg_vars[0].ptr_mes = ptr_mes;
            if(msg_vars[uc_index].ptr_mes == msg_vars[0].ptr_mes) 
            {
                uc_sort = uc_index;
                break;
            }
Под нулевым индексом другой режим. Пересекаться режимы не могут. Но это порожняк какой-то, если честно... Вообще н подходит.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5101 / 2563 / 711
Регистрация: 18.10.2014
Сообщений: 4,466
24.02.2017, 22:36 10
Цитата Сообщение от sptes Посмотреть сообщение
Компилятор не ругается!...Но это порожняк какой-то, если честно... Вообще н подходит.
Компилятор у вас и изначально ни на что не ругался. И пока никакой связзи ни с каким const мы тут в упор не увидели.

Пререстанте выдумывать чепуху и заниматься каким-то рандомными бессмысленными исправлениями в коде. Внятно объясните суть проблемы. И без "ой, я ток что изменил".
0
sptes
7 / 7 / 1
Регистрация: 16.02.2011
Сообщений: 147
24.02.2017, 22:41  [ТС] 11
Суть проблемы выше, читайте, смотрите, делайте выводы. Скрин сделал. Что ещё надо? Я делюсь мнение из-за чего комплиятор перестал выдавать ошибку. Бессмысленные или нет - это ваше сугубо личное мнение. Меня корректировать не надо.
0
24.02.2017, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2017, 22:41

Указатель на const переменную
Доброго всем здравия, просто хотел посмотреть на адрес const переменной, честное слово никакого...

Указатель на const двумерный массив wchar_t
Подскажите, как создать указатель на в функцию приходит (const wchar_t _text) объявляется ...

Указатель на const массив изменяет его?
Привет! Задача была написать функцию, сохраняющую расширение файла из строки file_name в строку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru