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

Увеличение максимального размера массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
PostDoc
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 6
29.03.2010, 14:59     Увеличение максимального размера массива #1
Дорогие программисты, пожалуйста, помогите!))

Возможно ли увеличить максимальный размер массива???
Как я поняла он ограничен 64500 значениями. А мне необходимо 120000 значений. Может быть это можно сделать программным путем???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
29.03.2010, 18:39     Увеличение максимального размера массива #2
Какая среда для работы и какой компилятор ?
Покажи код где происходит выделение массива.
Банальный malloc() пробовала ?
PostDoc
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 6
30.03.2010, 12:41  [ТС]     Увеличение максимального размера массива #3
odip, спасибо за ответ)

среда Windows XP, компиллятор Microsoft Visual C++, version 6.0

malloc не подходит...

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

я попыталась разделить один большой массив на два маленьких - не помогло))), видимо 64500 значений - это ограничение для всех массивов вместе взятых, используемых в программе...
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.03.2010, 12:49     Увеличение максимального размера массива #4
C++
1
2
3
4
5
6
7
8
9
    int * a = new int[120000];
    
    for(int i = 0; i < 120000; ++i)
        a[i] = i;
        
    for(int i = 0; i < 120000; ++i)
        std::cout << a[i] << ' ';
    
    delete [] a;
хмм... все работает xD

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
    int a[120000];
    
    for(int i = 0; i < 120000; ++i)
        a[i] = i;
        
    for(int i = 0; i < 120000; ++i)
        std::cout << a[i] << ' ';
так тоже
PostDoc
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 6
30.03.2010, 15:02  [ТС]     Увеличение максимального размера массива #5
fasked, у меня организовано чтение из файла... при такой записи 120000 значений не работает...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
float FRQ[120000];
    double SPR[120000];
    long int i,k;
 
                f1=fopen(ppr,"r");
                    
         for(i=0;i<120000;i++)
         {
                
         fscanf(f1," %f",&FRQ[i]);
         fscanf(f1," %lg",&SPR[i]);
                         
         } 
         fclose(f1);
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.03.2010, 15:51     Увеличение максимального размера массива #6
ну тут проблема я думаю не в массивах. а в чтении из файла
PostDoc
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 6
31.03.2010, 07:44  [ТС]     Увеличение максимального размера массива #7
fasked, а что не так с чтением??? SPR[120000] - массив чисел с большими степенями, может быть с этим связано???

ну в общем, мы обошли эту часть проблемы, разделив массив на два по 60000 значений и работали с каждым отдельно. Из каждого считывались только четные значения, таким образом, число значений уменьшилось ровно в два раза, с которым уже можно работать....
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
31.03.2010, 10:36     Увеличение максимального размера массива #8
PostDoc, Если правильно понял, что нужно прочитать из файла пары значений с плавающей точкой (которых может быть 120000, а может и не быть), я бы лучше так сделал:
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
92
93
94
95
96
#include <stdio.h>
#include <stdlib.h>
 
typedef struct tagDOUBLES_PAIR {
    double frq;
    double spr;
    struct tagDOUBLES_PAIR* next;
} DOUBLES_PAIR;
 
DOUBLES_PAIR* newDoublesPair(double f, double s, DOUBLES_PAIR* last){
    DOUBLES_PAIR* dp;
    if ( ( dp = (DOUBLES_PAIR*)malloc(sizeof(DOUBLES_PAIR)) ) == NULL )
        return NULL;
    dp->frq = f;
    dp->spr = s;
    dp->next = NULL;
    if ( last )
        last->next = dp;
    return dp;
}
 
void clearAll(DOUBLES_PAIR* dp){
    DOUBLES_PAIR* tmp;
    while ( dp ){
        tmp = dp->next;
        free(dp);
        dp = tmp;
    }
}
 
/* не придумал, что бы ещё сделать, решил распечатать */
void printAll(const DOUBLES_PAIR* dp){
    while ( dp ){
        printf("%.3f\t%.3f\n", dp->frq, dp->spr);
        dp = dp->next;
    }
}
 
/* если очень нужен произвольный доступ. медленно, но работает */
DOUBLES_PAIR* getAt(DOUBLES_PAIR* dp, size_t pos){
    while ( pos-- ){
        if ( !( dp = dp->next ) )
            break;
    }
    return dp;
}
 
#define FILE_NAME "doubles.txt"
 
int main(void){
    DOUBLES_PAIR* first = NULL, * last = NULL;
    size_t cnt = 0;
    FILE* f;
    double frq, spr;
    
    if ( ( f = fopen(FILE_NAME, "r") ) == NULL ){
        fprintf(stderr, "Can't open input file!\n");
        exit(1);
    }
    
    while ( fscanf(f, "%lf %lf", &frq, &spr) == 2 ){
        if ( ( last = newDoublesPair(frq, spr, last) ) == NULL ){
            fprintf(stderr, "Memory error!\n");
            exit(1);
        }
        if ( !first )
            first = last;
        ++cnt;
    }
    
    if ( ferror(f) ){
        fprintf(stderr, "Can't read from input file!\n");
        exit(1);
    }
    
    fclose(f);
    
    if ( !first ){
        fprintf(stderr, "No values!\n");
        exit(1);
    }
    
    printf("\nAll %u pairs:\n", cnt);
    printAll(first);
    printf("\nRandom accessed (3-th) values:\n");
    if ( ( last = getAt(first, 2) ) == NULL ){
        fprintf(stderr, "Wrong index!\n");
        exit(1);
    }
    printf("%.3f\t%.3f\n", last->frq, last->spr);
    
    /* удалить весь список */
    clearAll(first);
    
    exit(0);
}
Maxim Prishchepa
Эксперт С++
 Аватар для Maxim Prishchepa
1875 / 987 / 61
Регистрация: 29.03.2010
Сообщений: 2,983
31.03.2010, 14:04     Увеличение максимального размера массива #9
я понимаю, что вопрос исчерпан, но почему бы не использовать vector?
PostDoc
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 6
31.03.2010, 15:19  [ТС]     Увеличение максимального размера массива #10
easybudda, спасибо большое за помощь, пытаюсь разобраться..)

l_a_m, а как сделать через vector??? спасибо)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
31.03.2010, 16:34     Увеличение максимального размера массива #11
Цитата Сообщение от l_a_m Посмотреть сообщение
я понимаю, что вопрос исчерпан, но почему бы не использовать vector?
Почему исчерпан? Вариантов решения ещё вагон с прицепом. В том числе с использованием std::vector. Хотя я бы как-то так сделал:
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
#include <iostream>
#include <fstream>
#include <map>
#include <iomanip>
 
int main(){
    std::multimap<double, double> dd;
    double frq, spr;
 
    std::ifstream ifs("doubles.txt");
    if ( !ifs.is_open() ){
        std::cerr << "Can't open input file!" << std::endl;
        return 1;
    }
 
    while ( ifs >> frq >> spr )
        dd.insert(std::pair<double, double>(frq, spr));
 
    if ( ifs.bad() ){
        std::cerr << "Can't read from file!" << std::endl;
        return 1;
    }
    ifs.close();
 
    std::cout << "FRQ       SPR" << std::endl;
    std::cout.precision(3);
    for ( std::multimap<double, double>::const_iterator i = dd.begin(); i != dd.end(); ++i )
        std::cout << std::left << std::fixed << std::setw(10) << i->first << std::fixed << i->second << std::endl;
 
    return 0;
}
Добавлено через 8 минут
Хотя это неправильное решение, если только не нужно заодно значения по полю FRQ сортировать
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.04.2010, 02:05     Увеличение максимального размера массива #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <fstream>
#include <iterator>
 
int main()
{
    std::vector<float> v;
    
    std::ifstream ifs("file.txt");
    
    float f = 0;
    while(ifs >> f)
        v.push_back(f);
    
    ifs.close();
    
    std::copy(v.begin(), v.end(), std::ostream_iterator<float>(std::cout, "\n"));
}
Содержимое файла:
Код
3.333333
2.222222
1.111111
Вывод:
Код
3.33333
2.22222
1.11111
Но это Си++
Я так понимаю автору надо было на Си
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2010, 07:42     Увеличение максимального размера массива
Еще ссылки по теме:

Динамическое увеличение размера динамического массива C++
C++ Увеличение элемента динамического массива
C++ Увеличение размера стека

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

Или воспользуйтесь поиском по форуму:
PostDoc
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 6
01.04.2010, 07:42  [ТС]     Увеличение максимального размера массива #13
Я очень-очень всем благодарна за помощь!!!! Эта проблема актуальна для нас довольно давно, и, оказывается, она имеет решение!!!!!!! Большое спасибо!!!
Yandex
Объявления
01.04.2010, 07:42     Увеличение максимального размера массива
Ответ Создать тему
Опции темы

Текущее время: 16:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru