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

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

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

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

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

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

вывод ячейки матрицы C++
C++ Поменять ячейки местами
C++ Замена цвета определенной ячейки StringGrid
C++ Поменять местами два числа, не используя дополнительные ячейки памяти
C++ Значение указателей (*ptr.) на пустые ячейки памяти
Окна и ячейки для ввода данных C++
C++ Если указатель хранит адрес ячейки памяти, на которую он указывает, то почему тогда в моем экспериментальном коде такой результат?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.03.2013, 16:32     запрос указаной ячейки памяти #2
Если выделен вектор указателей на колонки и не все значения в этом векторе используются, то можно добавить ещё колонку. Вообще, для определенных действий с данными, требуется выбирать наиболее удобные для этих данных структуры. Скажем, если нужно часто вставлять и удалять элементы, логичнее использовать список, а не массив и т.д.
Цитата Сообщение от fuelcs Посмотреть сообщение
Вопрос можно ли запросить у операционки определенную ячейку памяти, что бы не копировать элементы матрицы.
Поясните, что имеется в виду.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12512 / 7074 / 794
Регистрация: 27.09.2012
Сообщений: 17,466
Записей в блоге: 2
Завершенные тесты: 1
18.03.2013, 16:33     запрос указаной ячейки памяти #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Поясните, что имеется в виду.
realloc. То есть попытаться выделить недостающую память сразу за уже выделенным под матрицу участком
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.03.2013, 16:46     запрос указаной ячейки памяти #4
Цитата Сообщение от Croessmah Посмотреть сообщение
realloc
ну с malloc'ами ещё прокатит, а вот с new уже не очень
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 00:35  [ТС]     запрос указаной ячейки памяти #5
Цитата Сообщение от Croessmah Посмотреть сообщение
realloc
Скажите, а можно перевыделять память realloc а освобождать delete?
И смешивать new - realloc?
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
19.03.2013, 00:40     запрос указаной ячейки памяти #6
Цитата Сообщение от fuelcs Посмотреть сообщение
Скажите, а можно перевыделять память realloc а освобождать delete?
И смешивать new - realloc?
Нет.
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 не читали... (гуглю..)
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 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 происходит именно копирование, при увеличении размера в большую сторону так точно
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 01:11  [ТС]     запрос указаной ячейки памяти #9
Цитата Сообщение от Jupiter Посмотреть сообщение
пробелы, это так сложно
не люблю пробелы))

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
вообще внутри realloc происходит именно копирование
то есть realloc не добавляет память к существующей а выделяет ее заново?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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 как размеры матрицы. А когда надо будет добавить или даже вставить колонку- место под неё уже выделено. Так и опять тут без копирования элементов не обойтись.

Но всё это чисто эксперимента ради, правильно всё-таки перекопировать.
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
19.03.2013, 01:26  [ТС]     запрос указаной ячейки памяти #11
Цитата Сообщение от kravam Посмотреть сообщение
Ну и вывод:
Код Bash
3e24b0
3e24d0
3e24f0
так мне это как раз и нужно (если я вас правильно понял)...
Значит есть зазор между строками куда можно добавить еще один элемент, правильно ?
Ведь по сути нужно увеличить длину строки...
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.03.2013, 01:32     запрос указаной ячейки памяти #12
Цитата Сообщение от fuelcs Посмотреть сообщение
то есть realloc не добавляет память к существующей а выделяет ее заново?
естественно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2013, 01:34     запрос указаной ячейки памяти
Еще ссылки по теме:

Суммирование ряда с указаной точностью C++
C++ Чтение ячейки памяти
Не показывать пустые ячейки массива C++
C++ Не могу прочитать данные ячейки памяти
C++ Сдвиг ячейки памяти в массиве с вычитанием указателей

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
19.03.2013, 01:34     запрос указаной ячейки памяти #13
Цитата Сообщение от fuelcs Посмотреть сообщение
Значит есть зазор между строками куда можно добавить еще один элемент, правильно ?
Я же говорю- как карта ляжет. Ось решила выделить строки с зазором. Ты напишешь код в расчёте на это, а в следующий раз она выделит строки без зазора и всё, матрица твоя рухнет.

Если заранее уверен, что в задаче придётся вставлять колонку, то заранее выдели в каждой строке на один элемент больше, как я сказал в прошлом посту.
Yandex
Объявления
19.03.2013, 01:34     запрос указаной ячейки памяти
Ответ Создать тему
Опции темы

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