Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 549
от 11.10.2006, 03:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 396, Экспертов: 50
В номере:Вопросов: 3, Ответов: 5


Вопрос № 57765: Добрый день, уважаемые эксперты! Подскажите, пожалуйста, как можно произвольную структуру данных преобразовать в бинарный вид. Если можно, дайте какие-нибудь ссылки, чтобы подробнее об этом почитать и разобраться фундаментально. Заранеее спасибо....
Вопрос № 57807: Здравствуйте эксперты. Нужно написать программу на языке С. Задание звучит так: В целочисленном массиве после каждых трех отрицательных чисел идущих подряд вставить 0....
Вопрос № 57838: Здравствуйте, господа! На С++ написан следующий код (приложение). Нужно считать с клавиатуры число от 1 до 3 если чтение неверно очистить буфер и попросить ввести снова. Проблема в том, что под gcc 3.4.3 функция fflush() не оказывает никакого воз...

Вопрос № 57.765
Добрый день, уважаемые эксперты! Подскажите, пожалуйста, как можно произвольную структуру данных преобразовать в бинарный вид. Если можно, дайте какие-нибудь ссылки, чтобы подробнее об этом почитать и разобраться фундаментально. Заранеее спасибо.
Отправлен: 05.10.2006, 04:34
Вопрос задал: Говорищев Максим Александрович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: dentist
Здравствуйте, Говорищев Максим Александрович!
что начит: "преобразовать в бинарный"?
машина не умеет работать нисчем другим кроме как с двоичными даннными. после компиляции в программе уже нет ни имён переменных ни структур ни объединений. структура вида приведённого выше, коллегой ;) будет представлять сабой лиш последовательность из 24 бит.

---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 5-ый класс)
Ответ отправлен: 05.10.2006, 09:35
Оценка за ответ: 3

Отвечает: Sergey A. Wedensky
Здравствуйте, Говорищев Максим Александрович!

Я так понимаю, Вам нужно "развернуть" некую структуру в поток данных для передачи (например, по сети), а затем ее "разаернуть".
Можно, например, использовать оффсеты:

Например,

typedef struct
{
int n;
char* s1;
char* s2;
} STRUCT1;

перейдет в

typedef struct
{
int n;
long offset_s1;
long offset_s2;
} FLAT_STRUCT1;

Куда Вы запишете данные:

STRUCT1 struct1;
FLAT_STRUCT1* f_struct1;

int size = sizeof(FLAT_STRUCT1) + strlen(struct1.s1) + strlen(struct1.s2) + 2;

f_struct1 = (FLAT_STRUCT1*) new char[size];
f_struct1->n = struct1.n;
f_struct1->offset_s1 = sizeof(int);
strcpy((char*)f_struct1 + f_struct1->offset_s1, struct1.s1);
f_struct1->offset_s2 = sizeof(int)+strlen(struct1.s1)+1;
strcpy((char*)f_struct1 + f_struct1->offset_s2, struct1.s2);

Теперь можно передать f_struct1 как поток байтов длины size.
Разворачиваете в обратном порядке:

struct1.n = f_struct1->n;
struct1.s1 = new char[strlen((char*)f_struct1 + f_struct1->offset_s1)+1];
strcpy(struct1.s1, (char*)f_struct1 + f_struct1->offset_s1);
struct1.s2 = new char[strlen((char*)f_struct1 + f_struct1->offset_s2)+1];
strcpy(struct1.s2, (char*)f_struct1 + f_struct1->offset_s2);

Удалять, естественно, нужно будет
delete [] (char*)f_struct1;

Не уверен, что правильно Вас понял, но надеюсь, чем-то помог.
Ответ отправил: Sergey A. Wedensky (статус: 4-ый класс)
Ответ отправлен: 05.10.2006, 10:17

Отвечает: ADSota
Здравствуйте, Говорищев Максим Александрович!

Еще 2 варианта:

1. Структурой можно пользоваться как масссивом или другой структурой (если сгруппировать их типы):

typedef mystruct{
int x;
long y;
};//произвольная структура

typedef union{//Сгруппировать представления
mystruct MY;//Представить в виде структуры
char Bytes[sizeof(mystruct)];//Представить в виде массива байт
anotherstruct DD;//В виду другой структуры...
}XStruct;

И обращаться к ней как к своей структуре:
mystruct buf;
buf.MY.x=5;
или как к массиву:
buf.Bytes[4]=3;

2. Можно сделать упакованные структуры "бинарно упаковав". Например:

typedef BinaryStruct{
int First4Bits:4;//Поле имеет размер 4 бита
int Second2Bits:2;//Поле имеет размер 2 бита
int Third7Bits:7;//Поле имеет размер 7 бита
int Last3Bits:3;//Поле имеет размер 3 бита
}

---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 05.10.2006, 11:30


Вопрос № 57.807
Здравствуйте эксперты. Нужно написать программу на языке С. Задание звучит так: В целочисленном массиве после каждых трех отрицательных чисел идущих подряд вставить 0.
Отправлен: 05.10.2006, 15:09
Вопрос задал: царик царик царик (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Алексеев В.В.
Здравствуйте, царик царик царик!
Предлагаю такой вариант. (приложение)

Приложение:

Ответ отправил: Алексеев В.В. (статус: 1-ый класс)
Ответ отправлен: 05.10.2006, 18:33


Вопрос № 57.838
Здравствуйте, господа!
На С++ написан следующий код (приложение). Нужно считать с клавиатуры число от 1 до 3 если чтение неверно очистить буфер и попросить ввести снова. Проблема в том, что под gcc 3.4.3 функция fflush() не оказывает никакого воздействия и при вводе, например, строки программа падает в бесконечный цикл. Под MS Visual C++ 6.0 все ОК.

Приложение:

Отправлен: 05.10.2006, 21:10
Вопрос задал: Алексеев В.В. (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: NextStep / www2
Здравствуйте, Valdar!

Вариантов два: либо вы используете только библиотеку stdio либо вы используете только классы типа cin и cout. Во втором случе попробуйте cin.flush() и cout.flush().
---------
Нет правил без исключений, правило без исключения - это исключение из правил.
Ответ отправил: NextStep / www2 (статус: Студент)
Ответ отправлен: 06.10.2006, 06:39
Оценка за ответ: 5
Комментарий оценки:
Благодарю!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное