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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.88
NikITKA123
19 / 18 / 1
Регистрация: 28.04.2010
Сообщений: 86
#1

Как создать динамический массив размерностью m на n? - C++

12.11.2010, 17:19. Просмотров 3067. Ответов 20
Метки нет (Все метки)

подскажите, а то я только n на n создавать умею)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2010, 17:19     Как создать динамический массив размерностью m на n?
Посмотрите здесь:
Есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран C++
Как создать динамический массив типа string? Как создать класс такого массива? C++
C++ Массив и память. Как создать динамический массив?
C++ Как создать динамический двумерный массив
Как создать динамический массив структур? C++
Как создать двумерный динамический массив C++
Как создать динамический двумерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.11.2010, 17:29     Как создать динамический массив размерностью m на n? #2
Покажите Ваш вариант n*n (а то непонятно какой язык) - тогда покажу как создавать m*n
NikITKA123
19 / 18 / 1
Регистрация: 28.04.2010
Сообщений: 86
12.11.2010, 17:49  [ТС]     Как создать динамический массив размерностью m на n? #3
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Покажите Ваш вариант n*n (а то непонятно какой язык) - тогда покажу как создавать m*n
cin >> n;
int **a = new int *[n];
for(int i = 0; i < n; i++)
a[i] = new int [n];
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
12.11.2010, 17:51     Как создать динамический массив размерностью m на n? #4
наверное так же...
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.11.2010, 17:53     Как создать динамический массив размерностью m на n? #5
Тогда m на n будет так:
C++
1
2
3
4
cin >> m>>n;
int **a = new int *[m];
for(int i = 0; i < m; i++)
a[i] = new int [n];
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
14.11.2010, 00:26     Как создать динамический массив размерностью m на n? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
вот на чистом Си, если кому интересно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int m, n;
    int **vect;
 
    printf("Input m:");
    scanf("%d", &m);
    printf("Input n:");
    scanf("%d", &n);
 
if (!(vect = (int** ) malloc(m * sizeof(int*))))
        printf("Allocate error");
 
    for (int i = 0; i < m; ++i)
        vect[i] = (int *) malloc(n * sizeof(int));
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 19:41     Как создать динамический массив размерностью m на n? #7
А вот так можно обраться к элементу ?

C++
1
cout << arr[n][m];
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
15.11.2010, 19:45     Как создать динамический массив размерностью m на n? #8
Нет нельзя. Если n и m это размерность матрицы. Это выход за пределы.
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 19:53     Как создать динамический массив размерностью m на n? #9
Если
double ** Arr;
размерность n+1, m+1;

такое выражение Arr[n][m] - будет корректно?

Добавлено через 4 минуты
Вообщем, как обратиться к n*m -ому элменту массива через указатель, не разыменовывая его?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:00     Как создать динамический массив размерностью m на n? #10
Цитата Сообщение от Don Vito Посмотреть сообщение
А вот так можно обраться к элементу ?
думаю разницы нет с С++..
в Си можно если arr у тебя массив m * n, в даном случае если память выделять динамически arr - будет указателем на указатель.
В Си как известно выражение типа arr[n][m] компилятором будет преобразовано в *(*(arr + n) + m)
то есть с помощью адресной арифметики мы сначало проходимся по "верхнему массиву указателей"
arr[n] (эквивалентно *(arr + n)), так как каждый элемент этого массива является указателем на массив простого типа
далее мы идем по верхнему массиву arr[n][m] (эквивалентно *(*(arr + n) + m))

Тут главное помнить что двумерные массивы(и по аналогии многомерные) в Си являются массивами массивов

Добавлено через 1 минуту
Цитата Сообщение от Don Vito Посмотреть сообщение
Вообщем, как обратиться к n*m -ому элменту массива через указатель, не разыменовывая его?
массив статический или динамический?
с помощью
C
1
double ** Arr;
ты хочешь сослаться на статический массив или динамический?
если динамический смотри мой пост
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 20:02     Как создать динамический массив размерностью m на n? #11
Спасибо за ответ!

Есть ли смысл заполнять нулями массив и в каких случаях это делается?

Добавлено через 1 минуту
Речь о двумерном динамически созданном...
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:10     Как создать динамический массив размерностью m на n? #12
Цитата Сообщение от Don Vito Посмотреть сообщение
Есть ли смысл заполнять нулями массив и в каких случаях это делается?
если ты не собираешься читать с него раньше чем записывать(кстати, это плохо) в него то не нужно, вот когда будешь забивать значения оно само перезапишется
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 20:17     Как создать динамический массив размерностью m на n? #13
Там memset(); вроде бы как то по хитрому нужно вызывать, да?
Если просто вызывать memset(); то адресса во второй размерности затираются, так что ли?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:30     Как создать динамический массив размерностью m на n? #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Don Vito Посмотреть сообщение
Там memset(); вроде бы как то по хитрому нужно вызывать, да?
Если просто вызывать memset(); то адресса во второй размерности затираются, так что ли?
можно но если честно это лишний геморой она предназначена в основном для копирования символов так как берет младший байт только(прочитай описание про нее), сначала надо мемсет вызвать для верхнего массива, а потом для верхнего, вот к примеру будет проще:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    int m = 3, n = 5;
    int **vect;
    int **a;
 
    // Allocating memory for m * n
    if (!(vect = (int** ) malloc(m * sizeof(int*))))
        exit(1);
 
    for (int i = 0; i < m; ++i)
        if(!(vect[i] = (int *) malloc(n * sizeof(int))))
            exit(1);
 
    // Input Elements of m * n
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            vect[i][j] = 10 * i + j;
 
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            printf((j != n - 1) ? "%d " : "%d\n", vect[i][j]);
 
    printf("\n\n");
если хочешь действительно разобраться хоть немного в указателях протести эту прогу и подумай чего она выводит массив 5 на 3 а не 3 на 5, а потом попробуй задать хотябы нули для этой матрицы только через мемсет

Добавлено через 1 минуту
Цитата Сообщение от norge_goth Посмотреть сообщение
Там memset()
если ты конечно имеешь ввиду инициализацию
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 20:37     Как создать динамический массив размерностью m на n? #15
Спасибо, обещаю покавырться в этом коде в доль и поперек
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:39     Как создать динамический массив размерностью m на n? #16
Цитата Сообщение от Don Vito Посмотреть сообщение
Спасибо, обещаю покавырться в этом коде в доль и поперек
ну я надеюсь
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 20:51     Как создать динамический массив размерностью m на n? #17
Еще один вопрос,

Создаю массив

C++
1
2
3
4
5
dMas = new double* [fsize + 1];
    for (int i = 0; i < fsize + 1; i++){
    
        dMas[i] = new double [11];
    }
В консоле на меня ругаются, где я касякнул то?

"this application has requested the runtime to terminate it in an unusual way
please contact ...
"

Добавлено через 57 секунд
P.S. первая размерность очень большая...
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 21:00     Как создать динамический массив размерностью m на n? #18
кинь больше кода особенно интересно объявление dMas и значение fsize
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
15.11.2010, 21:11     Как создать динамический массив размерностью m на n? #19
Если в кратце...

Пытаюсь сделать класс работающий с рядами биржевых данных. Все очень, очень сырое, поэтому не рунайтесь...

Функция принимает имя и путь файла и читает его в массив double.

Образец файла:

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
20100111 000000 1.47460 1.47480 1.47400 1.47480 0
20100111 000100 1.47450 1.47480 1.47400 1.47400 0
20100111 000200 1.47450 1.47450 1.47400 1.47400 0
20100111 000300 1.47440 1.47480 1.47390 1.47480 0
20100111 000400 1.47420 1.47510 1.47400 1.47510 0
20100111 000500 1.47490 1.47510 1.47480 1.47480 0
20100111 000600 1.47460 1.47520 1.47460 1.47460 0
20100111 000700 1.47520 1.47570 1.47460 1.47460 0
20100111 000800 1.47470 1.47550 1.47460 1.47460 0
20100111 000900 1.47520 1.47520 1.47470 1.47520 0
20100111 001000 1.47480 1.47480 1.47470 1.47470 0
20100111 001100 1.47520 1.47570 1.47430 1.47450 0
20100111 001200 1.47430 1.47500 1.47420 1.47430 0
20100111 001300 1.47460 1.47500 1.47420 1.47500 0
20100111 001400 1.47500 1.47500 1.47410 1.47460 0
20100111 001500 1.47500 1.47500 1.47410 1.47430 0
20100111 001600 1.47500 1.47500 1.47410 1.47460 0
20100111 001700 1.47410 1.47410 1.47410 1.47410 0
20100111 001800 1.47420 1.47490 1.47410 1.47490 0
20100111 001900 1.47460 1.47460 1.47410 1.47450 0
20100111 002000 1.47490 1.47490 1.47410 1.47460 0
20100111 002100 1.47420 1.47490 1.47420 1.47490 0
20100111 002200 1.47460 1.47490 1.47420 1.47420 0
20100111 002300 1.47440 1.47450 1.47420 1.47420 0
20100111 002400 1.47480 1.47480 1.47420 1.47420 0
20100111 002600 1.47480 1.47480 1.47410 1.47410 0
20100111 002700 1.47420 1.47490 1.47420 1.47430 0
20100111 002800 1.47490 1.47500 1.47410 1.47460 0
20100111 002900 1.47470 1.47510 1.47410 1.47470 0
20100111 003000 1.47430 1.47510 1.47430 1.47460 0
20100111 003100 1.47530 1.47530 1.47500 1.47520 0
20100111 003200 1.47500 1.47530 1.47500 1.47530 0
20100111 003300 1.47520 1.47600 1.47490 1.47490 0
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
double ** Stock_Data::File_Dl_Read(char **A){
 
    double **dMas = 0;
    double *dd = 0;
    unsigned long fsize = 0;
    unsigned long bread = 0;
    char *Buf = 0;
    char s1 [260];
    double *time;
    double *data;
    double *price;
    double *volume;
 
    cin >> s1;
 
    strcat(s1,*A);
 
    FILE *fq = fopen(s1,"rb");
 
        if (!fq){
    
        cout << "File do not open!" << endl;
        }else{
            cout << "File is opened!" << endl;
 
 
    if (fseek(fq, 0L, SEEK_END)){
    
        fclose(fq);
        cout << "Can't move description to the end of file!" << endl;
        //return 1;
    }else {
    
        fsize = ftell(fq);
    }
 
    if (fsize == -1L){
    
        fclose(fq);
        cout << "Can not get file size!" << endl;
        //return 1;
    }
 
    if (fseek(fq, 0L, SEEK_SET)){
    
        fclose(fq);
        cout << "Can not move descriptor to the beginning o the file!" << endl;
        //return 1;
    }
 
    Buf = new char [fsize + 1];
    memset(Buf, 0, fsize + 1);
 
    bread = fread(Buf, sizeof(char), fsize, fq);
 
    if (bread != fsize){
    
        delete [] Buf;
        fclose (fq);
        cout << "File read ERROR" << endl;
        cout << "Bytes read = " << bread << "!" << endl;
        cout << "File size = " << fsize << "!" << endl;
 
    }
 
    char * bf = Buf;
    
    dMas = new double* [fsize + 1];
    for (int i = 0; i < fsize + 1; i++){
    
        dMas[i] = new double [11];
    }
 
 
    for (unsigned long i = 0, z,  count = 0; i < fsize; i+=51){
 
        data  = ChDataToDl(&bf[i]);
 
        for (z = 0; z < 3; count++,z++){
        
            //dMas[i][count] = data[z];
            cout << data[z] << " ";
        
        }
 
        time = ChTimeToDl(&bf[i+9]);
 
        for (z = 0; z < 3; count++, z++){
        
            //dMas[i][count] = time[z];
            cout << time[z]<< " ";
 
        }
 
        price = ChPricesToDl(&bf[i+16]);    
 
        for (z = 0; z < 4; count++, z++){
            
            //dMas[i][count] = price [z];
            cout << price[z]<< " ";
 
        }
            volume = ChPriceToDl(&bf[i+48]);
 
            //dMas[i][count] = *volume;
            cout << *volume<< endl;
 
    }
    
    
 
    fclose (fq);
    delete [] Buf;
        }
 
 
    return dMas;
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2010, 21:20     Как создать динамический массив размерностью m на n?
Еще ссылки по теме:
C++ Как создать динамический массив строк?
C++ Как создать одномерный динамический массив?
C++ Как правильно создать динамический массив из функции
C++ Как создать двумерный динамический массив (принцип лото)?
Как можно создать динамический массив объектов fstream? C++

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

Или воспользуйтесь поиском по форуму:
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
15.11.2010, 21:20     Как создать динамический массив размерностью m на n? #20
Ежели используете потоки io то тогда уж и файл тоже с помощью потоков считывать лучше.
А как вы потом собираетесь размер массива возвращенного функцией узнать?
Yandex
Объявления
15.11.2010, 21:20     Как создать динамический массив размерностью m на n?
Ответ Создать тему
Опции темы

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