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