8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пишу на 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2017, 19:12
Ответы с готовыми решениями:

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

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

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

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

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

Не очень-то он разговорчивый)
Миниатюры
Как вытащить const указатель из массива структур?  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
24.02.2017, 19:53 4
sptes, можно полный код увидеть? (Объявление и использование)
1
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
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
28 / 28 / 23
Регистрация: 18.04.2015
Сообщений: 81
24.02.2017, 20:03 6
sptes, что интересно, в отправленном вами коде строчки с ошибкой нет...
А вы не могли где-нибудь перед
C++
1
if(msg_vars[uc_index].ptr_mes == ptr_mes)
пропустить точку с запятой?
0
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
24.02.2017, 20:04  [ТС] 7
ой, я ток что изменил, там именно такая строчка
"if(msg_vars[uc_index].ptr_mes == ptr_mes)". Вроде нет, всё правильно там. если поставить const указатель без структуры, то всё проходит ровно, а если пытаюсь получить указатель из массива структуры, то выходит вот такое.
0
28 / 28 / 23
Регистрация: 18.04.2015
Сообщений: 81
24.02.2017, 20:55 8
Лучший ответ Сообщение было отмечено sptes как решение

Решение

Визуально в коде ошибок не нашёл. В visual c++ и dec-c++ всё нормально компилируется. Похоже, проблема в самом mplab...
1
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
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
Вездепух
Эксперт CЭксперт С++
11653 / 6336 / 1719
Регистрация: 18.10.2014
Сообщений: 15,990
24.02.2017, 22:36 10
Цитата Сообщение от sptes Посмотреть сообщение
Компилятор не ругается!...Но это порожняк какой-то, если честно... Вообще н подходит.
Компилятор у вас и изначально ни на что не ругался. И пока никакой связзи ни с каким const мы тут в упор не увидели.

Пререстанте выдумывать чепуху и заниматься каким-то рандомными бессмысленными исправлениями в коде. Внятно объясните суть проблемы. И без "ой, я ток что изменил".
0
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
24.02.2017, 22:41  [ТС] 11
Суть проблемы выше, читайте, смотрите, делайте выводы. Скрин сделал. Что ещё надо? Я делюсь мнение из-за чего комплиятор перестал выдавать ошибку. Бессмысленные или нет - это ваше сугубо личное мнение. Меня корректировать не надо.
0
24.02.2017, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2017, 22:41
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru