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

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


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

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

Выпуск № 691
от 25.03.2007, 07:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 462, Экспертов: 57
В номере:Вопросов: 4, Ответов: 7


Вопрос № 78944: Здраствуйте, у меня такой вопрос возник..вот код внизу.Програма мне выводит адресс(я так понимаю что это адресс содержащийся в указателе)как мне сделать что бы на консоль вывести содержимое текстового файла?Спасибо....
Вопрос № 78954: Уважаемые эксперты, подскажите как найти эйлеровый путь. Облазил везде, нашел несколько вариантов, но все были нерабочие. Написал сам, но мой алгоритм - не подходит, так как он работает методом перебора. Желательно на с++ или ява. Заране...
Вопрос № 78996: Здравствуйте, уважаемые эксперты! Имеется ну совсем уж невразумелая ситуация. И, вроде бы, С/С++ нормально знаю, но никак не могу понять, почему отличаются работоспособностью следующие программы(см. в Приложении). Вторая программа от...
Вопрос № 79019: Уважаемые эксперты, подскажите, как в C++ Builder сделать, чтобы при наведении мыши на рисунок(TImage) он на другой изменялся? Как сделать рядом с кнопкой стрелку с ниспадающим меню, как например в IE кнопка Back? Спасибо!...

Вопрос № 78.944
Здраствуйте, у меня такой вопрос возник..вот код внизу.Програма мне выводит адресс(я так понимаю что это адресс содержащийся в указателе)как мне сделать что бы на консоль вывести содержимое текстового файла?Спасибо.

Приложение:

Отправлен: 19.03.2007, 15:19
Вопрос задал: Стаховский Валерий Генриковичь (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Стаховский Валерий Генриковичь!

Если используете fopen, то перед тем как выводить что либо, нужно сначала считать информацию из файла с помощью fread() или fgets() или fgetc() и так далее.

С другой стороны раз уж вы используете стандартный вывод C++, то почему бы не использовать стандартный файловый ввод/вывод C++ через fstream.h?

вот пример номер 17 посмотрите
http://www.firststeps.ru/mfc/detail/r.php
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 19.03.2007, 16:14
Оценка за ответ: 5


Вопрос № 78.954
Уважаемые эксперты,
подскажите как найти эйлеровый путь. Облазил везде, нашел несколько вариантов, но все были нерабочие. Написал сам, но мой алгоритм - не подходит, так как он работает методом перебора.
Желательно на с++ или ява.
Заранее спасибо
Отправлен: 19.03.2007, 16:49
Вопрос задал: Sidukas (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Рязанов Максим Валерьевич
Здравствуйте, Sidukas!
Есть хорошая книга, в которой я в свое время нашел реализацию этого алгоритма на C++. Ее название "Фундаментальные алгоритмы на C++. Часть 5" автор: Роберт Седжвик. Найти ее можно на сайте http://bukinist.info/down/o-59.html.
Удачи.
Ответ отправил: Рязанов Максим Валерьевич (статус: 2-ой класс)
Ответ отправлен: 19.03.2007, 20:09
Оценка за ответ: 5
Комментарий оценки:
спасибо огромное


Вопрос № 78.996
Здравствуйте, уважаемые эксперты!
Имеется ну совсем уж невразумелая ситуация.
И, вроде бы, С/С++ нормально знаю, но никак не могу понять,
почему отличаются работоспособностью следующие программы(см. в Приложении).
Вторая программа отличается от первой лишь строкой
char* buf2=(char*)malloc(1);
которая, по идее, не играет никакой роли (и всё же из-за неё она не работает, в отличае от первой).
В чём же тут секрет?

Приложение:

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

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

ух..
результаты работы обоих программ не опрелелены. в любом случаем может вылететь.

1. например в realloc у вас должен возвращаться указатель на новый выделеный блок памяти, но вы его теряете тем неменее. как минимум
buf1 = realloc(buf1,strlen(buf1)+1);
должно быть
2. если у вас первый символ не равен или концу файла поведение тоже не определено. в этой же строчке.
пошагово
char* buf1=(char*)malloc(1);
выделяем один байт. там сейчас находится мусор. может быть 'если не зайдется в условие
if(c==' '||eof(file1))
то в строчке
realloc(buf1,strlen(buf1)+1);
strlen() вернет произвольное значение.

3. в prog2 вы так и не делаете free(buf2);

и так далее.. может еще что есть.
это если не делать замечаний о общем способе решения проблемы Ж:-)
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 19.03.2007, 22:48

Отвечает: Ilkras
Здравствуйте, VSP!
не надо так писать, нехорошо это. выделять один байт это крайне неэффективно, а уж писать в байт следующий за выделенным - просто баг. Когда вы аллокируете подряд два буфере по одному байту, то скорее всего вы получаете эти буфера стоящими один за другим, то есть вы выделяете буфер в два байта. Стало быть, когда вы пишете "0" в следующий байт, то вам есть куда писать. Когда же вы выделяете только один буфер в один байт, то запись нуля - это запись в чужую память. Вполне вероятно, что это и есть причина падения программы.
Память лучше выделять большими кусками, так, чтоб realloc не вызывался или вызывался считанные разы. Каждое обращение с функциям выделения памяти может занять много времени, стало быть поведение вашей программы становится менее предсказуемым.
Ответ отправил: Ilkras (статус: 5-ый класс)
Ответ отправлен: 19.03.2007, 23:40

Отвечает: Evkwarrior
Здравствуйте, VSP!
Да, просто чудеса!!!:-)
Человек, "Нормально" знающий язык, не стал бы выделять буфер размером в 1 байт!!! Для хранения 1-байтовой строки необходимо как минимум 2 байта!
А то, что вторая функция неправильно работает, это просто случайность. Они обе неправильно работают.

1) realloc (buf1,strlen(buf1)+1) - неправильное использование ф-ции.
buf1 = realloc (buf1,strlen(buf1)+1) - правильное. Ф-ция возвращает указатель на заново размещенный массив, а первый параметр - указатель на предыдущий блок.

2) Попробуем проанализировать работу ф-ции, начиная с первого прохода цикла:
if(c==' '||eof(file1)) - это условие, скорее всего, не выполнится, и мы переходим к инструкции realloc (buf1,strlen(buf1)+1). Помимо ошибки 1), здесь следующая ошибка: чему равен strlen(buf1)? Думаете, что единице? С чего бы? А может, 45495 или 874? Неизвестно, и не будет известно, раз под массив отводится 1 байт.
Ф-ция strlen () ищет символ 'x0', и только тогда возращает. А buf1 [1] не равен этому символу и вообще не определен, так как под массив отведен 1 байт.

В общем, критиковать тут можно до потери пульса, а проще представить свой вариант:

Приложение:

---------
всё, что тебя не убъёт, сделает тебя сильнее

Ответ отправил: Evkwarrior (статус: 1-ый класс)
Ответ отправлен: 20.03.2007, 16:56


Вопрос № 79.019
Уважаемые эксперты, подскажите, как в C++ Builder сделать, чтобы при наведении мыши на рисунок(TImage) он на другой изменялся?

Как сделать рядом с кнопкой стрелку с ниспадающим меню, как например в IE кнопка Back?

Спасибо!
Отправлен: 20.03.2007, 03:39
Вопрос задал: Azrr (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Igor_
Здравствуйте, Azrr!

Можно отработать это в событии onMouseMove компонента TImage.
Ответ отправил: Igor_ (статус: 1-ый класс)
Ответ отправлен: 20.03.2007, 10:16
Оценка за ответ: 5
Комментарий оценки:
Это немножко не то, что я имел ввиду, но всё равно спасибо, наверно простоя некоректно поставил вопрос...

Отвечает: Unreal2004
Здравствуйте, Azrr!
На вкладке интернет есть компонент TCppWebBrowser. У него есть свойство Navigate и много других полезных свойств.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
CppWebBrowser1->Navigate(WideString(Edit1->Text).c_bstr());
}
Ответ отправил: Unreal2004 (статус: 1-ый класс)
Ответ отправлен: 20.03.2007, 23:13
Оценка за ответ: 5
Комментарий оценки:
Спасибо за пример, сразу смог разобраться.


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

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

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

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

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

В избранное