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

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


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

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

Выпуск № 684
от 18.03.2007, 02:35

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


Вопрос № 77935: Пожалуйста, помогите мне в решении задачи! Вот условие: Задача по обработке файлов. В этой задаче нужно самостоятельно определить структуру записи и характеристики ее элементов, выполнить описание данной структуры и написать программу, содерж...
Вопрос № 77961: Уважаемые эксперты! подскажите как инициализировать константный член - указатель на объект Объявление в приложении. Такая строка не проходит: const string_manager *string::__man_def=new string_manager();...
Вопрос № 78013: Здравствуйте! Компилятор (g++) выводит предупреждение о том, что операция удаления void* не определена. Что сделать, чтобы это предупреждение не выводилось, но только для этого случая (все остальные удаления void* должны отлавливаться на эта...
Вопрос № 78037: Уважаемые эксперты. Подскажите пожалуста сколько существует алгоритмов по нахождению максимального потока в сети? И где можно найти сопутствующие материалы? Заранее спасибо....
Вопрос № 78038: Здраствуйте!! у меня 2 вопроса: Как получить указатель на Функцию??? и можно описание таких классов CEvent, CMutex,CSemaphore,CCriticalSection...

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

условие поиска
Напечатать фамилии авторов, названия и количество страниц книг, обеспечивающих дисциплину, название которой введено с клавиатуры.
Отправлен: 12.03.2007, 11:39
Вопрос задал: Lrad (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: FreeCube
Здравствуйте, Lrad!

int index;
typedef struct addr // структура
{
char Fio[50] // ФИО 50 символов
char kniga[50] // Книга 50 символов

} ros ;

ros * zapis;

если количество записей не известно то создается динамический массив(
ros * zapis;
a = new vopros[index] ;)


// запись файла
TMemoryStream *tmp = new TMemoryStream();
__int64 Size=0 ;
tmp->Position=0;
tmp->Size=0;
tmp->Write(&index,sizeof(int)); // запись а количестве записей
for (int i=0 ; index>i; i++) {
tmp->Write(&zapis [i],sizeof(ros) ) ;
}
Size=r->Size;
tmp->Write(&Size,sizeof(__int64));
r->Position=0;
tmp->CopyFrom(r,Size);
tmp->SaveToFile(“C:\файл.000 ”);
tmp->Free();

…..

TMemoryStream *tmp = new TMemoryStream(); // открытие и чтение
__int64 Size=0 ;
tmp->Position=0;
tmp->Size=0;
tmp->LoadFromFile(C:\файл.000 ”) ;
tmp->Read(&index,sizeof(int));
a = new ros[index] ;
for (int i=0 ; index>i; i++) {
tmp->Read(&zapis [i],sizeof(ros) ) ;
}
tmp->Free();


поиск можно осуществить в цикле обращаясь к полям структуры (zapis [i]. Fio==”что ищем ” )
Ответ отправил: FreeCube (статус: 1-ый класс)
Ответ отправлен: 12.03.2007, 12:23

Отвечает: Ilkras
Здравствуйте, Lrad!
Здравствуйте, Lrad!
Из вашего сообщения:"Задача по обработке файлов.
В этой задаче нужно самостоятельно определить структуру записи и характеристики ее элементов, выполнить описание данной структуры и написать программу, содержащую функции создания файла, вывода на экран всей информации и информации, соответствующей условиям поиска." - совершенно непонятно каков исходный файл.
Вы должны точно задать условия.
Например. Дан текстовый файл в котором содержатся данные о книгах в следующем формате: Названию предшествует слово "Название", году издания предшествует слово "год" и т.д.
Та форма, в которой вы даете ваше задание, не позволяет делать предположений о структуре файла (например это может быть зазипованный pdf или набор фотографий обложек книжки в jpeg формате собранных вместе в один файл, или это может быть текстовый файл на китайском языке).
Так что, пожалуйста, потрудитесь сформулировать вашу задачу.
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 12.03.2007, 12:40


Вопрос № 77.961
Уважаемые эксперты!
подскажите как инициализировать константный член - указатель на объект
Объявление в приложении.
Такая строка не проходит:
const string_manager *string::__man_def=new string_manager();

Приложение:

Отправлен: 12.03.2007, 15:04
Вопрос задал: Slin (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Tek
Здравствуйте, Slin!
Стандарт C++ не предусматривет инициализацию статических членов в объявлении класса.
Следует повторно продублировать объявление этих переменных как глобальных для модуля описания класса, там и инициализировать.
То есть
//в _string.h
class string {
static const string_manager *__man_def;
}
// в _string.cpp
#include "_string.h"
const string_manager *__man_def = new string_manager("gfgdsfgdgffh");


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

Отвечает: Ilkras
Здравствуйте, Slin!
такие соображения:
во-первых, С++ требует implicit initialization of constants - то есть значения надо давать в момент определения.
во-вторых, С++ полагает internal linkage для констант в отличие от С, который полагает по умолчанию external linkage. Вероятно поэтому ваш пример не работал. Можно попробовать определить extern static const string_manager *__man_def;
Больше идей нет.
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 12.03.2007, 18:05
Оценка за ответ: 5
Комментарий оценки:
спасибо, разобрался, дело не в этом оказалось

Отвечает: Gremlin
Здравствуйте, Slin!
к верному ответу Tek остается только добавить, что инициализацию не обязательно переносить в cpp, достаточно в хидере, просто ниже объявления класса. В самом классе разрешается инициировать только константы простых типов, например int, char, long. Указатель - составной тип, поэтому приходится откладывать его инициализацию. То же самое касается и массивов, они составные.
Ответ отправил: Gremlin (статус: 1-ый класс)
Ответ отправлен: 12.03.2007, 18:41
Оценка за ответ: 5
Комментарий оценки:
спасибо :)

Отвечает: kool
Здравствуйте, Slin!
Инициируй свой член в конструкторе.
(см.прил-ние)
Удачи!

Приложение:

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

Ответ отправил: kool (статус: Студент)
Ответ отправлен: 12.03.2007, 20:30
Оценка за ответ: 4
Комментарий оценки:
инициализация в конструкторе не подходит, по той простой причине, что инициализация должна быть один раз, т.е. одно и то же значение используется всеми объектами класса


Вопрос № 78.013
Здравствуйте!

Компилятор (g++) выводит предупреждение о том, что операция удаления void* не определена. Что сделать, чтобы это предупреждение не выводилось, но только для этого случая (все остальные удаления void* должны отлавливаться на этапе компиляции)?

void *obj;
...
delete obj; // test.cpp:77: warning: deleting `void*' is undefined

Смежный вопрос: Если указатель типа void* ссылается на объект с виртуальным деструктором, будет ли вызван этот деструктор при удалении этого оъекта через этот указатель?

Спасибо.
Отправлен: 12.03.2007, 20:49
Вопрос задал: Tundravarg (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: DragonTusk
Здравствуйте, Tundravarg!
VOID* это просто указатель который не несет никакой информации о размере объекта (т.е. о размере области которую нужно освабодить). Поэтому память вообще не будет освобождена, для этого нужно привести указатель к соответствующему типу.
Ответ отправил: DragonTusk (статус: 3-ий класс)
Ответ отправлен: 13.03.2007, 00:33

Отвечает: Ilkras
Здравствуйте, Tundravarg!
насколько я понимаю, для того чтобы не было предупреждения уничтожать надо объект с непустым типом. Компилятор должен автоматически выделятьосвобождать память для объекта в соответсвие с его типом. Скажите чему равно sizeof(void)?
Таким образом, определите тип объекта, а затем можете сделать кастинг к void *.

С другой стороны, можно попробовать создать класс наследующий от void. Хотя это кажется странным.
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 13.03.2007, 01:02

Отвечает: Sergey A. Wedensky
Здравствуйте, Tundravarg!

1. А что по-Вашему значит удалить указатель на void? Оператор delete удалает ОБЪЕКТЫ определенного типа по указателю на них, память под которые выделена оператором new, освобождая при этом область памяти соответствующего размера и вызывая деструктор этого типа (и для того и для другого компилятору необходимо знать, какого типа объект!).

2. А что собственно находится по адресу, на который указывает obj? Т.е. как вы создавали объект, адресуемый указателем obj? В любом случае Вам необходимо было приведение типов: что-то вроде

obj = (void*) new SomeType[N];

Тогда и удаляйте объекты того типа, КОТОРОГО СОЗДАВАЛИ, в данном случае

delete [] (SomeType*)obj;

С уважением,
Sergey Wedensky
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 13.03.2007, 09:52


Вопрос № 78.037
Уважаемые эксперты. Подскажите пожалуста сколько существует алгоритмов по нахождению максимального потока в сети? И где можно найти сопутствующие материалы?
Заранее спасибо.
Отправлен: 13.03.2007, 01:55
Вопрос задал: Николай Славко (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Николай Славко!

Вот ссылочка:
http://mathc.chat.ru/a4/articl04.htm

Материал небольшой, но достаточно исчерпывающий. Показаны как история алгоритмов, так и современное состояние.

А по этой ссылке:
http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/kgsu/din_0126.html

вы найдете пример реализации алгоритма на C++.
Ответ отправил: Терсков Сергей (статус: 6-ой класс)
Ответ отправлен: 13.03.2007, 02:42
Оценка за ответ: 5
Комментарий оценки:
Покорнейше благодарю!


Вопрос № 78.038
Здраствуйте!! у меня 2 вопроса:
Как получить указатель на Функцию???
и можно описание таких классов CEvent, CMutex,CSemaphore,CCriticalSection
Отправлен: 13.03.2007, 01:59
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, HITY!
Ссылка на функцию - это ее имя.
Тип ссылки на функцию удобнее всего описывать по typedef.
Например есть у нас функция bool Func1(int i, char * c, DWORD dw)
тогда тип ее ссылки описывается следующим образом
typedef bool (* LPFNFUNCTYPE)(int, char *, DWORD);
LPFNFUNCTYPE lpfnVar = Func1;
/* здесь LPFNFUNCTYPE переопределенный тип - ссылка на функцию, возвращающую bool, и имеющую параметры int, char*, DWORD - именно в таком порядке.
lpfnVar - переменная типа такой функции которая может хранить ссылку на функцию описываемую таким шаблоном. Таким образом, ели у нас есть еще одна функция
*/
bool MySuperPuperDuperFunction(int f, char* str, DWORD par);
/* то мы ссылку на нее также можем присвоить переменной lpfnVar
*/
lpfnVar = MySuperPuperDuperFunction;
/*Вызов функции по ссылке осуществляется как и по имени*/
int a=0;
char str[100];
DWORD dw=100;
bool res = lpfnVar(a, str, dw);

По перечисленным классам - разделы MFC на сайтах например:
progs.biz
www.firststeps.ru
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 13.03.2007, 09:56
Оценка за ответ: 5
Комментарий оценки:
Отлично объяснили, спасибо!!!!

Отвечает: Ilkras
Здравствуйте, HITY!
На функцию (с маленькой буквы - ничего такого великого) указатель получать не надо. Указателем является имя функции. То есть компилятор понимает имя функции как адрес начала ее текста.
Описания классов ищите лучше в интернете. Поисковиков много, секретного в этих классах ничего нет. Если вам лень поискать самому, то мне жаль тратить время на это.
Удачи
Ответ отправил: Ilkras (статус: 4-ый класс)
Ответ отправлен: 13.03.2007, 11:13
Оценка за ответ: 3


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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

В избранное