Вопрос № 99193: Не могу понять почему сделав brekpoint в самом начале функции WinMain переменная
UINT font_Texture[2];
уже имеет значение, хотя обьявлена она следующим образом
UINT font_Texture[2];
и вот так в заголовочном файле
extern UINT fon...Вопрос № 99246: Здравствуйте!
Объясните почему
FILE* in;
in=fopen("c:1.txt","r+");
fgetc(in)
fputc(65,in);//почему символ не записывается если до fputc идет fgetc
fclose(in);
почему то если fputс поместить после ...Вопрос № 99271: Помогите пожалуйста. Никак не пойму как сделать эту прогу:
Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234, 5789)....Вопрос № 99279: Господа,подскажите,пожалуйста.Простенькая программка должна обрабатавать файлы с расширением типа
12_13_14(некий лог-файл),поэтому задается параметр *.* при этом файлы не видятся,в SR ничего не копируется и, соответственно,
возникает ошибка...
Вопрос № 99.193
Не могу понять почему сделав brekpoint в самом начале функции WinMain переменная
UINT font_Texture[2];
уже имеет значение, хотя обьявлена она следующим образом
UINT font_Texture[2];
и вот так в заголовочном файле
extern UINT font_Texture[2];
Скажите пожалуйста в чем дело?
Отвечает: estiGi
Здравствуйте, Марченко Роберт Владимирович !
Потому что она у вас глобальная
Глобальные переменные инициализируется автоматически до входа в main
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 21.08.2007, 21:50
Отвечает: Rockie
Здравствуйте, Марченко Роберт Владимирович !
Потомучто ваш массив объявлен как "глобальный в другом файле" (extern). А глобальные переменные инициализируются в первую очередь(нулевыми значеними).
Ответ отправил: Rockie (статус: 2-ой класс)
Ответ отправлен: 21.08.2007, 22:35
Отвечает: Aristos
Здравствуйте, Марченко Роберт Владимирович !
При объявлении переменной под неё выделается память. Соответственно значением переменной будет являться "мусор" лежащий в памяти на момент выделения. Такая переменная называется неинициализированной, то есть имеющей неопределенное, случайное значение. Неинициализированные переменные использовать не рекомендуется.
Проинициализировать при создании переменную можно так:
UINT texture = 0;
Или, в случае массива, так:
UINT textures[2] = {0, 0};
Если массив большой, то можно сделать в 2 этапа:
UINT manytextures[50]; // создали
memset(manytextures, 0, sizeof(UINT)*50); // "забили" нулями
В последнем случае указывается размер массива не в элементах, а в байтах.
Ответ отправил: Aristos (статус: 3-ий класс)
Ответ отправлен: 22.08.2007, 00:01
Отвечает: Maxim V.G.
Здравствуйте, Марченко Роберт Владимирович !
Как уже было сказано Ваша переменная является глобальной и содержит в себе "мусор" размещённый в памяти до инициализации массива. Такие (неиницилизированные) переменнные использовать КРАЙНЕ не рекомендуется. Потому, что использование таких переменных приведёт либо к некорректной работе приложения, либо приложение просто "вылетит" с ошибкой. Кроме предложенных способов инициализации, в вашем случае, можно использовать ещё и следующий:
UINT manytextures[50]; // создали
//VOID ZeroMemory(
// PVOID Destination, // address of block to fill with zeros
// DWORD Length // size, in bytes, of block to fill with zeros
// );
ZeroMemory(manytextures, sizeof(UINT)*50); // Функция WinApi для обнуления
участка памяти.
Можно так:
VOID FillMemory (
PVOID Destination, // pointer to block to fill
DWORD Length, // size, in bytes, of block to fill
BYTE Fill // the byte value with which to fill
);
FillMemory(manytextures, sizeof(UINT)*50, '0'); // Массив будет заполнен значением '0'
--------- Жить вредно - от неё умирают
Ответ отправил: Maxim V.G. (статус: 3-ий класс)
Ответ отправлен: 22.08.2007, 11:55
Вопрос № 99.246
Здравствуйте!
Объясните почему
FILE* in;
in=fopen("c:1.txt","r+");
fgetc(in)
fputc(65,in);//почему символ не записывается если до fputc идет fgetc
fclose(in);
почему то если fputс поместить после fgetc то символ не хочет запbcsdfnmcz
Отправлен: 22.08.2007, 11:39
Вопрос задал: Tatarin (статус: 2-ой класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Maxim V.G.
Здравствуйте, Tatarin!
В вашем примере есть несколько ошибок:
1)
<< in=fopen("c:1.txt","r+"); - вероятнее всего вернёт ошибку, так как ошибочно указан путь. Надо примерно так "с:\1.txt"
2)
При открытии файла рекомендуется проверять открылся ли файл вообще. Это делается так: if ((in=fopen("c:\1.txt","r+"))!= NULL)
3)
В вашем случае символ не записывается в связи с тем что файл открыт в режиме обновления (чтение и запись). Таким образом для записи символа надо перейти в конец файла. Делается это так: fseek(in, 0L, SEEK_END);
Исправленный вариант смотрите в приложении!!!
Удачи.
Приложение:
--------- Жить вредно - от неё умирают
Ответ отправил: Maxim V.G. (статус: 3-ий класс)
Ответ отправлен: 22.08.2007, 12:21
Отвечает: Rockie
Здравствуйте, Tatarin!
Для записи в файл необходимо открывать его в режиме записи ("w")
В вашем примере функция fgetc вообще не будет работать, правильный синтаксис можно найти в поиске или в msdn. Вы можете посмотреть примеры работы функций fgetc и fputc по этим ссылкам:
http://www.cplusplus.com/reference/clibrary/cstdio/fputc.html
http://www.cplusplus.com/reference/clibrary/cstdio/fgetc.html
Также не забывайте проверять корректность открытия файла(код в приложении)
Приложение:
Ответ отправил: Rockie (статус: 2-ой класс)
Ответ отправлен: 22.08.2007, 12:29
Отвечает: Aristos
Здравствуйте, Tatarin!
Тип доступа "r+" позволяет записывать и читать из файла. Но между операциями чтения и записи (закончили читать, начали записывать и наоброт), следует вызвать функции fflush, fsetpos, fseek или rewind. Это связано с тем, что работа с файлом идет через буфер, и надо синхронизировать содержимое файла и буфера.
Ваш код можно модифицировать следующим образом (см. приложение).
Приложение:
Ответ отправил: Aristos (статус: 3-ий класс)
Ответ отправлен: 22.08.2007, 13:20
Вопрос № 99.271
Помогите пожалуйста. Никак не пойму как сделать эту прогу:
Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234, 5789).
Отправлен: 22.08.2007, 14:09
Вопрос задал: Ренат (статус: Посетитель)
Всего ответов: 5 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Delph
Здравствуйте, Ренат !
Вам нужно использовать рекурсию. Задача изначально кажется сложной, но решение оказалось довольно коротким (см. приложение).
Я назвал проект Naturalе. Откомпилировав его при помощи Visual C++ 6, получил запускаемую программу Naturale.exe. Вывод программы на экран не умещается, поэтому я запустил её (в командной строке) так:
Naturale.exe > Naturale.txt
Такой запуск перенаправил вывод программы в файл Naturale.txt, который я затем просмотрел (можно использовать блокнот, если у Вас не найдётся ничего более удобного).
Программа вроде-бы достаточно проста для понимания, но если захотите что-то уточнить, спрашивайте.
Приложение:
--------- Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: 7-ой класс)
Ответ отправлен: 22.08.2007, 16:19
Отвечает: Новиков Андрей Викторович
Здравствуйте, Ренат !
Мой Вам совет просто порезать n-значное число на цифры и каждая следующая по старшенству разряда должна меньше на 1.
Наиболее простой вариант использовать рекурсию.
Если посмотреть внимательно на эту формулу, то можно увидеть, что количество таких натуральных чисел ограничено:
разряды: числа:
1 нет
2 12 23 34 45 56 67 78 89 - 8 чисел
3 123 234 345 456 567 678 789 - 7 чисел
..
9 123456789 - 1 число
10 таких чисел опять нет
Так что исходя из этой формулы, можно реализовать пррограмму, которая будет в зависимости от разрядности числа выводить 10-n n-разрядных чисел. Код в приложении
Приложение:
Ответ отправил: Rockie (статус: 2-ой класс)
Ответ отправлен: 22.08.2007, 16:53
Отвечает: Терсков Сергей
Здравствуйте, Ренат !
Ваша задача в общем случае решается простым поиском подстрок в строке упорядоченных символов. В моем примере это цифры десятиричной системы. Можно, например, расширить ее до шестнадцатиричной (123456789ABCDEF). Задача решается безо всяких рекурсий и замысловатых вычислений...
Приложение:
Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 23.08.2007, 03:44
Вопрос № 99.279
Господа,подскажите,пожалуйста.Простенькая программка должна обрабатавать файлы с расширением типа
12_13_14(некий лог-файл),поэтому задается параметр *.* при этом файлы не видятся,в SR ничего не копируется и, соответственно,
возникает ошибка.Как только файлам меняется расширение на тупо txt и задается параметр поиска *.txt,все прекрасно
работает.Если убрать обработку файлов директории о обрабатывать один файл с первоначальным значением расширения, т.е.
в Lst->LoadFromFile(SR.Name) подставляю просто имя файла,то все работает без проблем.
А во второй части поги вообще игнорируется C:\Lof_f\Analiz\,а обрабатывает все txt файлы,
находящиеся в C:\Lof_f\, хотя у директории Analiz нет никаких особых атрибутов типа скрытая...
Странно, со структурой TSearchRec приходится работать часто и проблем никогда не возникало.
Заранее благодарен за уделенное внимание. :)))))))
Отвечает: Sov
Здравствуйте, Козлов Николай Валерьевич!
1.Вы ищите файлы с атрибутом faAnyFile и функции FindFirst/FindNext найдут не только простые файлы, но и каталоги, в частности каталоги
.
..
Соответсвенно имя файла будет сформировано неправильно
AnsiString NewName = DIR.c_str() + SR.Name;
Лучше вторым параметром функции FindFirst передавать 0 (обычные файлы)
2.FindFirst("C:\Lof_f\Analiz\*.txt",faAnyFile,SR); может это опечатка? C:\Log_f\...?
3.fn1=fopen((SR.Name).c_str(),"r");
Поле Name содержит только имя файла, без пути. Если ваша программа расположена в каталоге
C:\Lof(g)_f\Analiz\ ошибки не будет, иначе открыть файл не получится
Ответ отправил: Sov (статус: 6-ой класс)
Ответ отправлен: 22.08.2007, 17:06