2016-05-26 3 views
-1

Я прочитал все вопросы по этой теме, но ни одна из проблем не кажется моей. Тем не менее, я получаю сообщение об ошибке: выражение должно быть модифицируемым lvalue. Часть кода C, где основаны ошибки, приведен ниже.ошибка: # 137: выражение должно быть модифицируемым значением

ws->fetch_next_state = &deg1_user_init;   
ws->back_to_current = &text_frame_print; 
ws->_frame.text_buff[0] = deg_symbol_th; // error line 
ws->_frame.text_buff[1] = deg_symbol_te; //error line 
ws->_frame.object_no = 2;         
ws->objects_counter = 0;` 

Значения верхнего кода snipet в прохождении указателя постоянной области памяти к подпрограмме, которая посылает символы на периферийное устройство.

объекты deg_symbol_th и deg_symbol_te определяются как

char deg[2] = {0xF8, 0x00}; 
const struct text_object deg_symbol_th = {6,3,2,45,240, deg}; 
const struct text_object deg_symbol_te = {6,10,2,265,240, deg}; 
const struct text_object deg_symb_svc = {6,3,2,430,35, deg}; 

ws->_frame.text_buff[0] и является частью структуры

struct frame 
{ 
enum frame_sta frame_status; 
enum frame_sta frame_status_diff; 
const struct text_object *text_buff; 
const struct box_object *box_buff; 
const struct area_object *area_buff; 
uint8_t object_no; 
}; 


struct wspace{ 
    struct netimer  period; 
    struct nequeue deferred; 
    struct nevent * deferred_queue_storage[EPA_EEPROM_QUEUE_SIZE]; 
    struct nepa * producer; 
    struct event_i2c_transfer  transfer; 
    struct text_object *Val_frame_buffer[15]; 
    struct frame  _frame; 
    naction  (*back_to_current)(struct nsm * sm, const struct nevent * event); 
    naction  (*fetch_next_state)(struct nsm * sm, const struct nevent * event);   
    uint32_t  i2c_retry; 
    uint8_t  i2c_buffer[35]; 
}ws; 

Что может быть проблема?

+1

Боковое примечание: «malloc'-ate space для' text_buff [0] 'где-то в коде? – LPs

ответ

2

Член next_buff является указатель на сопзЬ-данных, что означает, что даже если вы можете изменить значение самого next_buff указателя, вы не можете изменить содержимое структуры (ов) он указывает на. Поэтому, чтобы исправить это, удалите const в декларации const struct text_object *text_buff.

+0

Хорошо, это вполне понятно, но дело в том, чтобы иметь указатель на данные const. Эти данные являются объектами памяти, которые необходимо отправить, и нет необходимости их изменять. Единственное, что нужно изменить, это адрес объекта, который присваивается в момент его отправки на шину, и это цель _const struct text_object * text_buff_.Когда удалить _const_ из компилятора объявления говорит _error: # 513: значение типа const struct text_object * "не может быть назначено сущности типа" struct text_object * _. – PredragN

+0

Если вы хотите иметь указатель на данные const, это нормально, но тогда вы не можете делать то, что вы делаете, в строках, которые вы указываете как «строка ошибки». Потому что в этих строках вы изменяете данные. Проблема в том, что вы инициализируете '' next_buff'' указателем на объект const, но эта строка не включена в ваш вопрос. Этот указатель также должен быть указателем на не-const, если вы должны назначить его '' next_buffer''. – atturri

+0

Я понимаю, что вы только что сказали. Это имеет смысл. Спасибо Аттурри! – PredragN

Смежные вопросы