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

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


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

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

Выпуск № 678
от 07.03.2007, 21:13

Администратор:Калашников О.А.
В рассылке:Подписчиков: 465, Экспертов: 47
В номере:Вопросов: 25, Ответов: 68


Вопрос № 76896: Уважаемые эксперты, хочу научиться программированию на C/C++. Какие между ними отличия? Подскажите пожалуйста наиболее подходящие учебники для этого и софт (если можно то всё с ссылками для скачивания и на русском языке!!!)....
Вопрос № 76909: Здравствуйт, уважаемые эксперты! Помогите, пожалуйста, найти ошибку (в приложении). Задача такая: в одномерном массиве, состоящем из n вещественных чисел, вычислить сумму целых частей элементов массива, расположенных после последнего отрицательного э...
Вопрос № 76960: Здравствуйте уважаемые эксперты... У меня такая проблема -- я решила переписать свою прогу (отображает анимированные гифы) и вместо GetPixel использовать GetDIBits . Переписала работает конечно быстрее, но к сожелению не все гифы отображаются ко...
Вопрос № 76996: Пишу приложение на Visual C++. Необходимо хранить и обрабатывать данные. Можно использовать сторонние СУБД или сделать свою. Как можно реализовать работу с БД средствами Visual C++? Нужно, чтобы таблицы БД можно было редактировать в самой программе....
Вопрос № 77005: Здравствуйте, эксперты! Что не верного в моём коде. Не стабильно работает функция: при однократном вызове всё "ОК", но в цикле шаге на 3-4-ом возникает ошибка: AccessViolationException (Attempted to read or write protected...
Вопрос № 77037: Здравствуйте эксперты! Просьба отвечать тем кто рельно понимает о чем я говорю. Пишу архиватор с алгоритмлм сжатия Шенона-Фано в Visual c++. Столкнулся спроблемой: каким образом мне считывать символьную информацию с разных типов файлов для то...
Вопрос № 77083: Всем привет! Нужно сделать программу с модулями.Тоесть есть оснавная программа,она представляет собой меню (обычное,c циферками (switch)),из этого меню должны вызываться другии программы (как бы модули).Вопрос в том как вызвать эти программы...
Вопрос № 77085: Здраствуйте Эксперты. Посоветуйте пожалуйста литературу или ссылочку дайте, по программированию на С++, для новичков. Заранее благодарю. ...
Вопрос № 77090: Вот у меня такой вопрос: как написать многотомное приложение, т.е. есть некая программа которая обрабатывает запросы других программ. (на подобии сервера БД)? Заранее благодарен!. ...
Вопрос № 77122: Уважаемые эксперты! Столкнулся с трагической проблемой. Работаю с gcc 3.3.3 RHL9 and PPC_8xx Я использую C и C++. И после сшивки приложения получаю смертельную зависисмость от libstdc++.so.5. # readelf -a ./myappl | grep "Sh...
Вопрос № 77131: Здравствуйте Уважамаемые Эксперты!! Помогите реализовать задачу на языке C++!!! Даны две строки символов S и T. Необходимо определить сколько раз строка T входит в строку S и удалить первое и последнее вхождение T в S. В условии сказанно ...
Вопрос № 77155: Приведите пожалуйта пример как можно маписать в фаил пару бит...
Вопрос № 77185: Спаибо всем за предыдущую справку! Вопрос: Напишите подробнее про переменную типа BYTE эта переменная может хранить инфу размером в один байт или как? Допустим у меня есть целочисленный массив из разных значения типа 111010101 могу-ли я п...
Вопрос № 77190: Здравствуйте. Подскажите пожалуйста, как можно опредилить время работы программы?...
Вопрос № 77204: Каким образом с помощью api можно запустить на выполнение фаил кроме как system() и ShellExecute()?...
Вопрос № 77205: Добрый день, уважаемые господа эсперты! Не могли бы вы мне на каком-нить простом примере показать использование функции EnumPrunters(...)? На текущий момент, к сожалению, я не смог добиться от нее никакой работоспособности. В приложении ...
Вопрос № 77207: Здраствуйте!скажите пожалуйста я хочу изучать С++ и незнаю что делать качать от микрософта Visual C++ Express 2005 (кажеться так называеться),или же пойти и купить С++ 6.0 ? Если можете дайте исчерпающий ответ!...
Вопрос № 77219: Все с битами разобались а теперь разберемся чего я хочу Я считываю из файла строку ну например "мама мыла раму" при помощи алгоритма шенона-фано я поеобразую эту строку в что то типо 0010101010 (это конечно не точно так но что то бо...
Вопрос № 77252: Здарово всем! ;) Скажите пожалуйста как теперь из файла в который я назаписывал биты их считать да так чтоб затем представить их в виде строки? ну тоесть для тех кто отвечал на предыдущие мои вопросы нужно объяснить мне как повернуть процесс в об...
Вопрос № 77346: все наверно знают о существовании такого заголовочного файла как <biset> почему когда я пишу что-то типо: <bitset> int main() { bitset <100> b1; return 0; } компелятор пи...
Вопрос № 77367: Напишите пожалуйста на примеhе как пользоваться функцией OpenFile...
Вопрос № 77368: Еще раз всем привеД! Вопрос правильно ли я записываю в фаил биты и ещё вопрос как мне их оттуда считать...
Вопрос № 77380: Здравствуйте Уважаемые Эксперты, помогите разобраться. Проблема вот в чём: я написал программу, в ней есть всякие настройки, когда запускаешь и настраиваешь, то всё работает, но когда выключаешь и запускаешь заново, то все настройки пропадают, как мо...
Вопрос № 77387: Ура товарищи теперь я научился записывать и считывать биты в и из файла! если это переделывает строку в биты char mass[]="11010100";BYTE my_byte; for(int i=0; i<8; i++) { my_byte<<=1; if(mass[i] =...
Вопрос № 77398: Здравствуйте Эксперты! Я начал изучать С++. Как написать код, который будет выполнять функции через определённый промежуток времени. Например выполняется функция func(), проходит две секунды и выполняется следующая функция. И ещё вопрос: Как ...

Вопрос № 76.896
Уважаемые эксперты, хочу научиться программированию на C/C++.
Какие между ними отличия?
Подскажите пожалуйста наиболее подходящие учебники для этого и софт (если можно то всё с ссылками для скачивания и на русском языке!!!).
Отправлен: 26.02.2007, 22:59
Вопрос задал: Кондрашов Дмитрий (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Терсков Сергей
Здравствуйте, Кондрашов Дмитрий!
На Википедии есть отличные материалы по обоим языкам. В них и обзоры языков, и примеры программ, и ссылки на различные внешние ресурсы.

Вот ссылки...

Язык C
http://ru.wikipedia.org/wiki/%D0%A1%D0%B8_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29

Язык C++
http://ru.wikipedia.org/wiki/C++
Ответ отправил: Терсков Сергей (статус: 6-ой класс)
Ответ отправлен: 27.02.2007, 10:13
Оценка за ответ: 4
Комментарий оценки:
Спасибо, но по моему могло быть и лучше.

Отвечает: wils0n
Здравствуйте, Кондрашов Дмитрий!
Купите книгу "Язык программирования С++", автор Бьерн Страуструп.
Это Дао по программированию на С++. Там же можно найти информацию об отличиях C от C++ и наоборот.
Но эта книга расчитана (IMHO) на читателей с выше чем начальной подготовкой.
Т.е. было бы неплохо, если Вы до этого на Паскале (или Бейсике) уже программировали.
---------
Life is like a box with chocolate. You never know what you're gonna get. (c) Forrest Gump's mom
Ответ отправил: wils0n (статус: 6-ой класс)
Ответ отправлен: 27.02.2007, 12:04
Оценка за ответ: 5
Комментарий оценки:
Было бы идеально если бы вы ещё порекомендовали хороший учебник для начинающих!!!
А так спасибо!

Отвечает: Thread
Здравствуйте, Кондрашов Дмитрий!
Основное отличие это то, что C++ это объектно ориентированный Си. Язык Си имеет большое распространение в Linux и в системном программировании, прикладные приложения под Windows пишут как правило на С++.

По С++ советую:
Полный справочник по C++ Герберт Шилдт
http://www.natahaus.ru/2006/10/21/polnyjj_spravochnik_po_c_gerbert_shildt_3e_izdanie.html

Язык программирования С++. Бьерн Страуструп
http://openlib.org.ua/ru/books/id/16/

По Си:
Язык программирования C Брайан Керниган, Деннис Ритчи
http://openlib.org.ua/ru/books/id/14/

Бесплатная среда программирования от Microsoft:
Visual C++ 2005 Express Edition
http://msdn.microsoft.com/vstudio/express/visualc/
Ответ отправил: Thread (статус: 4-ый класс)
Ответ отправлен: 27.02.2007, 23:57
Оценка за ответ: 4
Комментарий оценки:
Просил же на русском!


Вопрос № 76.909
Здравствуйт, уважаемые эксперты! Помогите, пожалуйста, найти ошибку (в приложении). Задача такая: в одномерном массиве, состоящем из n вещественных чисел, вычислить сумму целых частей элементов массива, расположенных после последнего отрицательного элемента.

Приложение:

Отправлен: 27.02.2007, 02:27
Вопрос задал: Joeman (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Joeman!
Чёй то мне кажется что вся программа - одна большая ошибка, либо вы наугад расставляли операторские скобки.
Не есть конечно предположение где еще может быть ошибка, но по-этому поводу можно дискутировать долго :-).
По-этому предлагаю следующее решение:
Находим индекс поледнего отрицательного элемента:
int ind = -1;
for (i=n-1; i>=0; ++i)
if (a[i]<0) {ind = i; break;}
// считаем сумму целых частей после него (если отрицательных частей нет -
// считаем сумму по всем элементам)
int sum=0;
for (i=ind+1; i<n; ++i)
sum+=int(a[i]);
/* ну тут вариации - если нужно чистать просто целые части, то применяем abs - содуль числа, если округленные до целого, математически, то округление, а еще есть в математике вроде такое, что целая часть от вещественного - это то которое меньше или равно и целое - значит для отрицательного -1.5 например - целая часть это -2*/

---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 27.02.2007, 10:03
Оценка за ответ: 4

Отвечает: Терсков Сергей
Здравствуйте, Joeman!
Главная Ваша ошибка это неверное использование циклов. Для этой задачи требуется всего два прохода по массиву. 1-ый для определения индекса последнего отрицательного элемента и 2-ой (неполный проход) для вычисления суммы целых частей остальных элементов массива. В Вашем исходнике циклов явно многовато, некоторые из них вообще не нужны. Например...

for(a[k]>0; k<n;k++)

первая его часть вообще не имеет смысла, и это видно в предупреждениях компилятора. Так что проще весь текст написать заново...

Приложение:

Ответ отправил: Терсков Сергей (статус: 6-ой класс)
Ответ отправлен: 27.02.2007, 10:10
Оценка за ответ: 4

Отвечает: Ilkras
Здравствуйте, Joeman!
вместо
for(k=ineg+1; k<n;k++)
for(a[k]>0; k<n;k++)
for(k=ineg+1,s=0;k<n;k++)
s+=a[k];
сделайте просто
for(k=ineg+1; k<n;k++)
s+=a[k];

тогда будет работать. Однако это будет работать n раз. Чтобы работало только один раз - удалите самый внешний цикл.
Таким образом получается:
#include<iostream.h>
#include<conio.h>
int main()
{
float a[100];
int i,n,s,ineg;
cout<<"Enter the size of array";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Value for a["<<i<<"]:";
cin>>a[i];
}

//this cycle finds the index of the last
//negative member in indexes from 0 to n-1
for(ineg = 0,i = 0; i<n; i++)
if(a[i]<0)
ineg=i;

// now compute the required summ
for(i=ineg+1,s=0; i<n; i++)
s += a[k];

cout<<s;
getch();
}
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 27.02.2007, 14:18
Оценка за ответ: 5

Отвечает: kool
Здравствуйте, Joeman!
Все отлично - все компилится!
Только алгоритм не соответствует
тексту программы. Почитайте еще про
циклы. Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 27.02.2007, 20:36
Оценка за ответ: 4


Вопрос № 76.960
Здравствуйте уважаемые эксперты... У меня такая проблема -- я решила переписать свою прогу (отображает анимированные гифы) и вместо GetPixel использовать GetDIBits .
Переписала работает конечно быстрее, но к сожелению не все гифы отображаются корректно... некоторые анимашки чёрно-белые, и наперекосяк... Подскажите плиз -- может у кого есть подобный опят... что мне делать ??? Прилагаю свой код который шлёт в порт по 1 строчке из кадра анимашки (я это вывожу через юсб порт на экранчик)

Приложение:

Отправлен: 27.02.2007, 13:07
Вопрос задала: Annuta (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Annuta!
Айн: Девайсо-независимые битмапы(впрочем как и зависимые) могут быть не только 24-битные но и к примеру 32 (что в наше гнилое время чаще). Про planes (то бишь цветовые плоскости не скажу - не вкурял)
Цвай: Из вышеизложенного следует что количество байт на пиксель совсем не обязательно 3, следовательно в строке не 3*пикселей_в_строке (В 32-битном битмапе в строчке их вааще странное какое то количество).
Драй: Считанный DIB-массив передается с кумулятивным смещением на каждой строчке - поэтому наперкосяк. Да плюс еще и не в своей цветовой палитре.

Ахтунг: Учим матчасть и курим MSDN. Поскольку я вам конкретнее подсказать не могу (ну блин не помню я где мои исходники с DIB, а память - не скажу как у кого).
Советую хорошую (на мой взгляд) книжку по API:
Щупак Win32 API Эффективная разработка приложений. Там пара полезных глав для Вашего случая.
А на сайте www.piter.com к этой книжке есть архив с исходниками для скачивания. И кажется чтоли к 3 главе идет как раз пример сохранения битмапа в файл - а по обратной аналогии разберетесь с выводом из DIB.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 27.02.2007, 15:45
Оценка за ответ: 5
Комментарий оценки:
Шпасибо... Дейтсвительно не правильно установила колличество бит на пиксель..! Книжку почитаю..

Отвечает: Gremlin
Здравствуйте, Annuta!
*****
Ответ удален и перенесен в ветку форума «О деятельности экспертов и работе портала – Удаленные ответы для обсуждения»
*****
Климова М.

***
Дополню по сообщению Gremlin в форуме.

Вот ветка форума с обсуждением этого вопроса:
http://forum.vingrad.ru/topic-138198.html

Alexandre V. Tchamaev
Ответ отправил: Gremlin (статус: 1-ый класс)
Ответ отправлен: 27.02.2007, 20:05
Оценка за ответ: 1
Комментарий оценки:
http://forum.vingrad.ru/topic-138862.html
я решила эту проблему вчера на русфаке... А винград к сожелению молчит... Спасибо.


Вопрос № 76.996
Пишу приложение на Visual C++. Необходимо хранить и обрабатывать данные. Можно использовать сторонние СУБД или сделать свою. Как можно реализовать работу с БД средствами Visual C++? Нужно, чтобы таблицы БД можно было редактировать в самой программе.
Отправлен: 27.02.2007, 16:08
Вопрос задал: Wild_one (статус: 5-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Wild_one!
Самый первый вариант, который даже в учебниках пишут: хранение информации в файле записей определенной структуры. Совершенно нежизнеспособен в любых случаях, кроме образовательных целей.
Если система будет работать под Windows - самый эффективный способ использовать ODBC API. Во первых практически универсально. В большинстве случаев достаточно поставить драйвера и заменить connection в настройках ODBC и ваша программа работает с БД на другой платформе, но той же структуры.
Вариант следующий: другие библиотеки (в смысле не от Microsoft).
Либо специализированные библиотеки с API от производителей СУБД.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 27.02.2007, 16:22

Отвечает: Mihasic
Здравствуйте, Wild_one!

Конечно можно использовать БД... редактировать таблицы в студии - это уже сложнее, т.к. обычно сами производители СУБД предоставляют средства для редактирования схем данных и самих данных визуально.
Есть еще общие интерфейсы (драйверы, адаптеры...) - т.е. с различными СУБД можно работать однотипно, не задумываясь о том, какая это БД - например, ODBC, OLE DB, ADO, DAO, ADO.NET (но это применительно к платформе .NET).
Если требуется хранить небольшие объемы данных, то рекомендую задуматься о хранении в файлах специфического формата (свой формат, xml, csv...) или же использовать встроенную БД (наприме, SQLite).
Писать свою СУБД для конкретного приложения - нежелательная трата времени (если конечно полноценную БД), т.к. существует множество уже написанных, при чем людьми, у которых изначально была задача - написать СУБД и все, а Вам скорее всего нужно думать о структуре и работе самого приложения вцелом.
Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 27.02.2007, 16:39

Отвечает: Jadd
Здравствуйте, Wild_one!
Да нет. Я тут уже отвечал на подобный вопрос. Никаких сторонних API и, тем более, разбираться с ODBC API не нужно. Поищи по сайту.
Далее. За неизвестностью версии Visual C++ (а это надо сообщать!!!), перечислю почти все варианты:
1)Класс CRecordset (CDatabase) - в Visual С++ 6.0 можно создать через конструктор классов, в Visual C++ версиями выше надо писать ручками. Удобно, прозрачно, минимум заморочек. Можно подключаться через ODBC, а можно через DAO (CDAORecordset).

2)ADO - можно самому писать классы для более легкого управления табличками, а не через COM. Можно пойти на www.codeproject.com и скачать готовые классы.

Есть еще способы, но их стоит обсуждать исходя из конкретной платформы, т.е. сервера баз данных.

Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
----
Ответ отправлен: 27.02.2007, 16:40
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Самый простой и удобный вариант.

Отвечает: kool
Здравствуйте, Wild_one!
Быстрее работать с базой получается через
ODBC-драйвер.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 27.02.2007, 20:36


Вопрос № 77.005
Здравствуйте, эксперты!

Что не верного в моём коде. Не стабильно работает функция:
при однократном вызове всё "ОК", но в цикле шаге на 3-4-ом возникает ошибка:
AccessViolationException (Attempted to read or write protected memory. This is often an indication that other memory is corrupt.)

Заранее спасибо ВС

Приложение:

Отправлен: 27.02.2007, 16:43
Вопрос задал: VovikDoc (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Tek
Здравствуйте, VovikDoc!
У вас szBuf= (MAX_PATH+1) * sizeof(wchar_t);
а размер c-строки p MAX_PATH - скорее всего выход за границы массива и есть Access Violation

---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 27.02.2007, 16:55

Отвечает: estiGi
Здравствуйте, VovikDoc!
Сразу целый набор из memory leak:

1. CoUninitialize(); нужно вызывать на том же уровне, что и CoInitialize(NULL);
2. psl->Release(); нужно вызывать в том же условии, где вы его и получаете. А то если psl->QueryInterface у вас обломается, то и psl->Release(); не вызовется
3. pfd не освобождается вообще никогда. используйте smart-поинтеры, коточе говоря
4. GetPath(p,szBuf, ... - возможен выход за границы массива, как уже сказали
5. wcsncpy(s, p, wcslen(p)); - вообще непонятнокак? ведь для s выделен размер под 1 символ, а вы пытаетесь туда затолкать весь p, который MAX_PATH
6. память, выделенная для p, освобождается некорректно и неполностью
7. память, выделенная для s, не освобождается вообще

итого - используйте smart-pointer'ы, не играйтесь с указателями, пока не научитесь с ними обращаться, т.е. уделите большое внримаение использованию указателей, это ваш пробел в знаниях, имхо. критический.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 27.02.2007, 17:08

Отвечает: Ilkras
Здравствуйте, VovikDoc!
В вашем примере функция CoInitialize вызывается каждый раз, в то время как CoUninitialize вызывается не каждый. Кроме того в MSDN пишут следующее: "It is convenient to use CoCreateInstance when you need to create only a single instance of an object on the local machine." Вы же вызываете функцию CoCreateInstance последовательно несколько раз.
Еще одно соображение.
Вы выделяете память под s как new WCHAR[1], а сколько вы туда копируете в wcsncpy(s, p, wcslen(p)); ? Попробуйте распечатать величину wcslen(p) перед копированием.
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 27.02.2007, 18:19

Отвечает: kool
Здравствуйте, VovikDoc!
CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW,
(LPVOID*)&psl) == S_OK - получили интерфейс IShellLinkW. А кто его освобождать-то будет?
Кроме того if (hres == S_OK || hres == S_FALSE), а
CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID*)&psl) != S_OK, то CoUninitialize(); не будут выполнено.
Удачи!


---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 27.02.2007, 20:34


Вопрос № 77.037
Здравствуйте эксперты!
Просьба отвечать тем кто рельно понимает о чем я говорю.
Пишу архиватор с алгоритмлм сжатия Шенона-Фано в Visual c++. Столкнулся спроблемой: каким образом мне считывать символьную информацию с разных типов файлов для того чтобы ее потом сжимать(считывать с exe doc txt html), как создать фаил с собственным форматом и расширением в котором будут храниться сжатая информация и таблица для её расжатия, каким образом мне разжимать разные типы файлов как этот процесс дожен быть сделан. Меня интересует работа с файлами.
И если я получу при от алгоритма строку например 1010101010101 то как сделать так чтоб строка записалась в фаил причем не как текст а как биты
Отправлен: 27.02.2007, 20:41
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: kool
Здравствуйте, Tatarin!
Открывай файл как бинарный и считывай чем хош.
Если нужна скорость используй отображение файла на память
и потом работай с файлом как с массивом.
>как создать фаил с собственным форматом и расширением
создавай как обычный файл, с форматом и расширением, которые
сам и придумаешь.
С битами работают с помощью масок и операторов &, ~ и |.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 27.02.2007, 22:48

Отвечает: Sergijj
Здравствуйте, Tatarin!

Чтобы убрать привязку к типу файла нужно читать и писать файл как НЕтипизированный (Сырой, двоичный (бинарный) код).

С записью - то же самое.
Но для того чтобы что-нибудь создать (например формат файла) нужно это самое что-нибудь сначала прИдумать/прОдумать...:)

Работать в памяти (с массивом например) удобнее и быстрее, чем с файлом. Поэтому перед обработкой файла нужно его (файл) прочитать в какой-нибудь буфер памяти.

С битами _строкой_ работать НЕ нужно. Легче / лучше /быстрее работать с _числами_.

Успехов!
Спрашивайте если чего...

---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 8-ой класс)
Ответ отправлен: 28.02.2007, 10:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо!


Вопрос № 77.083
Всем привет!

Нужно сделать программу с модулями.Тоесть есть оснавная программа,она представляет собой меню (обычное,c циферками (switch)),из этого меню должны вызываться другии программы (как бы модули).Вопрос в том как вызвать эти программы из меню?И в каком формате они вообще должны быть?Правила описания и все такое.

Транслятор у меня TURBO C++ 3.0. Желательно привести код для чистого си.
Спасибо за помощь).
Отправлен: 28.02.2007, 00:54
Вопрос задал: Ogogo (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Ilkras
Здравствуйте, Ogogo!
насколько я помню в Turbo C 3.0 (для DOS) были вызовы launch() и exec(). С их помощью можно было загрузить исполняемый модуль и этот модуль вытеснял из памяти вызывающий модуль.
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 10:47
Оценка за ответ: 4
Комментарий оценки:
не то,но спосибо за ответ


Вопрос № 77.085
Здраствуйте Эксперты. Посоветуйте пожалуйста литературу или ссылочку дайте, по программированию на С++, для новичков. Заранее благодарю.
Отправлен: 28.02.2007, 01:51
Вопрос задал: Киор Ярослав Николаевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Рязанов Максим Валерьевич
Здравствуйте, Киор Ярослав Николаевич!
Книжки можно посмотреть здесь:
1. http://c-books.info/books/load.php?ty=c
2.http://4read.org/
3. natahaus.ru

Я лично начинал изучать С++ с Бьерна Страуструпа. Скачать можно: http://www.megaupload.com/?d=OARL7G9H или http://rapidshare.com/files/2548034/jazyk_programmirovanija_s_bern_straustrup.rar.
Размер: 2.65 Mb
Удачи!
Ответ отправил: Рязанов Максим Валерьевич (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 23:03


Вопрос № 77.090
Вот у меня такой вопрос: как написать многотомное приложение, т.е. есть некая программа которая обрабатывает запросы других программ. (на подобии сервера БД)?

Заранее благодарен!.
Отправлен: 28.02.2007, 03:56
Вопрос задал: FreeCube (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: lupus campestris
Здравствуйте, FreeCube!
Вам поможет книжка Шона Уолтона "Создание сетевых приложений в среде Linux. Руководство разработчика".
Удачи!
---------
«С кем тяжело молчать, с тем не о чем говорить» (Метерлинк)
Ответ отправила: lupus campestris (статус: Профессор)
Россия, Москва
Тел.: +79060429689
Организация: http://www.orange-business.ru
WWW: http://lupus-campestris.blogspot.com/
ICQ: 193918889
----
Ответ отправлен: 28.02.2007, 19:11

Отвечает: kool
Здравствуйте, FreeCube!
Можно использовать технологию DCOM.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 21:12


Вопрос № 77.122
Уважаемые эксперты!

Столкнулся с трагической проблемой.
Работаю с gcc 3.3.3 RHL9 and PPC_8xx
Я использую C и C++. И после сшивки приложения получаю смертельную зависисмость от libstdc++.so.5.
# readelf -a ./myappl | grep "Shared"
0x00000001 (NEEDED) Shared library: [libstdc++.so.5]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
Она размером почти 800 Кб. Это смертелно для Flash. Статическая линковка тоже смертельна, та как бинарный файл очень большой.
Я видел, что можно получить
# readelf -a ./myappl | grep "Shared"
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]

К сожалению, мне не к кому больше обратиться. Я очень надеюсь на помощь и совет, как я могу сшиться таким образом, чтобы libc.so.6 динамически подшивалась, а libstdc++.so.5 статически. Переписать все на С - просто катастрофа.

Александр Захаров
Отправлен: 28.02.2007, 11:09
Вопрос задал: Alex CogitoErgoSum (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Ilkras
Здравствуйте, Alex CogitoErgoSum!
Я чего-то недопонимаю в вашем вопросе. Если статическая линковка смертельна - файл не влазит в ROM - значит и динамическая линковка не поможет. Ведь статическая линковка выбирает только используемые функции, а при динамической вы храните все функции и потом подгружаете только те, что нужны. Вообще, для embedded, статическая линковка предпочтительнее.
Проверьте, нет ли отладочной информации в библиотеках. Попробуйте сделать strip на ваш image. Если не поможет, то посмотрите в библиотеках какие функции сколько места занимают - может быть сможете имплементировать по другому и уменьшить ваш footprint.
А вообще - опишите вашу систему поподробнее, что за железо, что за система...
Удачи
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 11:20

Отвечает: ramok
Здравствуйте, Alex CogitoErgoSum!

при линковке укажите явно libstdc++.a с ключиком -L
узнать где он находится можно
g++ -print-file-name=libstdc++.a

например
g++ -L`g++ -print-file-name=libstdc++.a` -другие-опции
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 01.03.2007, 03:20


Вопрос № 77.131
Здравствуйте Уважамаемые Эксперты!!
Помогите реализовать задачу на языке C++!!!
Даны две строки символов S и T. Необходимо определить сколько раз строка T входит в строку S и удалить первое и последнее вхождение T в S.
В условии сказанно что данные считываються из текстового файла in.txt
и результат тоже записываеться в текстовый фаил out.txt
Отправлен: 28.02.2007, 11:47
Вопрос задал: Михальчук Максим (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

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

Приложение:

Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 14:51

Отвечает: Терсков Сергей
Здравствуйте, Михальчук Максим!
Второй раз уже вижу этот вопрос, но на C++ на него Вам так никто и не ответил. Так что вот...

Входной файл in.txt

test this is a test test test
test

Выходной файл out.txt

Count of string T in string S is : 4
String S after transformations :
this is a test test

Приложение:

Ответ отправил: Терсков Сергей (статус: 6-ой класс)
Ответ отправлен: 01.03.2007, 03:09


Вопрос № 77.155
Приведите пожалуйта пример как можно маписать в фаил пару бит
Отправлен: 28.02.2007, 14:34
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ilkras
Здравствуйте, Tatarin!
Здравствуйте, Tatarin!
К сожалению, невозможно записать в файл ровно 2 бита, однако если запись одного байта вас устроит, то смотрите:
FILE * fp;
char ParaBit;
fp = fopen("file.txt","wb");
fwrite(&ParaBit, 1, 1, fp);
fclose(fp);

Счастливо
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 14:55

Отвечает: Tek
Здравствуйте, Tatarin!
К сожалению файловые системы оперируют в большинстве своем байтами - большое упущение со стороны разработчиков стандартов (кстати я не прикалываюсь и не издеваюсь, иногда нужно, хоть и оооочень редко), по-этому выставляем в байте нужные биты, и пишем этот один байт в файл, напрмер так(используем Win32API):
HANDLE hFile = CreateFile("file.bin", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, (SECURITY_ATTRIBUTES *)NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL);
BYTE bt = 2;
DWORD dw = 0;
WriteFile(hFile, &bt, 1, &dw, NULL);
CloseHandle(hFile);
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 28.02.2007, 15:01
Оценка за ответ: 5
Комментарий оценки:
Молодес!

Отвечает: Gremlin
Здравствуйте, Tatarin! В приложении простенький метод, который устанавливает в файле бит,спозициионированный на BitNumber, в значение BitValue. Поскольку минимальное количество информации при работе с файлами равно одному байту, то необходимо сначала считать байт, содержащий данный бит, выставить в нем значение бита, а затем уже записать по-новой этот байт обратно в файл.

В методе подразумевается, что BitNumber физически уже существует в файле, поэтому проверок на его отсутствие я не делал.

Приложение:

Ответ отправил: Gremlin (статус: 1-ый класс)
Ответ отправлен: 28.02.2007, 16:54

Отвечает: kool
Здравствуйте, Tatarin!
В файле можно сохранять не менее байта.
Чтобы сохранить два бита нужно сохранить байт
у которого заданные два бита имеют
определенное значение (см.пример).
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 20:40


Вопрос № 77.185
Спаибо всем за предыдущую справку!
Вопрос:
Напишите подробнее про переменную типа BYTE эта переменная может хранить инфу размером в один байт или как?
Допустим у меня есть целочисленный массив из разных значения типа 111010101 могу-ли я присвоить значения этого массива переменной типа BYTE и как присваивать ведь один байт это 8 бит т.е. в одну переменную типа BYTE поместится 10101010 или нет?
Как в байте выставить нужные биты?
И еще одно 8-)
У меня есть переменная типа char mass[]="10010101" как мне записать эту битовую строчку в фаил и как считать её потом, или надо использовать int b=10010101? заранее спасибо/
Отправлен: 28.02.2007, 18:17
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ilkras
Здравствуйте, Tatarin!
байт это 8 бит. Иначе BYTE = unsigned char.
запись константы может быть в бинарной или десятичной форме. можно записать
unsigned char A = 11101010b; или
unsigned char A = 234;
unsigned char A = 0xEA; в шестнадцатеричной форме.

для того чтоб записать строчку в файл надо использовать обычный интерфейс типа write(), fwrite(), FileWrite() etc. Чтобы превратить строчку с числом в число можно пользоваться функциями sscanf(), atoi().

если вы хотите выставить бит N в байте в 1, то воспользуйтесь операцией
unsigned char A;
A = A|(1<<N);
если вы хотите выставить бит N в байте в 0, то воспользуйтесь операцией
A = A&(0xFE<<N);

Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 18:29

Отвечает: Gremlin
Здравствуйте, Tatarin!
int b=10010101 - это десятичная запись, поэтому битовое представление b будет уже другим(00000000100110001011110111110101). Точно так же обстоят дела и с char mass[]="10010101".Только битовая версия строки будет совокупностью байт, соответствцющих ASCII-кодам символов '0' и '1', которые соответственно равны десятичным цифрам 48 и 49. Если у вас есть реальная битовая строка, которая в последствии не будет меняться, то быстрее всего будет разбить эту последовательность на блоки, размерностью по 64,32,16 или 8 бит, забить эти блоки в калькулятор, перевести их в десятичное представление, и уже манипулировать в программе десятичными числами.

Размер блока - выбирайте на свое усмотрение, но ТИП, используемый для хранения соответвтвующих десятичных чисел должен соответствовать следующим отношениям:

Для 64 битных блоков, используйте целочисленный тип __int64 или LONGLONG
Для 32 битных блоков, используйте целочисленный тип DWORD или ULONG
Для 16 битных блоков, используйте целочисленный тип WORD
Для 8 битных блоков, используйте целочисленный тип BYTE

BYTE - это тот же char, только без знака, т.е. unsigned char

Метод, который я привел предыдущим сообщением как раз и выставляет заданный бит в байте.
Ответ отправил: Gremlin (статус: 1-ый класс)
Ответ отправлен: 28.02.2007, 18:49
Оценка за ответ: 5
Комментарий оценки:
Спасибо

Отвечает: Thread
Здравствуйте, Tatarin!
В С/С++ переменная размером в 8 бит это char. Она может принимать значения -127..127. Аналог паскалевского byte это unsigned char (т.е. беззнаковый). Заметьте, что char - это не символ, это целый тип. Что бы присвоить такой переменной значение char mass[]="10010101" нужно перевести это число в десятичное значение.

Приложение:

Ответ отправил: Thread (статус: 4-ый класс)
Ответ отправлен: 28.02.2007, 19:18
Оценка за ответ: 5
Комментарий оценки:
Ок понял спаибо

Отвечает: kool
Здравствуйте, Tatarin!
Да - переменная типа BYTE может содержать
инфу в один байт.
Нет не можешь. Тип int в Win32 занимает 4-ре байта.
А значения из четырех байт не поместиться в один байт, а
тем более массив!!!
Биты в байте выставляются с помощью масок и операций &, ~ и |.
Почитать можно в любом учебнике по C.
Чтобы записать строку char mass[]="10010101"
в переменную BYTE b см.приложение.
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 20:40

Отвечает: Ross
Здравствуйте, Tatarin!

Считаю своим долгом объяснить, почему предыдущие эксперты использовали тип unsigned char в качестве одного байта.
Любой тип данных в языке C имеет свою размерность:
char,bool - 1 байт
short - 2 байта
long,float,int - 4 байта
long double,double - 8 байт
Т.е. , как ты видишь, типы переменных одной и той же размерности могут хранить данные различного типа, разница лишь в том, как эти байты интерпретируются.
Теперь насчет "типа" BYTE. В одном из заголовочных файлов находится строчка:
typedef unsigned char BYTE;
Т.е. BYTE = unsigned char

Конечно, массив в один байт не поместится, но можно выставить биты в нем в соответствии с числами в массиве, например так:

BYTE b;
char m[]="10010001";

for (int i=0; i<8; i++)
{
mas[i]-=48;
b<<=1;//сдвигаем биты влево на 1
if (m[i]) b|=1; else b&=254;

}

число 1 в двоичном виде 00000001, зн. операция x|=1 установит последний бит в 1
число 254 - это 11111110, зн. x&=254 установит последний бит в 0
Ответ отправил: Ross (статус: 6-ой класс)
Ответ отправлен: 01.03.2007, 02:12
Оценка за ответ: 5
Комментарий оценки:
Спасибо за справку вроде бы все понял!


Вопрос № 77.190
Здравствуйте. Подскажите пожалуйста, как можно опредилить время работы программы?
Отправлен: 28.02.2007, 18:46
Вопрос задал: Platon (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ilkras
Здравствуйте, Platon!
в windows можно посмотреть в "Task Manager"
в linux с помощью утилиты "top"
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 18:55

Отвечает: Gremlin
Здравствуйте, Platon!
Воспользуйтесь методом GetTickCount, он возвращает число милисекунд, прошедшее с момента запуска операционной системы.

чтобы вычислить время в заданном диапазоне, нужно вычесть значение этой функции перед окончанием работы из значения этой функции после начала работы.
Ответ отправил: Gremlin (статус: 1-ый класс)
Ответ отправлен: 28.02.2007, 18:57

Отвечает: kool
Здравствуйте, Platon!
Для этого служат профилировщики.
Смотрите "Enable Profiling" в MSDN.
Можно также с помощью функций использования системного времени
банально засечь время, что бывает более точно.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 20:40

Отвечает: ramok
Здравствуйте, Platon!

в юникс подобных системах время выполнения программы измеряется програмкой time
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 01.03.2007, 02:28


Вопрос № 77.204
Каким образом с помощью api можно запустить на выполнение фаил кроме как system() и ShellExecute()?
Отправлен: 28.02.2007, 20:27
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Tatarin!
1)
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

2)
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);

Расшифровка параметров в MSDN и по поиску на сайте.
Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
----
Ответ отправлен: 28.02.2007, 20:34

Отвечает: kool
Здравствуйте, Tatarin!
Смотри, например, CreateProcess(.....).
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 20:42


Вопрос № 77.205
Добрый день, уважаемые господа эсперты!
Не могли бы вы мне на каком-нить простом примере показать использование функции EnumPrunters(...)?

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

Приложение:

Отправлен: 28.02.2007, 20:32
Вопрос задал: Karlson (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Karlson!
Имхо Вместо DWORD size_buf=4096;
Нуно так - DWORD size_buf=sizeof(PRINTER_INFO_2);
Удачи!


---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 21:12

Отвечает: John Paramol
Здравствуйте, Karlson!
Посмотрите простой пример кода, отображающего список принтеров.
При первом вызове EnumPrinters получаем количество установленных в системе принтеров.
При втором - в массив структур PRINTER_INFO_2 заносится информация.
Удачи

Приложение:

---------
1=2, at values 1 large enough

Ответ отправил: John Paramol (статус: 6-ой класс)
Ответ отправлен: 01.03.2007, 09:37

Отвечает: Sergey A. Wedensky
Здравствуйте, Karlson!
Пример получения списка локальных и сетевых принтеров.

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 01.03.2007, 10:56


Вопрос № 77.207
Здраствуйте!скажите пожалуйста я хочу изучать С++ и незнаю что делать качать от микрософта Visual C++ Express 2005 (кажеться так называеться),или же пойти и купить С++ 6.0 ?

Если можете дайте исчерпающий ответ!
Отправлен: 28.02.2007, 20:40
Вопрос задал: DarkHacker (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ilkras
Здравствуйте, DarkHacker!
компилировать программы на С++ вы сможете любым компилятором С++. Так что вам надо решить, что вы хотите писать, запастись книжками, полазать по интернету - поискать статьи на интересующую вас тему и, только потом, вы сможете выбрать подходящий инструментарий.
Для того чтобы научиться писать программы на С++ вам вполне хватит бесплатного gcc. Посмотрите cygwin на redhat.com или Dev-C++ например на tucows.com.
Последняя версия Microsoft Visual C++ вам необходима, только если вы хотите использовать последние технологии этой фирмы, а это уже зависит от выших планов (смотри выше).
Удачи.
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 22:28
Оценка за ответ: 5
Комментарий оценки:
С этим ясно а вот что использовать:

Visual C++ 6

илли Visual C++ 2005 Express Edition Beta 2

или посоветуйте что нибудь свое...

Отвечает: Thread
Здравствуйте, DarkHacker!
Между двумя рассматриваемыми IDE разницы принципе нет. Ставьте ту, которую вам проще добыть - вы ничего не потеряете. Единственное существенное отличие - это в возможность создания C++.NET приложений в новой среде, но для новичка это не нужно. Еще я вам советую обратить внимание на бесплатную среду Eclipse.
Ответ отправил: Thread (статус: 4-ый класс)
Ответ отправлен: 01.03.2007, 07:34


Вопрос № 77.219
Все с битами разобались а теперь разберемся чего я хочу
Я считываю из файла строку ну например "мама мыла раму" при помощи алгоритма шенона-фано
я поеобразую эту строку в что то типо 0010101010 (это конечно не точно так но что то бодобное) сейчас эти нули и единицы это символы типа char теперь надо умудриться сделать так чтобы именно эти символы именно в этом порядке без добавления лишнего материала и.т.п оказались в бинарном файле в виде бинарного кода (не приобразовавать по таблицам апросто чтоб это стало содержимым бинарного файла, т.е. было битовым представлением) уже незнаю как обьяснить 8-)
Отправлен: 28.02.2007, 21:36
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ilkras
Здравствуйте, Tatarin!
я думаю, что оптимально будет считывать по 8 символов, превращать их в один байт и писать его в файл (или в буфер, а потом в файл). Как преобразовать "0" или "1" в бит вы уже знаете. Символ в число, в данном случае, проще всего преобразовать так if(ch =='1'){c = 1;} else {c = 0;}. Чтоб преобразовать 8 символов подряд - делайте это в цикле:
for(i=0; i<8; i++)
{
if(string[i] == '1')
my_byte |= (1<<i);
else
my_byte &=(0xFE<<i);
}
Недостаток этого метода - низкая скорость. На кодирование одного бита тратится много операций (около 10 команд ассемблера я думаю).
Преимущество - простота и отлаживаемость.
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 22:40

Отвечает: kool
Здравствуйте, Tatarin!
А в чем дело - упаковывай их в байты (по 8 бит в каждом)
и записывай в файл.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 28.02.2007, 23:21

Отвечает: Sergey A. Wedensky
Здравствуйте, Tatarin!
Вот Вам две функции - запись строки вашего вида в бинарный файл и чтение обратно. Работа с файлами - на WinAPI. Первые 4 байта файла - заголовок - истинная длина исходной строки (нужна, т.к. в файл можно записать только целое число байт, т.е. кратное 8 число бит).

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 01.03.2007, 10:55
Оценка за ответ: 5


Вопрос № 77.252
Здарово всем! ;)
Скажите пожалуйста как теперь из файла в который я назаписывал биты их считать да так чтоб затем представить их в виде строки? ну тоесть для тех кто отвечал на предыдущие мои вопросы нужно объяснить мне как повернуть процесс в обратном направлении.
Кстати всем кто мне помогал большой respect и спаибо!
Отправлен: 01.03.2007, 04:27
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Tatarin!

считать строку из файла
char str[10];
FILE *f;
/*открываем перед этим файл fopen() в переменнную f */
fgets(str, 9, f);
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 01.03.2007, 04:34

Отвечает: kool
Здравствуйте, Tatarin!
Считываешь байты, снимаешь с них маску
все теми же операциями &,|,<< и записываешь
эти значениея в массив.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 07:52

Отвечает: Tamashev Denis M
Здравствуйте, Tatarin!
Ну так в чём трабл.
CreateFile
ReadFile
SetFilePointer
Ответ отправил: Tamashev Denis M (статус: 3-ий класс)
Ответ отправлен: 01.03.2007, 09:32

Отвечает: Sergijj
Здравствуйте, Tatarin!

Если биты записаны в файлике в виде _текста_, то см. ответ ramok.
Если биты записаны в файлик в виде _числа_, то:

int bits = 0; // Переменная, куда будем записывать то, что в файле
char bitString[100]; // Буфер из символов = строка, куда будем складывать символы, полученные после переконвертации числа в строку.
int f = open("file.bit", O_RDONLY); // Открываем файл на чтение
read(f, &bits, sizeof(int)); // Считываем 2 (или 4, - в зависимости от платформы) байта в переменную bits. Переменная bits занимает sizeof(int) байт! Больше sizeof(int) байт сюда считывать нельзя! Если хотите прочитать из файла много байт, то используйте какой-нибудь буфер, например массив.
itoa(bits, bitString, 2); // Конвертируем число bits в строку bitString, используя в качестве основания двойку (ибо хотим получить двоичную систему счисления);
printf(" Binary: %s", bitString); // Печатаем получившуюся строку
close(f); // Закрываем файл

Должно быть типа того...

Успехов!
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 8-ой класс)
Ответ отправлен: 01.03.2007, 09:48
Оценка за ответ: 5

Отвечает: Ilkras
Здравствуйте, Tatarin!
Считываете текст в строчку. Выделяете в 8 раз больше места для результата.
Далее, побайтно делаете следующее:
for(k = 0; j=0; j<strlen(incoming_string); j++,k+=8)
for(i=0;i<8;i++)
{
if((1<<i)&incoming_string[j])
outgoing_string[k+i] = '1';
else
outgoing_string[k+i] = '0';
}
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 01.03.2007, 10:58
Оценка за ответ: 5

Отвечает: Gremlin
Здравствуйте, Tatarin!
в приложении обратный метод, он считывает весь файл и конвертирует его содержимое в битовую строку, ASCII вида. Здесь я использовал STD-контейнер string для хранения результата. Принцип, как видите прост: читаем файл во временный буфер. Пробегаем каждый его байт и тестируем каждый бит байта.

Результирующая строка будет, соответственно больше размера файла в 8 раз.

Приложение:

Ответ отправил: Gremlin (статус: 1-ый класс)
Ответ отправлен: 01.03.2007, 12:59
Оценка за ответ: 5


Вопрос № 77.346
все наверно знают о существовании такого заголовочного файла как <biset>

почему когда я пишу что-то типо:

<bitset>

int main()
{

bitset <100> b1;

return 0;
}

компелятор пишет 'bitset' : undeclared identifier
C:filefile.cpp(15) : error C2065: 'b1' : undeclared identifier
C:filefile.cpp(15) : warning C4804: '>' : unsafe use of type 'bool' in operation
C:filefile.cpp(15) : warning C4552: '>' : operator has no effect; expected operator with side-effect
Error executing cl.exe.
Хотя я читал примеоы в разных книгах там пишут что все должно тработать
У меня cpp Visual 6
Отправлен: 01.03.2007, 16:50
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Thread
Здравствуйте, Tatarin!
Класс bitset находиться в пространстве имен std

Приложение:

Ответ отправил: Thread (статус: 4-ый класс)
Ответ отправлен: 01.03.2007, 16:58
Оценка за ответ: 5

Отвечает: V1s0r
Здравствуйте, Tatarin!

Во всех мне известных книгах C++ для начинающих написано, что все функции/классы стандартной библиотеки C++ заключены в пространство имён std.

Нужно нписаль либо
using namespace std;
либо
using std::bitset;

Отличия между ними - также в любой книжке (если этого в книге нет, то выкиньте эту книгу в форточку).
Ответ отправил: V1s0r (статус: 2-ой класс)
Ответ отправлен: 01.03.2007, 17:13

Отвечает: Ilkras
Здравствуйте, Tatarin!
действительно есть такой header, но писать надо
#include <bitset>
Удачи
Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 01.03.2007, 17:15

Отвечает: kool
Здравствуйте, Tatarin!
Нуно так (см. приложение):

Приложение:

---------
I am.

Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 20:31
Оценка за ответ: 5
Комментарий оценки:
thanks very mach


Вопрос № 77.367
Напишите пожалуйста на примеhе как пользоваться функцией OpenFile
Отправлен: 01.03.2007, 18:58
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: kool
Здравствуйте, Tatarin!
--------------------------
См. прил.
--------------------------
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 20:33


Вопрос № 77.368
Еще раз всем привеД!
Вопрос правильно ли я записываю в фаил биты
и ещё вопрос как мне их оттуда считать

Приложение:

Отправлен: 01.03.2007, 19:00
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Tatarin!
Все правильно. Только записываются байты, содержащие нужные биты.
Но быстрее будет так (см. приложение).
Чтобы получить биты из файла нуно считать байты, которые их содержат,
а потом уже можно работать с необходимыми битами, которые содержатся в этих
байтах.
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 20:32
Оценка за ответ: 5
Комментарий оценки:
Огр Спосибо )))))

Отвечает: Ilkras
Здравствуйте, Tatarin!
почти правильно.
1) надо инициализировать переменную (чтоб проще отлаживаться было)
2) побитовый сдвиг влево надо делать после присвоения бита, иначе у вас первый бит теряется.
в остальном, похоже, все правильно

Ответ отправил: Ilkras (статус: 2-ой класс)
Ответ отправлен: 01.03.2007, 20:58
Оценка за ответ: 5


Вопрос № 77.380
Здравствуйте Уважаемые Эксперты, помогите разобраться. Проблема вот в чём: я написал программу, в ней есть всякие настройки, когда запускаешь и настраиваешь, то всё работает, но когда выключаешь и запускаешь заново, то все настройки пропадают, как можно сделать чтоб они сохранялись. Спасибо.
Отправлен: 01.03.2007, 20:14
Вопрос задал: Leajoker (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Thread
Здравствуйте, Leajoker!
Вам нужно сохранить ваши настройки в файл. Например в INI. Лично я использую XML для хранения настроек.
Ответ отправил: Thread (статус: 4-ый класс)
Ответ отправлен: 01.03.2007, 20:27

Отвечает: kool
Здравствуйте, Leajoker!
Нужно сохранять настройки в файле конфигурации,
а при запуске проги считывать их оттуда.
Удачи!

---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 20:33

Отвечает: Patriotix-N
Здравствуйте, Leajoker!
Конечно можно создавать и ini, и xml файлы. Можно сохранить настройки в простой текстовой файл.
Иногда полезно сохранять настройки в реестре.
Можно в МСДНе поискать, а можно и в инете.
Вот несколько ссылок по реестру и файлам инициализации:
http://www.hostmake.ru/articles/c/241/
http://forum.sources.ru/index.php?showtopic=119084
Вообще по С++ много информации: http://www.cracklab.ru/pro/cpp.php?
---------
Лучше знать ничего обо всем, чем все ни о чем.
Ответ отправил: Patriotix-N (статус: 3-ий класс)
Ответ отправлен: 01.03.2007, 21:19


Вопрос № 77.387
Ура товарищи теперь я научился записывать и считывать биты в и из файла!
если это переделывает строку в биты
char mass[]="11010100";BYTE my_byte;

for(int i=0; i<8; i++)
{
my_byte<<=1;

if(mass[i] == '1')
my_byte |= 1;
}

то каким мне образом сделать обратное, т.е. забить массивчик char mass2[8] из байта BYTE b

Да и ещё kool обьясни пожалуйста что в твоем прошло ответе значило my_byte |= (0x80>>i); я так понял что это сдвиг, но не понял как именно!
Отправлен: 01.03.2007, 21:04
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Tatarin!
>Да и ещё kool обьясни пожалуйста что в твоем прошло ответе значило
>my_byte |= (0x80>>i); я так понял что это сдвиг, но не понял как именно!

Смотри за руками: 0x80 - это шестнадц-ное. предсатвление байта,
кот. состоит из след. битов 0x80=10000000b.
Сначала сдвигаем эту посл-ть вправо на i, а затем маскируем с my_byte.
Т.е. если, например, i=5, и my_byte=0x40=01000000b, то 0x80>>5=00000100b,
my_byte|=00000100b = my_byte=my_byte|00000100b = 01000000b|00000100b =
01000100b. (Т.к. сначала my_byte =0, то нулевые биты можно не обрабатывать -
они и так на своих местах. Твой код вообще говоря не правильный.
Нужна инициация my_byte =0. См. внимательно пред. прил-ние.)
От того куда ты будешь двигать маску зависит порядок бит в твоем байте.
Код кот. я тебе передал сохраняет порядок бит в байте таким же как в массиве
mass2[8]. Первый бит этого массива - старший бит байта. Если хочешь
поменять порядок, нуно делать так -
my_byte=0;
.......
my_byte |= (1<<i); //1=00000001b
.......
Лучше тебя самого тебе никто не объяснит. Почитай про битовые операции -
это в каждом учебнике по C. Посмотри все в отладчике. Если чего не
понятно еще спрашивай.
Удачи!
---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 23:09


Вопрос № 77.398
Здравствуйте Эксперты!
Я начал изучать С++. Как написать код, который будет выполнять функции через определённый промежуток времени. Например выполняется функция func(), проходит две секунды и выполняется следующая функция.
И ещё вопрос: Как написать код, который открывает сторонний файл на жёстком диске. Например я запускаю исходный файл, а он открывает файл с расширением *.bmp.
Отправлен: 01.03.2007, 21:53
Вопрос задал: Shkiperr (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Shkiperr!
Для приостанова выполнения программы
на определенное время есть такая ф-ция

VOID Sleep(
DWORD dwMilliseconds // кол-во милесекунд задержки
);

Например, задержка на 2 сек.
Sleep(2000);
Удачи!


---------
I am.
Ответ отправил: kool (статус: 10-ый класс)
Ответ отправлен: 01.03.2007, 23:09


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

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

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

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

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


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


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

В избранное