Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

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

28.06.2012, 13:55. Просмотров 984. Ответов 20
Метки нет (Все метки)

Есть 2 массива одной размерности:

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

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть...

Динамическая память
Как создать массив A через динамическую память ???

Динамическая память
Добрый вечер! Возникла у меня такая проблемка, нужно от статической памяти...

Динамическая память
Всем привет!!! взникла проблема с выполнением строки K=A++; при...

Динамическая память
Надо ввести массив из файла. Сам массив хранится в динамической памяти. Сколько...

20
KATbIK
86 / 81 / 28
Регистрация: 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];
 }
}
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 14:07  [ТС] 3
KATbIK,в том-то и дело, что я не хочу тратить время на запись все в третий, а хочу напрямую склеить их. Как будто это изначально был бы один массив. Как сделать это?
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 14:19 4
Цитата Сообщение от Ksan Посмотреть сообщение
хочу напрямую склеить их
Если реализовать список массивов, интерфейс доступа к элементам и прочие операции, то можешь ты сделать это.
0
Ksan
27 / 27 / 4
Регистрация: 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;
да?
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 14:32 6
Вроде того.
0
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, то это нарушит структуру программы.
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 14:59 8
Логическую адресацию организовать можно зато.
Список массивов как вариант предложил я.
0
OcbMuHor
Заблокирован
28.06.2012, 15:13 9
Цитата Сообщение от ЛетающийЕнот Посмотреть сообщение
Логическую адресацию организовать можно зато.
Список массивов как вариант предложил я.
средствами с++? покажи как . Да, ты предложил. Я не предлагал, я сказал что идея не представляет практического интереса, т.е. в такой постановке. Решается она только как показал KATbIK
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 15:15 10
OcbMuHor, теоретически можно. Хотя действительно бессмысленно при такой постановке вопроса.
Таки да, я умываю руки. :cofee2:
0
OcbMuHor
Заблокирован
28.06.2012, 15:16 11
клиенту надо вот это
C++
1
&m1[ n ] = &m2[ 0 ];
только вот какой в этом зашифрован смысл я не понимаю.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 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;
Вот только не очень понятно зачем это.
1
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 18:13  [ТС] 13
OcbMuHor, если сделать то, что ты написал, можно ли будет обращаться к одному куску памяти?
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 18:19 14
Ksan, почему нет?
Должно работать.
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 18:24  [ТС] 15
Не работает.

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

Динамическая память
Кто сможет помочь? Дана матрица А. Упорядочить элементы каждой строки в...

Динамическая память
Здраствуйте!!!! Помогите выделить память под двумерные массив элементами...

Динамическая память
Создать одномерный массив в котором хранятся года рождения людей (года вводятся...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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