Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/41: Рейтинг темы: голосов - 41, средняя оценка - 4.61
19 / 18 / 5
Регистрация: 28.04.2010
Сообщений: 86

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

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

Студворк — интернет-сервис помощи студентам
подскажите, а то я только n на n создавать умею)
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2010, 17:19
Ответы с готовыми решениями:

Есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран
День добрый. Не хочется никому морочить голову дурацкими вопросами, поэтому стараюсь находить на все свои вопросы ответы сам. Но тут я...

Как создать динамический массив с переменной размерностью
Здравствуйте Все! 1. Подскажите, как в VBA сделать двухмерный (или трёхмерный) динамический массив не прямоугольной формы, а...

Создать динамический массив А целых чисел размерностью M на N. Заполнить массив случайными числами в диапазоне [-50;50]
Создать динамический массив А целых чисел размерностью M на N. За-полнить массив случайными числами в диапазоне Элементы массива,...

20
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.11.2010, 17:29
Покажите Ваш вариант n*n (а то непонятно какой язык) - тогда покажу как создавать m*n
1
19 / 18 / 5
Регистрация: 28.04.2010
Сообщений: 86
12.11.2010, 17:49  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Покажите Ваш вариант n*n (а то непонятно какой язык) - тогда покажу как создавать m*n
cin >> n;
int **a = new int *[n];
for(int i = 0; i < n; i++)
a[i] = new int [n];
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
12.11.2010, 17:51
наверное так же...
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.11.2010, 17:53
Тогда 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];
2
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
14.11.2010, 00:26
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

вот на чистом Си, если кому интересно
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));
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 19:41
А вот так можно обраться к элементу ?

C++
1
cout << arr[n][m];
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
15.11.2010, 19:45
Нет нельзя. Если n и m это размерность матрицы. Это выход за пределы.
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 19:53
Если
double ** Arr;
размерность n+1, m+1;

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

Добавлено через 4 минуты
Вообщем, как обратиться к n*m -ому элменту массива через указатель, не разыменовывая его?
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:00
Цитата Сообщение от 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;
ты хочешь сослаться на статический массив или динамический?
если динамический смотри мой пост
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 20:02
Спасибо за ответ!

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

Добавлено через 1 минуту
Речь о двумерном динамически созданном...
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:10
Цитата Сообщение от Don Vito Посмотреть сообщение
Есть ли смысл заполнять нулями массив и в каких случаях это делается?
если ты не собираешься читать с него раньше чем записывать(кстати, это плохо) в него то не нужно, вот когда будешь забивать значения оно само перезапишется
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 20:17
Там memset(); вроде бы как то по хитрому нужно вызывать, да?
Если просто вызывать memset(); то адресса во второй размерности затираются, так что ли?
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:30
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от 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()
если ты конечно имеешь ввиду инициализацию
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 20:37
Спасибо, обещаю покавырться в этом коде в доль и поперек
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 20:39
Цитата Сообщение от Don Vito Посмотреть сообщение
Спасибо, обещаю покавырться в этом коде в доль и поперек
ну я надеюсь
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 20:51
Еще один вопрос,

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

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. первая размерность очень большая...
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 21:00
кинь больше кода особенно интересно объявление dMas и значение fsize
1
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 174
15.11.2010, 21:11
Если в кратце...

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

Функция принимает имя и путь файла и читает его в массив 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;
 
}
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
15.11.2010, 21:20
Ежели используете потоки io то тогда уж и файл тоже с помощью потоков считывать лучше.
А как вы потом собираетесь размер массива возвращенного функцией узнать?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2010, 21:20
Помогаю со студенческими работами здесь

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите, пожалуйста, очень нужна помощь!

Массив и память. Как создать динамический массив?
не могу исправить ошибки. И нужен динамический массив я что-то попробовала для его создания но ничего не вышло #include...

Re: Как создать динамический массив?
А нормального массива нету? ArrayList тоже что попало, по индексу обратится нельзя ArrayList arr = new ArrayList(); ...

Как создать динамический массив
помогите

Как создать динамический массив
Так случилось, что потребовался &quot;глобальный&quot;(в разных event'ах используется) массив. Создал класс, объявил его как class Gl ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru