Вопрос № 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* ссылается на объект с виртуальным деструктором, будет ли вызван этот деструктор при удалении этого оъекта через этот указатель?
Спасибо.
Отправлен: 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
Уважаемые эксперты. Подскажите пожалуста сколько существует алгоритмов по нахождению максимального потока в сети? И где можно найти сопутствующие материалы?
Заранее спасибо.
Отвечает: Терсков Сергей
Здравствуйте, Николай Славко!
Вот ссылочка:
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