Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Hamster
0 / 0 / 0
Регистрация: 20.12.2008
Сообщений: 4
#1

Создание бесконечно большого буфера - C++

20.12.2008, 15:19. Просмотров 1671. Ответов 7
Метки нет (Все метки)

Подскажите как создать временный буфер для целых чисел. Размер буфера заранее не известен и изменяется во время выполнения программы. Количество элементов в нем не менее 10000 (теоретически размер "бесконечен"). Время считывания и записи в буфер имеет важное значение (чем быстрей - тем лучше).
Заранее спасибо за конструктивные предложения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2008, 15:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание бесконечно большого буфера (C++):

Высчитывание оптимального размера буфера при копировании большого файла - C++
Здравствуйте! Программа может копировать большие файлы(>4GB). Но немалую роль играет оптимизация самого процесса копирования. Думаю всем...

Максимальное быстрое создание большого файла - C++
У кого какие алгоритмы создания максимально быстро файлов, больших размеров?

Цикл бесконечно повторяется - C++
попытался решить вот эту задачку http://acm.timus.ru/problem.aspx?space=1&num=1404 но, почему-то, второй цикл бесконечно повторяется......

Программа бесконечно компилится - C++
#include <iostream> #include <locale> using namespace std; int main(int argc, char** argv) { int n; cin >>n; int A; ...

Почему цикл выполняется бесконечно? - C++
Объясните кто-нибудь, почему этот код #include <iostream> #include <cstdlib> int main() { int array1; ...

Код ждёт ввода следующей строчки - цикл повторяется бесконечно. - C++
В учебнике написано, что вот этот код #include <iostream> #include <string> using namespace std; int main() { string word; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
20.12.2008, 15:25 #2
std::stack, std::queue, std::deque. А вообще читай доку по STL containers. Ежели тебе надо на си, то сам придумывай с помощью динамической памяти.
Samurai666
0 / 0 / 0
Регистрация: 14.12.2008
Сообщений: 11
20.12.2008, 15:31 #3
Ну если заранее размер неизвестен, то логично в принципе использовать контейнеры STL. Например vector или list.
Например
C++
1
2
3
4
5
// ***
vector<int> intVector;
intVector.push_back(29);// добавление элемента в вектор
// ***
vector.clear();//очистка вектора
доступ к элементам вектора - оператор []. Этим он удобнее list. там только итераторный доступ. Возможно, использование вектора не самое быстрое решение, зато надежное и понятное.
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
20.12.2008, 16:26 #4
Если ему нужен буффер, то думаю, что ему понадобится queue.
Hamster
0 / 0 / 0
Регистрация: 20.12.2008
Сообщений: 4
20.12.2008, 20:01  [ТС] #5
спасибо за информацию. буду переваривать.
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
20.12.2008, 21:07 #6
Укурись вусмерть: http://www.cplusplus.com/reference/stl/
Hamster
0 / 0 / 0
Регистрация: 20.12.2008
Сообщений: 4
20.12.2008, 21:41  [ТС] #7
Вот собрал такой код потока в Bulder 6.0
*.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//--------------------------------------------------------------------------- 
 
#include <vcl.h> 
#pragma hdrstop 
 
#include "LMWROutThrU.h" 
//#include "stdlib.h" 
#include <new.h> 
#pragma package(smart_init) 
#include "vector.h" 
using namespace std; 
typedef vector <short> TempSmalBuf; 
TempSmalBuf *TempSmalBufPtr; 
 
//--------------------------------------------------------------------------- 
 
__fastcall OutDATA::OutDATA(bool CreateSuspended) 
        : TThread(CreateSuspended) 
{ 
} 
//--------------------------------------------------------------------------- 
void __fastcall OutDATA::Execute() 
{ 
    const  short stmpbufsize = 10000; 
    MaxCur = 0, MinCur = 4096; 
    kr = 0; // количество отсчетов 
    LARGE_INTEGER Frequency; // address of current frequency 
    LARGE_INTEGER Start; // address of Start Time 
    LARGE_INTEGER Stop; // address of Stop Time 
    LARGE_INTEGER dTime; // количество отсчетов таймера в секунде 
 
    QueryPerformanceFrequency(&Frequency); //получаем количество отсчетов таймера в одной секунде 
    dTime.QuadPart=Frequency.LowPart*Interv; //вычислим количество необходимых отсчетов таймера в одной секунде 
    Start.QuadPart = -dTime.QuadPart; 
    TempSmalBufPtr = new TempSmalBuf(stmpbufsize); 
 
    do 
    { 
 
        if (Interv != 0) 
                { 
                do 
                        { 
                        QueryPerformanceCounter(&Stop); 
                        } 
                while(Stop.QuadPart-Start.QuadPart < dTime.QuadPart); 
                QueryPerformanceCounter(&Start); //запускаем отсчет заданного времени 
                } 
 
        Result = DataBufferPtr[Chanel]; чтение данных из буфера устройства 
        if (Result < MinCur) 
                MinCur = Result;  //нахождение минимального значения результата 
        if (Result > MaxCur) 
                MaxCur = Result;  //нахождение максимального значения результата 
 
        (*TempSmalBufPtr)[kr] = Result; // перенос данных во временный буфер записи 
        KoefPrived = rkoef->GetKoef(KoefPrIndex, Result); 
        Synchronize(Out); 
        kr += 1; 
    } 
    while (( ! Terminated) && (kr < NZam)); 
   Synchronize(BufToFile); 
   Synchronize(CloseThr); 
} 
//--------------------------------------------------------------------------- 
void __fastcall OutDATA::Out() 
{ 
 
 if (KoefPrived != 0) 
                { 
                ModResEdit->Text = (Result/KoefPrived); 
                MaxModEdit->Text = (MaxCur/KoefPrived); 
                MinModEdit->Text = (MinCur/KoefPrived); 
                } 
 CountLabel->Caption = kr; 
 Application->ProcessMessages(); 
} 
//----------------------------- 
void __fastcall OutDATA::BufToFile() 
{ 
 
delete TempSmalBufPtr; 
TempSmalBufPtr = NULL; 
} 
//----------------------------- 
 
void __fastcall OutDATA::CloseThr() 
{ 
  if (StopButton->Enabled) StopButton->Click(); 
} 
//-----------------------------
*.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//--------------------------------------------------------------------------- 
 
#ifndef LMWROutThrUH 
#define LMWROutThrUH 
//--------------------------------------------------------------------------- 
#include <Classes.hpp> 
#include "TKoefPrived.h" 
#include "LMWReadU.h" 
//--------------------------------------------------------------------------- 
class OutDATA : public TThread 
{            
private: 
        void __fastcall CloseThr(void); 
        void __fastcall Out(void); 
        void __fastcall BufToFile(void); 
protected: 
        void __fastcall Execute(); 
        Smallint MaxCur, MinCur, Result; 
        unsigned long int kr;  //Счетчик циклов считывания 
        TKoefPrived *rkoef; 
        double KoefPrived; 
        
public: 
        __fastcall OutDATA(bool CreateSuspended); 
        BYTE Chanel; //для ввода канала для считывания 
        TEdit *MinEdit, *MaxEdit, //для вывода результата проверки допустимости значений 
              *ModResEdit, *MaxModEdit, *MinModEdit; //для вывода текущих значений после приведения, если выбран коэф приведения 
        TCheckBox *MinMaxCheckBox; 
        unsigned long int NZam; 
        float Interv;  //для ввода интервала опроса 
        Smallint Max, Min; // для ввода допустимых значений 
        const Smallint *DataBufferPtr; 
        TLabel *CountLabel; 
        TButton *StopButton; 
        BYTE KoefPrIndex; 
        //TSaveDialog *SaveDialog; 
}; 
//--------------------------------------------------------------------------- 
#endif
Возникла такая проблема:
при начальном размере вектора в 10000 элементов типа short - програма вылетает при работе с 18540-м элементом;
при размере в 20000 элементов - при работе с 26732-м; с одной и той же ошибкой "AccessViolation at adress 0041B17...Write of address ********" и тыкает меня носом в строку
(*TempSmalBufPtr)[kr] = Result;
Размер программы в памяти (по данным Диспетчера задач) до начала считывания данных примерно 2056кб, в момент вылета ошибки примерно 2516кб
Включение CodeGuard заставляло томозить считывание примерно после 11000 элемента (при начальном размере вектора в 10000) и выбивало программу по ошибке дебаггера в модуле borlandmm.dll о невозможности записи примерно на 13000 элементе. CodeGuard все это время молчал.
Подскажите в чем может быть проблема и что с ней можно сделать.
Hamster
0 / 0 / 0
Регистрация: 20.12.2008
Сообщений: 4
21.12.2008, 23:08  [ТС] #8
Перешел на std::deque и .push_back() и проблема решилась.
Отдельное спасибо Spo1ler за ссылку (правда, как потом оказалось, вся эта инф-ция есть во встроенной справке к билдеру, но это ж потом).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2008, 23:08
Привет! Вот еще темы с ответами:

Передача большого буфера даных - C++
Добрый день , столкнулся с такой проблемой, мне нужно передать на сервер буфер длинной допустим 6500 б делаю так: //клиент ...

Передача большого буфера через сокет - C (СИ)
Ниже приведены клиент и сервер(позаимствовал из соседней темы). Все работает, но при передаче буфера в 500000 байт сервер принимает...

2. Указать какие из заданных последовательностей будут ограниченными, бесконечно большими, бесконечно малыми - Математический анализ
Доброго времени суток! Помогите пожалуйста сдавать Через день.Заранее весьма благодарен!

Указать какие из заданных последовательностей будут ограниченными, бесконечно большими, бесконечно малыми - Математический анализ
Помогите плиззз, если не трудно выложите решение картинкой!! Заранее спасибо, добрые люди!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.12.2008, 23:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru