Всем привет! Вопрос такой Есть прога.. и в ней одна процедура делает одну баальшую пакость.. без нее прога идет.. с ней - 6 ошибок выдает.. прога черезстрочно соединяет два файла.. процедура ставит в начала каждой строки результирующего файла ставит самое большое слово этой строки. И, чур, не шутить про морских свинок и девушек-программистов =) (:ЭланорII:)
Приветствую Вас, Эланор! Придется пошутить про морских девушек и свинок-программисток... :))) Во-первых, я не понял зачем при считывании имени файла введенное имя опять выводится на экран. Далее - при открытии файла надо указать еще и способ открытия. Вот, например: f1.open("asdf", ios::in); //открываем файл asdf для чтения f2.open("qwer", ios::out); //открываем файл qwer для записи Если этого не делать, то - ... Лучше это сделать. Не помешает. [Вот сейчас посмотрел внимательней, и заметил, что это однонаправленные файловые потоки, так что сорри... Но я предпочитаю fstream, в котором можно указать тип доступа явно.] Когда пишешь while(p), где p - это у тебя указатель, то p будет равен NULL ТОЛЬКО в том случае, если str==NULL! А проверять на конец строки надо так: while (*p!=NULL). А
вот такую конструкцию я просто не понял: *pw++=*p; . Может, оно и правильно, только смысл от меня далеко и я не понял что это такое... Лучше разбить на отдельные действия. Тогда и ты поймешь. :) Причем, помни о приоритете операций! Выполнять delete str; нельзя ни в коем случае! Потому что в качестве параметра может быть передана и просто строка и результат такой фигни понять тоже сложно... Заведи себе новый указатель! В строке if (argc<4) итд - вообще полный финиш! Ты создаешь для каждого указателя 1 БАЙТ! А удалять их Пушкин будет? :) Причем, эти указатели нельзя так использовать, потому как по условию число параметов меньше 4, и поэтому этих указателей вроде как и не существует! Опят совет - заведи нормальные указатели или вообще строки. Вообще, небольшая путаница с именами параметров. Это не ошибка, а так, замечание... обычно
первый параметр обозначают argc, то есть arguments counter, а второй - *argv[], то есть arguments variables. Может, ты что-то другое имела в виду? :) Строка while (!open_fls(...)) - это вообще верх садизма! :))) Я просто переведу на нормальный язык: "Пока файлы не открываются, ЗАКРЫВАЙ ИХ!!!" :-)))) Бедная DOS не ожидает такой подлости и понимает все буквально... Проверку надо делать после попытки открытия каждого файла, и там уже закрывать все открытые предыдущие в случае ошибки. А что за странная функция insert_big_word, которую ты вызываешь с тремя параметрами, когда она описана только с одним? К слову, там что-то странно длинный комментарий - ты забыла закрыть его где-то?? Короче говоря... Я бы на твоем месте просто взял и переписал все заново, но четко понимая - где и что именно выполняется. Не падай духом - такие ошибки были
у всех.
Ответ отправлен: 08.12.2002, 00:30 Отправитель: baldr
Вопрос № 416
Здравия желаю, товарищи эксперты! Меркантильный вопрос: нет ли у кого из вас наработок(типа библиотек) для работы с DirectDraw и Direct3D в Visual C++ 6.0? А то и блин книжка есть("Программирование трёхмерной графики в Win95", а компакт, который должен был прилагаться, естественно отсутствует. В общем, буду благодарен. Мыло моё koolkhel@mail.ru, ссылки на сайты лучше не давать. Bye.
Добрый день, Bitterman! Вы хочете файлов? Их есть у меня! netlib@mail.ru Вообще-то для изучения DirectDraw и Direct3D лучше взять книги Стена Трухильо - "Программирование графики с использованием Direct3D" и "Быстродействующая графика для Windows средствами DirectDraw" Томпсон в книге описываент не DirectX, а свою библиотеку. Ответ отправлен: 09.12.2002, 12:21 Отправитель: Andrew Vext
Вопрос № 418
Est li sposob programno opredelit videlena li pamyat dinamicheski, k primeru tak; Nadiozhna li takaya proverka? pozhaluysta esli mozhno otvetit mne na e-mail: felistovichs@rambler.ru
Здравствуйте, Sasha! Если это под дос, то если память не выделена возвращается NULL. А в VC выкидывается исключение.
Ответ отправлен: 08.12.2002, 18:00 Отправитель: Dzik Отвечает baldr
Приветствую Вас, Sasha! Я Вообще что-то не понял - что такое ты написал в приложении.. Вероятно, ты сравниваешь сегмент полученной памяти с чем-то еще?? :-// В общем, я делаю так... При создании указателя присваиваю ему сразу же NULL. И при удалении выделенной памяти (даже в деструкторах классов!) тоже присваиваю NULL. А затем просто в любом месте программы смотришь - если указатель равен NULL - значит память не выделена.
Ответ отправлен: 09.12.2002, 00:04 Отправитель: baldr Отвечает Jadd
Приветствую Вас, Sasha! Нет, конечно, так не надо проверять. Лучше включить этот блок в блок try и, если возникнут траблы выделением памяти, то возникнет исключение. Но память для процесса выделяется достаточно, чтобы ее нехватило на строку из 10-ти символов. Ответ отправлен: 09.12.2002, 02:40 Отправитель: Jadd Отвечает Avl2k
Доброе время суток, Sasha! По умолчанию (если не установлен свой обработчик)operator new возвращает NULL, если выделение памяти не прошло. Поэтому можно не мудрить, а просто проверить возвращаемое значение на 0 - переносимо и абсолютно надежно. С уважением, Avl2k. Ответ отправлен: 09.12.2002, 13:53 Отправитель: Avl2k
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.