Salamander 2 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба 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. скопировать всю структуру обычной операцией присваивания вроде бы получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 20 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба В Си только сравнивать поэлементно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Меджикивис 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба ну и дай ей указатели на эти переменные, раз хочет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 5 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба ..как только узнаете как сравнить структуру целиком, опубликуйте тут - наверняка такой же фокус и с массивами сработает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Меджикивис 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Ну строки же сравниваются? А строка это массив. Не бейте, если ошибаюсь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 20 24 мая, 2015 Опубликовано 24 мая, 2015 (изменено) · Жалоба Срвнение строк и массивов (функции strcmp и memcmp) сравнивают в цикле побайтово. При чем тут структуры? Изменено 24 мая, 2015 пользователем arhiv6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Меджикивис 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Структура это тоже слитный блок байтов в памяти, если я правильно понимаю. Только доступ к ним более замысловатый. Нельзя ли область памяти, занятую под структуру, представить как строку длиной 50 байт? (Кажется столько получается у автора?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Структура это тоже слитный блок байтов в памяти, если я правильно понимаю. В том-то и проблема, что совсем не обязательно слитный. Поэтому сравнивать побайтно нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба В том-то и проблема, что совсем не обязательно слитный. Поэтому сравнивать побайтно нельзя. б-р-р-р вы про упаковку структур ? Не вижу проблем, когда для поля с заданной размерностью char компилятор задействует процессорное слово ( к примеру 32 битный регистр ). Всё равно две структуры на данной архитектуре можно сравнивать с memcmp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба В том-то и проблема, что совсем не обязательно слитный. Поэтому сравнивать побайтно нельзя. 1) Проблема "не обязательно слитный" решается паковкой. 2) Паковать в общем-то не обязательно, ибо де-факто, если конечно, специально не задавалось отключение инициализации, память занимаемая структурами, как и любыми другими переменными со всеми гапами между ними, будет обнулена при инициализации. Так-что sizeof() и memcmp() для сравнения хоть структур, хоть массивов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба 1) Проблема "не обязательно слитный" решается паковкой. Не паковать же только ради простоты сравнения? Ну, где-то может быть вполне оправдан и такой подход. 2) Паковать в общем-то не обязательно, ибо де-факто, если конечно, специально не задавалось отключение инициализации, память занимаемая структурами, как и любыми другими переменными со всеми гапами между ними, будет обнулена при инициализации. Если она была, эта инициализация. А если память через malloc() выделена, а структура заполнена вручную? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Не паковать же только ради простоты сравнения? Ну, где-то может быть вполне оправдан и такой подход. Паковка совершенно НЕ принципиальна. Так-что паковать /нет выбирается по обычным критериям не зависимо от того сравнивать, как массивы или нет. Хотя для скорости сравнения, нежели оно часто повторяется, предпочительнее пковать. Если она была, эта инициализация. А если память через malloc() выделена, а структура заполнена вручную? A calloc() использовать по такому случаю, что не позволяет :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба A calloc() использовать по такому случаю, что не позволяет :) . Лучше скажите, кто запретит компилятору перезаписать чем-нибудь pad bytes, значение которых "unspecified" А еще структура может быть локальной переменной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Лучше скажите, кто запретит компилятору перезаписать чем-нибудь pad bytes, значение которых "unspecified"? Вы не поверите :) но банальная лень :) - зачем делать лишние обращения к памяти неведомо для чего. Я собственно по причине "unspecified" и написал в первом посте "де-факто". Ибо, конечно, де-юре производитель компилятора как-бы имеет право при занесении, например байта в непакованую структуру добавить еще несколько операций по присвоению еще трем байтам значений полученых от генератора случайных чисел :). Ну поскольку он добавления такого кода точно делать не будет, то остается вариант, когда сие произойдет по причине реализации ядра контроллера. Если производитель такого безобразия не описал, то тогда этот вариант тоже отпадает. А если даже что-то, вдруг, и пишется, до для сравнения проблемы вызовет только запись произвольных значений ибо при любых константых, иди зависящих от значения значимых битов, тоже никаких пробоем для сравнения. А еще структура может быть локальной переменной. Дык memset() али родственник его bzero() так-же позволят сделать все корректно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба А программиста банальная лень и небрежение заставит забыть и замену malloc() на calloc() в нужных местах, и memset() для локальных структур (а все это вызовет ошибки и на совершенно "исправном" компиляторе). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться