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

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

Войти
Регистрация
Восстановить пароль
 
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
#1

Запрос указаной ячейки памяти - C++

18.03.2013, 14:06. Просмотров 694. Ответов 12
Метки нет (Все метки)

Добрый день.
Задача вставить в матрицу (динамический двумерный массив) новую колонку.
Вопрос можно ли запросить у операционки определенную ячейку памяти, что бы не копировать элементы матрицы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2013, 14:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запрос указаной ячейки памяти (C++):

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти)) - C++
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Чтение ячейки памяти - C++
Сказали считать ячейку памяти, в которой лежит целое число, а так же посчитать кол-во 0 и 1. До сих пор не пойму, что от меня требуют и...

Не могу прочитать данные ячейки памяти - C++
Подскажите пожалуйста что не так. Адресс ячейки вычислил через артмани. Код процесса выводит верно, а значение памяти нет. Для примера взял...

Значение указателей (*ptr.) на пустые ячейки памяти - C++
Здравствуйте, уважаемые форумчане! С началом изучения С++ стало возникать множество вопросов. Когда резервируется свободная память...

Сдвиг ячейки памяти в массиве с вычитанием указателей - C++
Возник вопрос вот пример: int m = {1, 2, 3, 4, 5} int *p = &m ; // Это получается адрес начала массива. int *q = &m ; //...

Суммирование ряда с указаной точностью - C++
Знаю, смешно,можете сказать "Иди читай", но все же.Задание на определение сумы бесконечно убивающей функции с указаной точностью. Вот...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.03.2013, 16:32 #2
Если выделен вектор указателей на колонки и не все значения в этом векторе используются, то можно добавить ещё колонку. Вообще, для определенных действий с данными, требуется выбирать наиболее удобные для этих данных структуры. Скажем, если нужно часто вставлять и удалять элементы, логичнее использовать список, а не массив и т.д.
Цитата Сообщение от fuelcs Посмотреть сообщение
Вопрос можно ли запросить у операционки определенную ячейку памяти, что бы не копировать элементы матрицы.
Поясните, что имеется в виду.
0
Croessmah
Эксперт CЭксперт С++
13221 / 7493 / 845
Регистрация: 27.09.2012
Сообщений: 18,412
Записей в блоге: 3
Завершенные тесты: 1
18.03.2013, 16:33 #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Поясните, что имеется в виду.
realloc. То есть попытаться выделить недостающую память сразу за уже выделенным под матрицу участком
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.03.2013, 16:46 #4
Цитата Сообщение от Croessmah Посмотреть сообщение
realloc
ну с malloc'ами ещё прокатит, а вот с new уже не очень
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 00:35  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
realloc
Скажите, а можно перевыделять память realloc а освобождать delete?
И смешивать new - realloc?
0
Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
19.03.2013, 00:40 #6
Цитата Сообщение от fuelcs Посмотреть сообщение
Скажите, а можно перевыделять память realloc а освобождать delete?
И смешивать new - realloc?
Нет.
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 01:04  [ТС] #7
Подскажите где ошибка?
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
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
 
void show (int** arr, int row, int col)
{
    for (int i=0;i<row;i++)
    {
        for (int j=0;j<col;j++)
        {
            cout << setw(4) << arr[i][j];
        }
        cout << "\n";
    }
}
 
int main()
{
    int row=5;
    int col=5;
    int** arr=NULL;
    arr=(int**)malloc(sizeof(int)*row);
    for (int i=0;i<row;i++)
    {
        arr[i]=(int*)malloc(sizeof(int)*col);
        for (int j=0;j<col;j++)
        {
            arr[i][j]=i*col+j+1;
        }
    }
 
    show(arr,row,col);
 
    col++;
    for (int i=0;i<row;i++)
    {
        arr[i]=(int*)realloc(arr,sizeof(int)*col);
        arr[i][col-1]=col-1;
    }
 
    show(arr,row,col);
 
    for (int i=0;i<row;i++)
    {
        free(arr[i]);
    }
    free(arr);
    return 0;
}
после realloc уже проинициализированые значения удалятся и программа вылетает...

вроде тут (так): arr[i]=(int*)realloc(arr[i],sizeof(int)*col);
сорри нам malloc не читали... (гуглю..)
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.03.2013, 01:06 #8
Цитата Сообщение от fuelcs Посмотреть сообщение
C++
1
arr[i]=(int*)realloc(arr,sizeof(int)*col);
C++
1
arr[i] = (int*)realloc(arr[i], sizeof(int) * col);
пробелы, это так сложно

Цитата Сообщение от fuelcs Посмотреть сообщение
что бы не копировать элементы матрицы.
вообще-то внутри realloc происходит именно копирование, при увеличении размера в большую сторону так точно
1
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 01:11  [ТС] #9
Цитата Сообщение от Jupiter Посмотреть сообщение
пробелы, это так сложно
не люблю пробелы))

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
вообще внутри realloc происходит именно копирование
то есть realloc не добавляет память к существующей а выделяет ее заново?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
19.03.2013, 01:18 #10
Цитата Сообщение от Croessmah Посмотреть сообщение
realloc. То есть попытаться выделить недостающую память сразу за уже выделенным под матрицу участком
Да не. ТС не знает, да и вы ошибаетесь. Коль скоро массив динамический, то это значит, что строки матрицы абсолютно не обязаны следовать одна за другой. Допустим, в матрице элементов типа int пять столбцов. Имеем нулевую строку. Вот она закончилась, а будет за ней следующая строка или следующая будет лежать где-нибудь за тридевять земель- это уж как карта ляжет. То есть нет понятия- выделенный участок памяти под матрицу. Соответственно, после него ничё нельзя выделить. (Если бы матрица была статической- тогда другое дело.) Небольшой эксперимент:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main () {
 
 int kol_vo_strok= 3;
 int kol_vo_stolbtsov= 5;
 
 //Выделяем память под указатели на строки
 int**p= new int* [kol_vo_strok];
 
 //Выделяем память под строки и смотрим где они располагаются
 for (int i= 0; i< kol_vo_strok; i++) {
  p[i]= new int [kol_vo_stolbtsov]; 
  printf ("%x\n", p[i]);
 }
 
 getchar ();
 return 0;
}
Ну и вывод:
Bash
1
2
3
3e24b0
3e24d0
3e24f0
Комментарии как говорится, излишни. Если бы располагалась строка за строкой, то картина выглядела бы так:
Bash
1
2
3
3e24b0
3e24C4
3e24D8
+++++++++++++++++++++++++++++++++++++++++++++++

Ну может вы имели ввиду, что при добавлении колонки к таблице, (если идти путём который хочет ТС, то есть без перекопирования) нужно просто к каждой строке добавлять одну ячейку памяти. Тогда можно эту ячейку выделять заранее, например так:

C++
1
p[i]= new int [kol_vo_stolbtsov+ 1];
Вот и всё. Спокойно работаем, используя kol_vo_strok и kol_vo_stolbtsov как размеры матрицы. А когда надо будет добавить или даже вставить колонку- место под неё уже выделено. Так и опять тут без копирования элементов не обойтись.

Но всё это чисто эксперимента ради, правильно всё-таки перекопировать.
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 01:26  [ТС] #11
Цитата Сообщение от kravam Посмотреть сообщение
Ну и вывод:
Код Bash
3e24b0
3e24d0
3e24f0
так мне это как раз и нужно (если я вас правильно понял)...
Значит есть зазор между строками куда можно добавить еще один элемент, правильно ?
Ведь по сути нужно увеличить длину строки...
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.03.2013, 01:32 #12
Цитата Сообщение от fuelcs Посмотреть сообщение
то есть realloc не добавляет память к существующей а выделяет ее заново?
естественно
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
19.03.2013, 01:34 #13
Цитата Сообщение от fuelcs Посмотреть сообщение
Значит есть зазор между строками куда можно добавить еще один элемент, правильно ?
Я же говорю- как карта ляжет. Ось решила выделить строки с зазором. Ты напишешь код в расчёте на это, а в следующий раз она выделит строки без зазора и всё, матрица твоя рухнет.

Если заранее уверен, что в задаче придётся вставлять колонку, то заранее выдели в каждой строке на один элемент больше, как я сказал в прошлом посту.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2013, 01:34
Привет! Вот еще темы с ответами:

Как по ссылке прочитать ячейки памяти в turbo debugger c++ 3.0 - C++
Выполняя код на с++ программа собирается считать дамп памяти и что то с ним сделать, но прежде чем программа с этим дампом поработает мне...

Поменять местами два числа, не используя дополнительные ячейки памяти - C++
Когда вводишь два числа нужно что бы они поменялись местами, не используя при это дополнительные ячейки то есть всего 2 ячейки ...

Если указатель хранит адрес ячейки памяти, на которую он указывает, то почему тогда в моем экспериментальном коде такой результат? - C++
Добрый день! Вот второй день разбираюсь с указателями и ссылками, и всё равно не могу заполнить пробелы. Объясните, пожалуйста. Если...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.03.2013, 01:34
Ответ Создать тему
Опции темы

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