Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Найти в массиве последовательность символов  (Прочитано 10159 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FanatWin
Участник

ru
Offline Offline

WWW
« : 10-06-2009 02:18 » 

Доброе утро…
Вот, хотел бы поинтересоваться, как можно найти в массиве несколько разных символов идущие друг за другом… что-то у меня не получается… когда символ первый есть в бинарном файле всё отлично (получается), а когда нужно найти несколько, код этого не делает…
Вот здесь код, который используй…

Код:
int fileSize;
void __fastcall TSDIAppForm::FileOpen1Execute(TObject *Sender)
{
  FILE *f
  f = loadNewFile("rb");
byte *trace = new byte[fileSize];
for (int i=0; i<fileSize;i++)
  fread(&trace[i],sizeof(byte),1,f);
for (count = 0;count < fileSize; count++)
         {

                if ( trace[count] == 0x72)
                {
                  MessageDlg("Хиз..Нашёл символ." ,mtError, TMsgDlgButtons() << mbCancel, 0); //Здесь находит
                 }


                if ( trace[count] == 0x72
                && trace[count] == 0x72
                && trace[count] == 0x20
                && trace[count] == 0x20)
                {
// Вот это не находит…
                  MessageDlg("Хиз.. Нашёл символы." ,mtError, TMsgDlgButtons() << mbCancel, 0);

               }

          }

}


FILE *loadNewFile(const char *mode)
{
FILE * file;
if(SDIAppForm->OpenDialog->Execute() && !FileExists(SDIAppForm->OpenDialog->FileName))
{
  throw Exception("Не могу открыть файл...\nСкорей всего в этой директории файла нет...\nИли он не был выбран.");
}
    stat(SDIAppForm->OpenDialog->FileName.c_str(), &statbuf);
    file = fopen(SDIAppForm->OpenDialog->FileName.c_str(), mode);
    fileSize = statbuf.st_size;
  return file;
}
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 10-06-2009 03:29 » 

а так если
Код:
for (count = 0;count < fileSize; count++)
{

...
....
.....

  if(count+3<fileSize)
 {
   if (
           trace[count] == 0x72
               && trace[count+1] == 0x72
                && trace[count+2] == 0x20
                && trace[count+3] == 0x20)
                {
// Теперь находит
                  MessageDlg("Хиз.. Нашёл символы." ,mtError, TMsgDlgButtons() << mbCancel, 0);

               }
   }

...
....
.....


}
Записан

FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #2 : 10-06-2009 11:03 » 

Да!!! Гм… я тоже пробовал циферки после «count» ставить, но немного не в той последовательности…
Огромное спасибо помогло… Улыбаюсь
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 10-06-2009 11:39 » 

я тоже пробовал циферки после «count» ставить

ты хоть понимаешь что это значит?
« Последнее редактирование: 10-06-2009 11:41 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #4 : 11-06-2009 03:45 » 

ты хоть понимаешь что это значит?
Ну, это ещё не значит, что я совсем потерян… Не судите строго, я только начинаю разбираться в программирование...
Да конечно я понимаю, что это переменная, и пре увеличение её, идет пересчет массива… Улыбаюсь

Кстати о массивах в тему… тут ещё проблемка нарисовалась…
Как правильно, декларировать массив.
Вот код, он тот же самый, что дан, сверху, только немного урезан:

Код:
extern byte trace[];

void __fastcall TSDIAppForm::FileOpen1Execute(TObject *Sender)
{
….
byte *trace = new byte[fileSize];
for (int i=0; i<fileSize;i++)
fread(&trace[i],sizeof(byte),1,f);
….
}

void __fastcall TSDIAppForm::FileSave1Execute(TObject *Sender)
{
byte effect =  trace[508138]; // Вот тут, я, не могу уже получить число (байт) из массива
}

Если делаю (объявляю) так:
Код:
static byte trace[1];
То его, как-то не правильно, видят остальные функции, т.е. они (функции) не видят что у меня в массиве…
А если так:
Код:
extern byte trace[];
то вылетает ошибка:
[Linker Error] Unresolved external '_trace' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\GOD\SDIMAIN.OBJ

пожалуйста… объясните, что не так… Здесь была моя ладья... Не понял
« Последнее редактирование: 11-06-2009 03:49 от FanatWin » Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 11-06-2009 06:36 » 

Оба неверные.
1. Определись, постоянный у тебя размер массива, или в зависимости от чего-то может изменяться во время выполнения программы.
2. Если массив статический (неизменяемого размера), определяй вне функции, но без extern и с указанным размером (extern нужен, если у тебя массив объявлен как полагается в другом модуле компиляции - с инициализацией или явно заданным размером).
3. Если массив произвольного размера, требуется выделять под него память с помощью new. Тогда определись, где ты выделяешь память, и где освобождаешь. А в глобальной области видимости объявляй только указатель на память, а не массив.
Записан
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #6 : 11-06-2009 10:53 » 

Оба неверные.
1. Определись, постоянный у тебя размер массива, или в зависимости от чего-то может изменяться во время выполнения программы.
2. Если массив статический (неизменяемого размера), определяй вне функции, но без extern и с указанным размером (extern нужен, если у тебя массив объявлен как полагается в другом модуле компиляции - с инициализацией или явно заданным размером).
3. Если массив произвольного размера, требуется выделять под него память с помощью new. Тогда определись, где ты выделяешь память, и где освобождаешь. А в глобальной области видимости объявляй только указатель на память, а не массив.

Гм… что-то у меня совсем туго, с этими массивами.
Вот как я рассуждаю:
В этот массив записывается бинарный файл, в другой функции массив изменяется не в длину, а в содержании, и есть ещё функция, которая должна сохранять этот массив в файл.
 
Массив должен изменятся, в других функциях программы, и так как у него образуется лишний знак в конце, “0\”, при сохранении массива должна изменится его длина,… хотя при сохранении можно сохранить минус один знак…

Блин… только все эти рассуждения, не дают мне ровным счётом не чего… ну, не знаю, я  как объявить сам массив… Здесь была моя ладья...
Записан

FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #7 : 11-06-2009 11:11 » 

Объявил так:
Код:
byte trace(byte *);
но как теперь добраться до массива из другой функции не знаю… А черт его знает...
Как вообще с ними работать, я в отчаяние… Я шокирован!
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 11-06-2009 11:27 » 

Давай так:
1. Кто или что определяет размер массива? Он же где-то выделяется, значит, нужно знать, где и какого размера (или где он может изменять свой размер).
2. Каким элементам программы вообще нужен массив?

Из этих двух вещей следуют другие 2 вопроса, которые и дадут ответ, где выделять массив и где освобождать:
1. В какой момент массив уже должен существовать
2. В какой момент массив перестал быть нужен и его можно уничтожить (например, при завершении вычислений, или при завершении всей программы).

А динамический массив можно создать и использовать хотя бы так:
Код:
byte *trace = 0;


// мы должны где-то вызвать функцию для освобождения памяти при завершении работы
void clean_trace(){
    delete[] trace;
    trace = 0;
}

void __fastcall TSDIAppForm::FileOpen1Execute(TObject *Sender)
{
….
    // если это не первый вызов, удаляем выделенную ранее память
    clean_trace();
    trace = new byte[fileSize]; // просто присваиваем значение
    for (int i=0; i<fileSize;i++)
        fread(&trace[i],sizeof(byte),1,f);
….
}

void __fastcall TSDIAppForm::FileSave1Execute(TObject *Sender)
{
    byte effect =  trace[508138]; // получаем 508139-й элемент массива
}
Записан
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #9 : 11-06-2009 16:13 » 

Вад, Огромное спасибо это то, что нужно… динамический массив и нужен… Да-да именно так, я и хотел, чтоб он работал…
Еще раз огромное спасибо… Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines