Перейти к содержанию
    

Как сравнить структуру целиком?

typedef struct
{
  float PRESSURE;
    float IGNITION_VOLTAGE;
    float SYSTEM_VOLTAGE;
    float TEMPERATURE;
    unsigned char GEAR_NUMBER;
    unsigned char REAR_GEAR;
    uint32_t TIME;
} tINFO_VAR;
tINFO_VAR LAST_INFO_VAR,NEW_INFO_VAR;

.......................

          if (NEW_INFO_VAR==LAST_INFO_VAR) // ВОТ ТУТ ТО И ВЫЛАЗИТ ОШИБКА, МОЛ ХОЧУ INTEGER или POINTER
            {
            
            }

 

Как?

P.S. скопировать всю структуру обычной операцией присваивания вроде бы получается.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

..как только узнаете как сравнить структуру целиком, опубликуйте тут - наверняка такой же фокус и с массивами сработает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну строки же сравниваются? А строка это массив.

Не бейте, если ошибаюсь...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Срвнение строк и массивов (функции strcmp и memcmp) сравнивают в цикле побайтово. При чем тут структуры?

Изменено пользователем arhiv6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Структура это тоже слитный блок байтов в памяти, если я правильно понимаю. Только доступ к ним более замысловатый.

Нельзя ли область памяти, занятую под структуру, представить как строку длиной 50 байт? (Кажется столько получается у автора?)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Структура это тоже слитный блок байтов в памяти, если я правильно понимаю.

В том-то и проблема, что совсем не обязательно слитный. Поэтому сравнивать побайтно нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В том-то и проблема, что совсем не обязательно слитный. Поэтому сравнивать побайтно нельзя.

 

б-р-р-р

вы про упаковку структур ? Не вижу проблем, когда для поля с заданной размерностью char компилятор задействует процессорное слово ( к примеру 32 битный регистр ).

 

Всё равно две структуры на данной архитектуре можно сравнивать с memcmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В том-то и проблема, что совсем не обязательно слитный. Поэтому сравнивать побайтно нельзя.

1) Проблема "не обязательно слитный" решается паковкой.

2) Паковать в общем-то не обязательно, ибо де-факто, если конечно, специально не задавалось отключение инициализации, память занимаемая структурами, как и любыми другими переменными со всеми гапами между ними, будет обнулена при инициализации.

 

Так-что sizeof() и memcmp() для сравнения хоть структур, хоть массивов.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Проблема "не обязательно слитный" решается паковкой.

Не паковать же только ради простоты сравнения? Ну, где-то может быть вполне оправдан и такой подход.

 

2) Паковать в общем-то не обязательно, ибо де-факто, если конечно, специально не задавалось отключение инициализации, память занимаемая структурами, как и любыми другими переменными со всеми гапами между ними, будет обнулена при инициализации.

Если она была, эта инициализация. А если память через malloc() выделена, а структура заполнена вручную?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не паковать же только ради простоты сравнения? Ну, где-то может быть вполне оправдан и такой подход.

Паковка совершенно НЕ принципиальна. Так-что паковать /нет выбирается по обычным критериям не зависимо от того сравнивать, как массивы или нет.

Хотя для скорости сравнения, нежели оно часто повторяется, предпочительнее пковать.

Если она была, эта инициализация. А если память через malloc() выделена, а структура заполнена вручную?

A calloc() использовать по такому случаю, что не позволяет :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

A calloc() использовать по такому случаю, что не позволяет :) .

Лучше скажите, кто запретит компилятору перезаписать чем-нибудь pad bytes, значение которых "unspecified"

 

А еще структура может быть локальной переменной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше скажите, кто запретит компилятору перезаписать чем-нибудь pad bytes, значение которых "unspecified"?

Вы не поверите :) но банальная лень :) - зачем делать лишние обращения к памяти неведомо для чего. Я собственно по причине "unspecified" и написал в первом посте "де-факто". Ибо, конечно, де-юре производитель компилятора как-бы имеет право при занесении, например байта в непакованую структуру добавить еще несколько операций по присвоению еще трем байтам значений полученых от генератора случайных чисел :). Ну поскольку он добавления такого кода точно делать не будет, то остается вариант, когда сие произойдет по причине реализации ядра контроллера. Если производитель такого безобразия не описал, то тогда этот вариант тоже отпадает. А если даже что-то, вдруг, и пишется, до для сравнения проблемы вызовет только запись произвольных значений ибо при любых константых, иди зависящих от значения значимых битов, тоже никаких пробоем для сравнения.

А еще структура может быть локальной переменной.

Дык memset() али родственник его bzero() так-же позволят сделать все корректно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А программиста банальная лень и небрежение заставит забыть и замену malloc() на calloc() в нужных местах, и memset() для локальных структур (а все это вызовет ошибки и на совершенно "исправном" компиляторе).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...