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

Динамическая память - C++

Восстановить пароль Регистрация
 
 
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 13:55     Динамическая память #1
Есть 2 массива одной размерности:

C++
1
2
int *m1 = new int [N], 
    *m2 = new int [M];
где N, M некие числа.
Собственно вопрос: как "склеить" m1 и m2 так, что бы в итоге получился некий массив m[N+M] ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 13:55     Динамическая память
Посмотрите здесь:

C++ Динамическая память
Динамическая память C++
C++ Динамическая память
C++ Динамическая память
C++ Динамическая память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
28.06.2012, 14:01     Динамическая память #2
В google вбил "cклейка массивов int" и вот ответ
C
1
2
3
4
5
6
7
8
9
10
void stick(int * p1, int * p2, int * p3, int array_size1, int array_size2)
/* Функция склейки двух массивов p1 и p2 с записью результата в p3 */
{
 int j,i;
 for (i = 0; i < array_size1+array_size2; i++)
 {
  if (i < array_size1) p3[i] = p1[i];
  else p3[i] = p2[i - array_size1];
 }
}
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 14:07  [ТС]     Динамическая память #3
KATbIK,в том-то и дело, что я не хочу тратить время на запись все в третий, а хочу напрямую склеить их. Как будто это изначально был бы один массив. Как сделать это?
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 14:19     Динамическая память #4
Цитата Сообщение от Ksan Посмотреть сообщение
хочу напрямую склеить их
Если реализовать список массивов, интерфейс доступа к элементам и прочие операции, то можешь ты сделать это.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 14:23  [ТС]     Динамическая память #5
ЛетающийЕнот, то есть, что-то вроде этого:

C++
1
2
3
int **m = new int *[2];
m[0] = a;
m[1] = b;
да?
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 14:32     Динамическая память #6
Вроде того.
OcbMuHor
Заблокирован
28.06.2012, 14:47     Динамическая память #7
Цитата Сообщение от Ksan Посмотреть сообщение
KATbIK,в том-то и дело, что я не хочу тратить время на запись все в третий, а хочу напрямую склеить их. Как будто это изначально был бы один массив. Как сделать это?
распределением памяти занимается ОС и даже не факт что множество физических адресов ОП будет последовательным, тогда как виртуальные адреса будут таковыми. Ты можешь только создать третий массив и скопировать в него элементы из двух других массивов. Это можно сделать, но программа может обрушить всё и вся. Вот пример, он естественно завершит программу с ошибкой сегментации segmentation fault
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
#include <iostream>
#include <iomanip>
 
void fill( int* point, unsigned size )
{
    for ( unsigned i = 0; i < size; ++i  )
        std::cin >> point[ i ];
}
 
void dump( int* point, unsigned size )
{
    for ( unsigned i = 0; i < size; ++i )
        std::cout << std::setw( 3 ) << point[ i ];
    std::cout << std::endl;
}
 
int main()
{
 
    const unsigned n = 4, m = 5;
    unsigned i = 0;
    int *m1 = new int [ n ], *m2 = new int[ m ], *k = m1;
 
    fill( m1, n );
    fill( m2, m );
 
    while( i < n + m ) 
        k[ i ] = ( i < n ? m1[ i++ ] : m2[ i++ - n ] ) ;
 
    dump( m1, n );
    dump( m2, m );
    dump( k, n + m );
 
    delete [] m1;
    delete [] m2;
 
    return 0;
}
а так чтобы "подвинуть" указатель на начало m2 к указателю конца m1, то это нарушит структуру программы.
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 14:59     Динамическая память #8
Логическую адресацию организовать можно зато.
Список массивов как вариант предложил я.
OcbMuHor
Заблокирован
28.06.2012, 15:13     Динамическая память #9
Цитата Сообщение от ЛетающийЕнот Посмотреть сообщение
Логическую адресацию организовать можно зато.
Список массивов как вариант предложил я.
средствами с++? покажи как . Да, ты предложил. Я не предлагал, я сказал что идея не представляет практического интереса, т.е. в такой постановке. Решается она только как показал KATbIK
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 15:15     Динамическая память #10
OcbMuHor, теоретически можно. Хотя действительно бессмысленно при такой постановке вопроса.
Таки да, я умываю руки. :cofee2:
OcbMuHor
Заблокирован
28.06.2012, 15:16     Динамическая память #11
клиенту надо вот это
C++
1
&m1[ n ] = &m2[ 0 ];
только вот какой в этом зашифрован смысл я не понимаю.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
28.06.2012, 17:59     Динамическая память #12
Цитата Сообщение от Ksan Посмотреть сообщение
как "склеить" m1 и m2 так, что бы в итоге получился некий массив m[N+M] ?
Можно выделить сразу один кусок:
C++
1
2
3
int * m = new int[N + M];
int * m1 = m;
int * m2 = m + N;
Вот только не очень понятно зачем это.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 18:13  [ТС]     Динамическая память #13
OcbMuHor, если сделать то, что ты написал, можно ли будет обращаться к одному куску памяти?
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 18:19     Динамическая память #14
Ksan, почему нет?
Должно работать.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 18:24  [ТС]     Динамическая память #15
Не работает.

Добавлено через 38 секунд
non-lvalue in assignment
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 18:25     Динамическая память #16
Ksan, проверил. У меня немного другой код, но всё работает. Принцип тот же.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 18:27  [ТС]     Динамическая память #17
ЛетающийЕнот, код в студию?
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 18:30     Динамическая память #18
Причём и код gray_fox у меня успешно компилируется.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 18:31  [ТС]     Динамическая память #19
ЛетающийЕнот,
покажи свой код
да и какой у тебя компилятор?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 18:33     Динамическая память
Еще ссылки по теме:

Статическая память,Динамическая память. C++
C++ Динамическая память
Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 18:33     Динамическая память #20
Пожалуйста.

C++
1
2
3
4
5
6
7
8
9
10
int* a=new int[100000];
    for (int i=0; i<100000; i++)
        a[i]=i;
    int** b=new int*[100000];
    for (int i=0; i<100000; i++)
        b[i]=&a[i];
    if (b[50000][0]==50000)
        cout << "TRUE\n";
    delete[] a;
    system("pause");
VC++ 2008. Сейчас проверю GCC.
Yandex
Объявления
28.06.2012, 18:33     Динамическая память
Ответ Создать тему
Опции темы

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