Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатель на 400 000 000 элементов???

8.3K
02 октября 2006 года
1000@
29 / / 31.08.2005
 
Код:
nProjTotal=20000;
float *AA_=new float[nProjTotal*nProjTotal];

Говорит об ошибке!!! Оперативки 3 Гб.
Я думаю, что это связано с тем, что не хватает памяти, под указатель ... если ли тип "long указатель"??????
Страницы:
4
02 октября 2006 года
mike
3.7K / / 01.10.2002
[QUOTE=1000@]
 
Код:
nProjTotal=20000;
float *AA_=new float[nProjTotal*nProjTotal];

Говорит об ошибке!!! Оперативки 3 Гб.
Я думаю, что это связано с тем, что не хватает памяти, под указатель ... если ли тип "long указатель"??????[/QUOTE]
Боже мой, куда мир картится. Какой размер у float?? Ты пытаешься выделить больше чем три гига.

В таких задачах используют псевдо массивы - где память выделяется только под нужные элементы массива.
8.3K
02 октября 2006 года
1000@
29 / / 31.08.2005
у float 4байта 400 000 000*4 байта =1,6 Гб. Еще вопросы есть????????77
Цитата:
В таких задачах используют псевдо массивы - где память выделяется только под нужные элементы массива


Мне все нужны!!!!

240
02 октября 2006 года
aks
2.5K / / 14.07.2006
В винде в 32-разрядном приложении можешь выделить максимум 3гб, ито после дополнительных телодвижений. А максимально адрессовать соответствено можно 4 гб. Последний гб система резервирует под себя. Указатель соответственно 32-разрядный, безо всяких Long.
Не понятно при чем тут указатель и ошибка?
4
02 октября 2006 года
mike
3.7K / / 01.10.2002
А ты уверен что под каждые float выделяется четыре байта ?
Сделай сначала sizeof(float) а потом sizeof(float[1000]) и сравни.

Да и вообще выделение памяти под Windows мало зависит от количества оперативки.

Используй псевдо массивы!!!!
8.3K
02 октября 2006 года
1000@
29 / / 31.08.2005
[QUOTE=mike]
Используй псевдо массивы!!!![/QUOTE]
У меня массив общего вида (в нем даже 0 нет).
8.3K
02 октября 2006 года
1000@
29 / / 31.08.2005
[QUOTE=mike]А ты уверен что под каждые float выделяется четыре байта ?
Сделай сначала sizeof(float) а потом sizeof(float[1000]) и сравни.
[/QUOTE]
Да, вообще-то не сильно отличается....
309
02 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Когда требуется создать элемент с до...я (очень много) элементов, придётся сделать финт ушами :D. Так как сама Windows имеет ограничения по размеру доступной одной программе памяти, то использование системного файла подкачки не поможет. Придётся делать свой алгоритм подкачки.

Вот примерное объявление класса мегамассива.
Код:
class TсMega_Array
{
private:[INDENT]bool _fChanged; // Флаг наличия изменения текущей страницы
float *_fPage; // Указатель на текущую страницу массива в ОЗУ
int _fSize; // Размер страницы файла подкачки (в байтах или элементах
__int64 _fCurrent; // Номер текущей страницы
_int64 _fCount; // размер массива (64-х разрядное число :D )
AnsiString _fFile_Name; Имя файла подкачки
int _fFile; // Объект открытого файла подкачки

bool Find_Page (__int64 MegaIndex, __int64 &PageNumber, int &PageIndex); // Определение номера страницы и элемента страницы для указанного элемента массива
void Swap_Pages (__int64 New_Page); // Запись текущей страницы и чтение другой
[/INDENT]
public:[INDENT]float& operator[] (__int64 Index); // Изменяемая операция индексации
float operator[] (__int64 Index) const; // Константная операция индексации
[/INDENT]};


Конкретную реализацию чтения/записи в файл попробуйте придумать сами ;)

Для большей оптимальности программы можно вместо одной страницы использовать несколько страниц - список, в котором при загрузке новой страницы будет сбрасываться страница, к которой не обращались дольше всех. Это сделать сложнее - но дерзайте
398
02 октября 2006 года
Alexandoros
630 / / 21.10.2005
Возможно в куче нету такого длинного непрерывного блока. Попробуй HeapAlloc и скажи ошибку.

Дальше покопай в сторону HeapCreate и VirtualAlloc .
350
03 октября 2006 года
cheburator
589 / / 01.06.2006
Почитай про Address Windowing Extensions:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/address_windowing_extensions.asp
309
05 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=cheburator]Почитай про Address Windowing Extensions:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/address_windowing_extensions.asp[/QUOTE]
Бесполезно - больше определённого предела система выделить не сможет никак. Только "ручками", с собственным алгоритмом работы с жёстким диском.
240
05 октября 2006 года
aks
2.5K / / 14.07.2006
Полезно, про предел было написанно выше =)
В винде - это 2 ГБ, при наличии определенного ключа 3гб. Почему думаю объяснять не надо?
309
05 октября 2006 года
el scorpio
1.1K / / 19.09.2006
А ещё больше памяти можно выделить?
Это я к тому, что если программа требует 3 ГБ ОЗУ, то она точно также может требовать и 5 ГБ :D. Так что лучше сразу писать свой код свопирования, не зависимый от настроек ОС :)
351
06 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=1000@]
 
Код:
nProjTotal=20000;
float *AA_=new float[nProjTotal*nProjTotal];

Говорит об ошибке!!! Оперативки 3 Гб.
Я думаю, что это связано с тем, что не хватает памяти, под указатель ... если ли тип "long указатель"??????[/QUOTE]
а не проще ли хранить эти данные в файле и написать класс возращающий необходимое значение из него при необходимости ?

class Data
{
public:

float Get( unsigned int number ); // в этой функции осуществляеться выборка из файла.
};
240
06 октября 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=el scorpio]А ещё больше памяти можно выделить?
Это я к тому, что если программа требует 3 ГБ ОЗУ, то она точно также может требовать и 5 ГБ :D. Так что лучше сразу писать свой код свопирования, не зависимый от настроек ОС :)[/QUOTE]
Есть просто вычислительные задачи, где требуется оперативный доступ ко всей информации, так как быстродействие при обращении к данным - критический параметр. А размерность данных строго известно заранее. Тогда почему бы и нет? А если требуется больше - имеет смысл соответствующее железо. 64-битный процессор и памяти по максимому и вперед.
309
06 октября 2006 года
el scorpio
1.1K / / 19.09.2006
PitxBull
"Здравствуйте, я ваша тётя" :)
Я почти неделю тому назад полное решение привёл - объект, который для внешне выглядит как массив. Осталось только реализацию файлового ввода/вывода дописать.
351
07 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=el scorpio]PitxBull
"Здравствуйте, я ваша тётя" :)
Я почти неделю тому назад полное решение привёл - объект, который для внешне выглядит как массив. Осталось только реализацию файлового ввода/вывода дописать.[/QUOTE]
гыг... писать свой алгоритм подкачки ? не смеши меня.... если немного пораскинутьь мозгами то можно задействовать механизм винды....

ну например.... допустим мы можем получить размер свободной памяти 1гб, а нам требуется 3 гб, делаем три файла по 1гб, и по необходимости проецируем их по одному на выделенную память.... идея конечно нуждается в доработке....
350
09 октября 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=el scorpio]Бесполезно - больше определённого предела система выделить не сможет никак. Только "ручками", с собственным алгоритмом работы с жёстким диском.[/QUOTE]
Ты ссылку вообще прочитал? Цитирую первую же строчку:
[QUOTE=msdn]
Address Windowing Extensions (AWE) is a set of extensions that allows an application to quickly manipulate physical memory greater than 4GB.[/quote]
Выделяется теоретически произвольное количество памяти. Просто в каждый момент времени доступно максимум 4 Гб (вычти потребление памяти ядром ОС). Фишка работает по принципу оконного отображения. Переключать окна, правда, придется программисту. Реализуй алгоритм переключения - вот, собсно, и более простая и более "естественная" для винды замена твоему "алгоритму подкачки".
У AWE есть ограничения, и если AWE чем-то не нравится - используй отображение файла в память
309
09 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=PitxBull]ну например.... допустим мы можем получить размер свободной памяти 1гб, а нам требуется 3 гб, делаем три файла по 1гб, и по необходимости проецируем их по одному на выделенную память.... идея конечно нуждается в доработке....[/QUOTE]
Ага, только где будут физически храниться "активные" данные: в ОЗУ или в файле? В последнем случае, читать/писать каждый элемент отдельно будет несколько.... накладно :confused:
Да, знаю, "кэширование" и всё такое... Но кэш - вешь такая, что используется многими программами сразу. А тут лежит себе эта "страница" в ОЗУ, никого не трогает :) - читаешь её, пишешь, а как в другой надобность возникла - сохранил и считал новую.

И вообще, когда "ручками" что-то делаешь - начинаешь понимать что к чему.:D

А если лезть в механизм управления памяти Windows, то где гарантия, что с вашей программой, по какой-то понятной им одним причинам, перестанут дружить другие программы :(
8.3K
23 октября 2006 года
1000@
29 / / 31.08.2005
[QUOTE=Alexandoros]Возможно в куче нету такого длинного непрерывного блока. Попробуй HeapAlloc и скажи ошибку.

Дальше покопай в сторону HeapCreate и VirtualAlloc .[/QUOTE]
Копал... ничего не получилось...
8.3K
23 октября 2006 года
1000@
29 / / 31.08.2005
[QUOTE=PitxBull]а не проще ли хранить эти данные в файле и написать класс возращающий необходимое значение из него при необходимости ?

class Data
{
public:

float Get( unsigned int number ); // в этой функции осуществляеться выборка из файла.
};[/QUOTE]
Долго
309
23 октября 2006 года
el scorpio
1.1K / / 19.09.2006
1000@
Долго :) - а как надо, быстро, дёшево и сердито? Так сердиться то ось будет - на Вас и Вашу программу :D
В общем, код объявления мегамассива я привёл - дерзайте с реализацией. И вообще, объекты - штука такая, их долго разрабатывать, зато быстро использовать.
Или "долго" программа работает - оптимизируйте.
351
29 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=el scorpio]Ага, только где будут физически храниться "активные" данные: в ОЗУ или в файле?[/QUOTE]
в виртуальном адресном пространстве процесса.... сча погуляю с собачкой приду и напишу код.... задача интересная.... ща...
351
29 октября 2006 года
PitxBull
633 / / 22.12.2004
вот

Код:
// test_swap.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h>

using namespace std;

#define MAX_FILE_SIZE 0x3fffffff

template<typename T>
class Data
{
public:

    Data( __int32 max_size )
    {
   
        __int64 data_size = sizeof(T) * max_size;

        int num_of_files = (int)( data_size / MAX_FILE_SIZE ) + 1;

        memory = (T*)(new char[MAX_FILE_SIZE]);

        strcpy( filename, "e:\\data0.dat" );

        for( int i = 0; i < num_of_files; i++ )
        {
            char str_numfile[5];
       
            filename[8] = *(itoa( i, str_numfile, 10 ));

            hFile = CreateFile( filename, GENERIC_READ | GENERIC_WRITE, 0,
                                        NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

            hMapFile = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, MAX_FILE_SIZE, NULL );
        }

        DWORD ErrCode = GetLastError();

        /*SetFilePointer( hFile, (max_size*sizeof(T)), 0, FILE_BEGIN );

        DWORD NumberOfBytesWriten;

        char buffer = 'a';

        WriteFile( hFile, &buffer, sizeof(buffer), &NumberOfBytesWriten, NULL );*/
    }

    ~Data()
    {
        //CloseHandle( hFile );
    }

    void SetValue( T value, __int64 position )
    {
        int num_file = ( position / MAX_FILE_SIZE ) + 1;

        if ( num_file != curr_file )
        {  
            MapViewOfFileEx( hMapFile[num_file], FILE_MAP_WRITE, 0, 0, 0, memory );

            curr_file = num_file;
        }

        __int32 pos_in_map = (position - ( (num_file-1) * MAX_FILE_SIZE )) / sizeof(T);

        memory[pos_in_map] = value;
    }

    T GetValue( __int32 position )
    {
        int num_file = ( position / MAX_FILE_SIZE ) + 1;

        if ( num_file != curr_file )
        {  
            MapViewOfFileEx( hMapFile[num_file], FILE_MAP_WRITE, 0, 0, 0, memory );

            curr_file = num_file;
        }

        __int32 pos_in_map = (position - ( (num_file-1) * MAX_FILE_SIZE )) / sizeof(T);
       
        T value = memory[pos_in_map];

        return value;
    }

protected:

    int curr_file;
   
    HANDLE hFile[9];
    HANDLE hMapFile[9];

    char filename[20];

    T* memory;

};

int _tmain(int argc, _TCHAR* argv[])
{
    Data<int> data( 700000000 );

    cout << "start set data" << endl;

    for( int i = 0; i < 700000000; i+=1000 )
    {
        data.SetValue( i+1, i );
    }

    int pause;

    /*cout << "press key to start get data " << endl;

   

    cin >> pause;*/

    for( int i = 0; i < 20000; i+=1000 )
    {
        cout << data.GetValue( i ) << endl;
    }

    cin >> pause;

    for( int i = 699999000; i > 500000000; i-=1000 )
    {
        cout << data.GetValue( i ) << endl;
    }

    cin >> pause;
   
    return 0;
}


вообщем у меня все неплохо фунциклирует.... при том что у меня 768mb оперативки... а работает с 1гб
309
29 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
вообщем у меня все неплохо фунциклирует.... при том что у меня 768mb оперативки... а работает с 1гб


А какая процессу разница, сколько на ПК физической памяти - на 256 МБ всё работало бы точно также - только медленнее? Программа всё равно работает с виртуализованной памятью, переадресацией которой занимается CPU.

И почему GetValue использует int32, а SetValue - int64?
И зачем вообще эти функции - для массива нужно переопределить оператор [].

3
29 октября 2006 года
Green
4.8K / / 20.01.2000
PitxBull, код очень сырой. Не стоило его выставлять в таком виде.

Особенно поразили такие вещи:
1. Ты запутал сам себя с тусованием типов int, __int32 и __int64.

2. Некрасиво
 
Код:
memory = (T*)(new char[MAX_FILE_SIZE]);

нагляднее писать
 
Код:
memory = new T[MAX_FILE_SIZE/sizeof(T)];


3. Нелепо писать
 
Код:
strcpy( filename, "e:\\data0.dat" );

тем более при
 
Код:
using namespace std;


4. Забавная нелепость
 
Код:
char str_numfile[5];

filename[8] = *(itoa( i, str_numfile, 10 ));

почему 5, а потом берем только первую цифру?
Это потенциальный баг, например при количестве файлов больше 10.
Кроме того, это опять же какое-то нелепое конструирование имени файла в C-стиле, когда есть полноценный C++.
Кстати, а что делать, если у меня нет диска E: ? :D

5. Это зачем?
 
Код:
DWORD ErrCode = GetLastError();


6. Файлы никогда не закрываются, память не освобождается, Unmap не вызывается?

7. Странно, размер контейнера задается в элементах
 
Код:
Data( __int32 max_size )
    {

        __int64 data_size = sizeof(T) * max_size;

а выборка элемента происходит по байтовой позиции
 
Код:
void SetValue( T value, __int64 position )
{
    int num_file = ( position / MAX_FILE_SIZE ) + 1;

<skip>

    __int32 pos_in_map = (position - ( (num_file-1) * MAX_FILE_SIZE )) / sizeof(T);

Это явный баг!

8. А для чего char filename[20]; является полем класса?

9. А почему бы это не оформить в виде обычного контейнера?

10. Внизу это у тебя "пример использовани" или unitest-ы ? :)
351
29 октября 2006 года
PitxBull
633 / / 22.12.2004
2Green : интересно как относятся твои замечания к теме ? я предложил алгоритм , а твои замечания носят с точки зрения самой идеи алгоритма носят второстепенный характер и некоторые из них ошибочны. тому кому нужен этот алгоритм сам доведет этот код до презентабельного уровня, меня в первую очередь интересовала сама идея и ее работоспособность. так вот : идея работает и наверно это самое оптимальное решение под винду.

P.S. Насчет трояна : у меня на компе информация соствавляющая государсвенную тайну. можт сам раскажешь что успел нарыть или мне куратору из СБУ позвонить ? ты ж не хочешь что б наш разговор перешел в реал ?
3
29 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=PitxBull]2Green : интересно как относятся твои замечания к теме ? я предложил алгоритм , а твои замечания носят с точки зрения самой идеи алгоритма носят второстепенный характер и некоторые из них ошибочны. тому кому нужен этот алгоритм сам доведет этот код до презентабельного уровня, меня в первую очередь интересовала сама идея и ее работоспособность. так вот : идея работает и наверно это самое оптимальное решение под винду.
[/QUOTE]
На счет идеи... идея не плохая, но мне кажется для начала все же надо выяснить, для чего понадобилось столько памяти. Вполне возможно, что просто неправильно поставлена задача изначально.

Что же касается реализации, то код твой в корне неверный.
Например, для чего создавать массив memory? Чтобы добить свопфайл? :)
Кроме того раз уж ты его создаешь, то надо обеспечить выравнивание на 64K.

Еще один баг: ты не инициализируешь поле curr_file.

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

[QUOTE=PitxBull]
P.S. Насчет трояна : у меня на компе информация соствавляющая государсвенную тайну. можт сам раскажешь что успел нарыть или мне куратору из СБУ позвонить ? ты ж не хочешь что б наш разговор перешел в реал ?
[/QUOTE]
По поводу трояна, это ты ко мне обращаешься?
У тебя параноя...

Насмешил... :D
Государственную тайну? Это про роботов с ИИ управляющие ракетами?
Ой! Я не расскрыл твою гос. тайну? :D

Я просто жаждю разговора в реале вместе с куратором или узурпатором или как там его...
398
30 октября 2006 года
Alexandoros
630 / / 21.10.2005
Нет,у него программа управления большими боевыми человекоподобными роботами.
351
30 октября 2006 года
PitxBull
633 / / 22.12.2004
ээээ сервис пак .... предыдущая версия работает неправильно .... хотя вчера утром вроде все работало.... чертовщина какая то

Код:
// test_swap.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h>

using namespace std;

#define MAX_FILE_SIZE 0x3fffffff

template<typename T>
class Data
{
public:

    Data( __int32 max_size )
    {
   
        __int64 data_size = sizeof(T) * max_size;

        int num_of_files = (int)( data_size / MAX_FILE_SIZE ) + 1;

        //memory = (T*)(new char[MAX_FILE_SIZE]);

        strcpy( filename, "f:\\data0.dat" );

        for( int i = 0; i < num_of_files; i++ )
        {
            char str_numfile[5];
       
            filename[8] = *(itoa( i, str_numfile, 10 ));

            hFile = CreateFile( filename, GENERIC_READ | GENERIC_WRITE, 0,
                                 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

            hMapFile = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, MAX_FILE_SIZE, NULL );

            DWORD ErrCode = GetLastError();
        }

        curr_file = 1000;

       

        /*SetFilePointer( hFile, (max_size*sizeof(T)), 0, FILE_BEGIN );

        DWORD NumberOfBytesWriten;

        char buffer = 'a';

        WriteFile( hFile, &buffer, sizeof(buffer), &NumberOfBytesWriten, NULL );*/
    }

    ~Data()
    {
        //CloseHandle( hFile );
    }

    void SetValue( T value, __int64 position )
    {
        unsigned __int64 byte_position = position * sizeof(T);
       
        int num_file = ( byte_position / MAX_FILE_SIZE );

        if ( num_file != curr_file )
        {  
            UnmapViewOfFile( memory );

            memory = NULL;
           
            memory = (T*)MapViewOfFile( hMapFile[num_file], FILE_MAP_WRITE, 0, 0, 0 );
           
            //LPVOID res = MapViewOfFileEx( hMapFile[num_file], FILE_MAP_WRITE, 0, 0, 0, memory );

            DWORD ErrCode = GetLastError();

            curr_file = num_file;
        }

        unsigned __int32 pos_in_map = (byte_position - ( num_file * MAX_FILE_SIZE )) / sizeof(T);

        memory[pos_in_map] = value;
    }

    T GetValue( __int64 position )
    {
        unsigned __int64 byte_position = position * sizeof(T);
       
        int num_file = ( byte_position / MAX_FILE_SIZE );

        if ( num_file != curr_file )
        {
            UnmapViewOfFile( memory );

            memory = NULL;

            memory = (T*)MapViewOfFile( hMapFile[num_file], FILE_MAP_WRITE, 0, 0, 0 );

            //LPVOID res = MapViewOfFileEx( hMapFile[num_file], FILE_MAP_WRITE, 0, 0, 0, memory );

            DWORD ErrCode = GetLastError();

            curr_file = num_file;
        }

        unsigned __int32 pos_in_map = (byte_position - ( num_file * MAX_FILE_SIZE )) / sizeof(T);
       
        T value = memory[pos_in_map];

        return value;
    }

protected:

    int curr_file;
   
    HANDLE hFile[9];
    HANDLE hMapFile[9];

    char filename[20];

    T* memory;

};

int _tmain(int argc, _TCHAR* argv[])
{
    Data<int> data( 700000000 );

    cout << "start set data" << endl;

    for( int i = 0; i < 700000000; i++ )
    {
        data.SetValue( i+1, i );
    }

    int pause;

    /*cout << "press key to start get data " << endl;

   

    cin >> pause;*/

    for( int i = 0; i < 20000; i+=1000 )
    {
        cout << data.GetValue( i ) << endl;
    }

    cin >> pause;

    for( int i = 700000000 - 1000 ; i > 500000000; i-=1000 )
    {
        cout << data.GetValue( i ) << endl;
    }

    cin >> pause;
   
    return 0;
}
351
30 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=Green]На счет идеи... идея не плохая,[/QUOTE]
да!!! но не ты, не el scorpio, ни великий преподователь aks до этого не додумались. а додумался я , PitxBull.
[QUOTE=Green]
но мне кажется для начала все же надо выяснить, для чего понадобилось столько памяти. Вполне возможно, что просто неправильно поставлена задача изначально.
[/QUOTE]
сразу видно - электрик. ты видишь все с точки зрения разработки игр и других попсовых систем. в совремменных наукоемких приложениях такие запросы памяти обычное дело.
[QUOTE=Green]
Что же касается реализации, то код твой в корне неверный.
Например, для чего создавать массив memory? Чтобы добить свопфайл? :)
Кроме того раз уж ты его создаешь, то надо обеспечить выравнивание на 64K.
[/QUOTE]
да вообщем то я хотел один раз выделить себе памяти и больше с этим не возиться. а тут еще это выравние.... какой садист писал эту винду ? ужасть... 15 минут на ровном месте..
[QUOTE=Green]
Еще один баг: ты не инициализируешь поле curr_file.
[/QUOTE]
просто были задачи поинтереснее.
[QUOTE=Green]
Человек, который сможет довести этот сырой код до ума, сможет написать его сам и с нуля. Для чего же тогда его (код) приводить? Чтобы запутать противника? :)
[/QUOTE]
ну и кто тут написал его с нуля ? кроме меня конечно.
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
char filename[20] - бред. Или короткое имя DOS - 13 символов (8 + "." + 3 + "\0") - или до бесконечности (длинное имя Windows + полный путь к файлу).
А лучше - контейнер типа String (CString, AnsiString - в зависимости от языка)

T GetValue( __int64 position ) - очередной глюк. T - может быть структурой с пару сотен байт размером - всё через стек передавать накладно до невозможности. Нужно использовать ссылки - константную и изменяемую.
T value = memory[pos_in_map] - опять же, ссылка напрашивается сама собой.
По прежнему большая путаница в целочисленных типах.
Что же касается внутренней реализации - нечитабельно. Без бутылочки не разберёсси :D
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=PitxBull]да!!! но не ты, не el scorpio, ни великий преподователь aks до этого не додумались. а додумался я , PitxBull.
[/quote]
Не надо себя так громко бить пяткой в грудь. Во-первых, это неприятно; во-вторых, это неудобно; в-третьих, объявление класса я написал ещё на первой странице темы :D

Цитата:
сразу видно - электрик. ты видишь все с точки зрения разработки игр и других попсовых систем. в совремменных наукоемких приложениях такие запросы памяти обычное дело.


Так, играми и прочей "попсой" мы, значит, уже не увлекаемся ;)
А в "наукоёмких" приложениях используются либо базы данных, которые избавляют от таких требований к ОЗУ, либо специализированные ЭВМ, не совместимые с обычными "писюками", и проблемы подобные там решаются по-другому.

Цитата:
какой садист писал эту винду ?


Билл Гейст - Великий у Ужасный. Другой вопрос - Чем?

Цитата:
ну и кто тут написал его с нуля ? кроме меня конечно.


Я пишу. В свободное время личного интереса ради.
Реализация почти готова - объекты многоуровневые, потому и сложные.
Функций много - зато все простые, интуитивно понятные, и большей частью - встроенные, потому и быстрые.
Алгоритм подкачки расчитан на поддержку нескольких страниц для оптимизации операций ввода/вывода при обращении к разным диапазонам.
Как допишу и отлажу - выложу.

240
30 октября 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=el scorpio]char filename[20]
А лучше - контейнер типа String (CString, AnsiString - в зависимости от языка)
[/QUOTE]
Блин, язык то в конце концов один. И строковый тип стандартный есть для него ) Любите вы нестандартными вещами пользоваться даже там где этого не требуется.
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
ask, просто я предпочитаю писать код так, чтобы избежать ситуаций, способных вызвать ошибку. А char как раз такой и является :(
Отсюда и стандартные (для данной реализации языка) строковые контейнеры.

Тем более, постоянно придётся писать код для проверки длины имени файла.
3
30 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=PitxBull]ээээ сервис пак .... предыдущая версия работает неправильно .... хотя вчера утром вроде все работало.... чертовщина какая то
[/QUOTE]
Чтож к замечаниям ты прислушиваешься, значит, не все потерянно. Жаль, что не ко всем...

Твой код остается неработоспособным на граничных условиях. Это легко выявляется юнит-тестами. Рекомендую освоить.

Кроме того теперь твой код просто захламлен старым заремаренным кодом. Совет: освой системы контроля версий, не будешь разводить помойку в коде.

Теперь о вновь замечанных багах и странных местах в коде:
1) почему curr_file = 1000; а не 3000 ? :)
2) HANDLE hFile[9]; почему 9? И где тогда проверяется это ограничение?
3) char filename[20]; почему 20?
3
30 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]
T GetValue( __int64 position ) - очередной глюк. T - может быть структурой с пару сотен байт размером - всё через стек передавать накладно до невозможности. Нужно использовать ссылки - константную и изменяемую.
[/QUOTE]
Ссылка здесь может быть невалидной, т.к. она будет указывать в одно место памяти, а содержимое этой области будут в разный момент времени занимать разные файлы.
Но не думаю, что PitxBull исходил из этих соображений, т.к. в SetValue как раз нужно применить именно константную ссылку. :)
3
30 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]ask, просто я предпочитаю писать код так, чтобы избежать ситуаций, способных вызвать ошибку. А char как раз такой и является :([/QUOTE]
ask имеет в виду std::string.
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Green]Ссылка здесь может быть невалидной, т.к. она будет указывать в одно место памяти, а содержимое этой области будут в разный момент времени занимать разные файлы.
[/QUOTE]
Согласен, при использовании результатов-ссылок для следующий код окажется неработспособным при использовании одной страницы.
 
Код:
const TMyStruct &Item1 = MegaArray.GetValue (10);
const TMyStruct &Item2 = MegaArray.GetValue (1000000);

Но если писать объект, изначально ориентируясь на многостраничный обмен данными, то всё будет куда безопаснее. Хотя и сложнее.
Пусть мы укажем объекту использовать 16 страниц - наврядли кто-либо станет использовать одновременно столько ссылок на элементы массива, тем более, в разных его частях.
3
30 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]
Пусть мы укажем объекту использовать 16 страниц - наврядли кто-либо станет использовать одновременно столько ссылок на элементы массива, тем более, в разных его частях.[/QUOTE]
Собственно, когда я говорил, что для начала надо выяснить, для чего столько памяти, я и имел в виду, что всё зависит от конкретной задачи и врядли кому-то одновременно потребуется столько памяти. Поэтому задачу, как мне кажется надо решать с другого конца - лечить причину, а не симптомы. Проблема не в недостатке памяти, а в неправильном видении проблемы.

P.S. 16 страниц невозможно, автор жестко прошил (в нескольких местах) не более 9. :D
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Согласен, задача скорее "академического" характера.
[QUOTE=Green]P.S. 16 страниц невозможно, автор жестко прошил (в нескольких местах) не более 9. :D[/QUOTE]
А это ещё с какого перепугу :confused: ?
Пока мой объект имеет пару открытых свойств: кол-во элементов, и кол-во выделяемых страниц. Над первым я ещё подумаю, а второе можно изменять динамически, исходя из текущих условий работы объекта.
Ну и конечно же две реализации operator [] (int Index). 2147483647 - два миллиарда элементов хватит за глаза любой задачи - в противном случае ей на IBM PC просто не место :D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог