Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2008, 02:24   #1
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию diff для структур

Приветствую!
Вот ошибка закралась, что-то не могу понять почему, может свежим взгядом кто найдет.
Задача такая: есть структура произвольного состава. В результате каких-либо действий некоторые ее поля могут быть изменены, при этом необходимо определить те изменения которые были сделаны. Далее при наличии исходной структуры и массива изменений необходимо получить новую, измененную структуру.

Код:

#include <stdio.h>
#include <string.h>

typedef struct data
{
  int a;
  long b;
  char c;
  bool d;
  double e;
} data;

int main ()
{
  data old = {1, 4, 54, true, 3.5};    // Начатьная структура
  data curr = {1, 4, 255, true, 3.5}; // Измененная структура
  data newd; // Структура для результата

  memcpy (&newd, &old, sizeof (data));

  unsigned char* pold = (unsigned char *)(&old);
  unsigned char* pcurr = (unsigned char *)(&curr);
  unsigned char* pnewd = (unsigned char *)(&newd);

  unsigned char tmp[sizeof (data)]; // Массив изменений

  for (unsigned int i = 0; i < sizeof (data); i++)
    tmp[i] = pold[i] ^ pcurr[i];
  
  printf ("newd = {%d, %ld, %d, %d, %lf}\n", newd.a, newd.b, newd.c, (int)newd.d, newd.e);

  for (unsigned int i = 0; i < sizeof (data); i++)
    pnewd[i] = pnewd[i] ^ tmp[i];
  printf ("newd = {%d, %ld, %d, %d, %lf}\n", newd.a, newd.b, newd.c, (int)newd.d, newd.e);

  return 0;
}
Вывод следующий:

newd = {1, 4, 54, 1, 3.500000}
newd = {1, 4, -1, 1, 3.500000}

То биш вместо 255 считается -1 (?)

Заранее спасибо
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Старый 09.04.2008, 02:44   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от ag-moscow Посмотреть сообщение
То биш вместо 255 считается -1 (?)
Хм... А что здесь такого удивительного, если "c" объявлена как "signed char", печатаете Вы с спецификатором "%d"... Всё правильно.
B_N вне форума Ответить с цитированием
Старый 09.04.2008, 02:57   #3
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию

Все верно . Спасибо!
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив структур RaZveDchiK Помощь студентам 1 31.08.2008 21:44
Сортировка массива структур arturka Помощь студентам 1 21.06.2008 14:15
Динамический массив структур Kostyakovich Помощь студентам 4 20.04.2008 21:59
Создание и использование динамических структур Oksana11 Помощь студентам 5 09.01.2008 19:39