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

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


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

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

Выпуск № 833
от 27.08.2007, 21:35

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


Вопрос № 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];
Скажите пожалуйста в чем дело?
Отправлен: 21.08.2007, 21:34
Вопрос задал: Марченко Роберт Владимирович (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: estiGi
Здравствуйте, Марченко Роберт Владимирович !
Потому что она у вас глобальная
Глобальные переменные инициализируется автоматически до входа в main
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 21.08.2007, 21:50

Отвечает: Rockie
Здравствуйте, Марченко Роберт Владимирович !

Потомучто ваш массив объявлен как "глобальный в другом файле" (extern). А глобальные переменные инициализируются в первую очередь(нулевыми значеними).

Ссылка по теме:
"Си++. Статические массивы."
ссылка


Отредактировано : длинная ссылка.
---------
= Error00= (Профессионал)


Ответ отправил: 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-ый класс)
Ответ отправлен: 22.08.2007, 16:22

Отвечает: Леуткин Дмитрий Николаевич
Здравствуйте, Ренат !
Вот вам решение, правда простой перебор, но тоже вариант :)

Приложение:

Ответ отправил: Леуткин Дмитрий Николаевич (статус: 1-ый класс)
Ответ отправлен: 22.08.2007, 16:31

Отвечает: Rockie
Здравствуйте, Ренат !

Если посмотреть внимательно на эту формулу, то можно увидеть, что количество таких натуральных чисел ограничено:

разряды: числа:
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 приходится работать часто и проблем никогда не возникало.
Заранее благодарен за уделенное внимание. :)))))))

Вот текст

#include<vcl.h>
#include<stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused

int main(int argc, char* argv[])
{
FILE *fn,*fn1,*fn2,*fn3;
int i,j,k,m,l;
AnsiString DIR="C:\Log_f\Analiz\",Str;
TSearchRec SR;
FindFirst("D:\bav\*.*",faAnyFile,SR);
do
{
AnsiString NewName = DIR.c_str() + SR.Name;
fn=fopen(NewName.c_str(),"w");

TStringList *Lst = new TStringList;
Lst->LoadFromFile(SR.Name);

for(i=0;i<Lst->Count;i++)
{
Str=Lst->Strings[i];
k=Str.AnsiPos("tel");
m=Str.Pos("[");
l=Str.AnsiPos("]");
j=m;
for(j=m;j<l-1;j++)

{
if(!k)break;

if(Str.c_str()[j]=='F' & Str.c_str()[j+1]!='F' )
{
fprintf(fn,"%c ",Str.c_str()[j+1]);
break;
}

if(Str.c_str()[j] == 'F' & Str.c_str()[j+1]=='F')
{
fprintf(fn," ");
break;
}

if(Str.c_str()[j]!=' '&
Str.c_str()[j+1]!=' '&

Str.c_str()[j]!=']'&
Str.c_str()[j+1]!=']')

{
fprintf(fn,"%c",Str.c_str()[j+1]);
fprintf(fn,"%c",Str.c_str()[j]);
}
}

}
fclose(fn);
delete Lst;
}while(!FindNext(SR));

FindClose(SR);

//----------------------------------------------------------------------
fn2=fopen("C:\Log_f\telephons.txt","r");
char Num1[20],Num2[20];
fn=fopen("C:\Log_f\compare.txt","w");
//==================================================================================
FindFirst("C:\Lof_f\Analiz\*.txt",faAnyFile,SR);
do
{
fn1=fopen((SR.Name).c_str(),"r");
if(!fn1)break;
//--------------------------------------------
do{
bool tag=0;
fgets(Num1,20,fn1);
//-------------------------------------
do
{
//---------------------------------
fgets(Num2,20,fn2);
char *CmpNum = new char [strlen(Num2)];
strcpy(CmpNum,Num2);
CmpNum[strlen(CmpNum)-1]=0;
CmpNum[strlen(CmpNum)-2]=0;
if(strstr(CmpNum,Num1))
{
tag=1;
break;
}
//----------------------------------
delete [] CmpNum ;
}while(!feof(fn2));
if(tag==0)
{
fprintf(fn,"FILE %s %s ",(SR.Name).c_str(),Num1);
}
//-------------------------------------------
}while(!feof(fn1));
fclose(fn1);
//----------------------------------------------------
}while(!FindNext(SR));
FindClose(SR);
fclose(fn2);
fclose(fn);
return 0;
}

//---------------------------------------------------------------------------
Отправлен: 22.08.2007, 15:07
Вопрос задал: Козлов Николай Валерьевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.57 от 25.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное