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

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

Войти
Регистрация
Восстановить пароль
 
 
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
#1

Как одномерный массив представить двумерным? - C++

10.06.2013, 13:22. Просмотров 1137. Ответов 23
Метки нет (Все метки)

Я загрузил изображение. И есть указатель на его однобайтные пиксели: BYTE *pixels;
Пиксель [5,8] считываю так: pixels[5*Width+8];
А как сделать, чтоб pixels[5,8] ?

Пробую через другой указатель:
BYTE *array[Width][Height]=pixels;
Компилятор ругается.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2013, 13:22     Как одномерный массив представить двумерным?
Посмотрите здесь:
C++ Как представить многомерный массив в одномерный?
C++ Как представить массив состоящий из дробей ?
Двумерным массив C++
C++ Можно ли представить структуру как элемент массива, т е массив состоящий из однотипных структур
Как сложить массив чтоб получился одномерный массив? C++
Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов) C++
C++ ассоциативный массив map c двумерным массивом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Trwsdf
Заблокирован
11.06.2014, 14:05     Как одномерный массив представить двумерным? #16
Цитата Сообщение от Pro_ha Посмотреть сообщение
Как одномерный массив представить двумерным? / С++ для начинающих
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  const int COUNT = 9;
    int init[COUNT] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    //or matrix
    //    {1,2,3}    
    //    {4,5,6}
    //    {7,8,9}
    std::valarray<int> val(init, COUNT);
    //get sub matrix 
    //    {4,5}
    //    {7,8} 
    auto slice = gslice(3, std::valarray<size_t>(2, 2), std::valarray<size_t>({3, 1}));
    // set 0
    val[slice] = 0;
    //result
    for (int i = 0; i < COUNT; i++)cout << noskipws << val[i] << " ";
    //1 2 3 0 0 6 0 0 9
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 14:54     Как одномерный массив представить двумерным? #17
Цитата Сообщение от ValeryS Посмотреть сообщение
есть тупой вариант создать двумерный массив и скопировать в него
Был предложен и существенно более умный вариант - завести массив указателей на начала строк и адресоваться через него. Если кто-то предложит что-то эффективнее - с интересом выслушаю .
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
11.06.2014, 16:12     Как одномерный массив представить двумерным? #18
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
завести массив указателей на начала строк и адресоваться через него.
можно
но я никак не могу представить как это сделать
типа ?
C++
1
2
3
4
int arr[100];// исходный массив
int * pi[10];
for(int i=0;i<100;i+=10)
  pi=&arr[i];
а работать как?
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 17:00     Как одномерный массив представить двумерным? #19
Цитата Сообщение от ValeryS Посмотреть сообщение
а работать как?
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
#include <stdio.h>
#include <stdlib.h>
int main()
{
    unsigned char *img_data;
    unsigned char **img_data_rows;
    int row_n,rows,cols;
    FILE* out;
    rows = 32;
    cols =16;
    
    img_data = (unsigned char*)malloc(rows*cols);
    img_data_rows = (unsigned char **)malloc(rows*sizeof(unsigned char *));
    for(row_n=0;row_n<rows;row_n++)
    {
       img_data_rows[row_n] = img_data+row_n*cols;
    }
    
    for(row_n=0;row_n<rows;row_n++)
    {
       memset(img_data_rows[row_n],row_n,cols);
    }
    out = fopen("test.dat","wb");
    fwrite(img_data,rows*cols,1,out);
    fclose(out);
    return 0;
}
Адресуемся через массив строк как через двумерный.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
11.06.2014, 17:13     Как одномерный массив представить двумерным? #20
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Адресуемся через массив строк как через двумерный.
покаж
я пока увидел работу со всей строчкой
как например получить элемент 0,0 и сравнить его с 0,1?
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 17:21     Как одномерный массив представить двумерным? #21
Цитата Сообщение от ValeryS Посмотреть сообщение
как например получить элемент 0,0 и сравнить его с 0,1?
А в чем проблема имея строку получить доступ к ее элементу?:

C
1
img_data_rows[0][0] == img_data_rows[0][1]
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
12.06.2014, 04:53  [ТС]     Как одномерный массив представить двумерным? #22
Цитата Сообщение от ValeryS Посмотреть сообщение
но я никак не могу представить как это сделать
Вот мой вариант (не проверял):
C++ (Qt)
1
2
3
4
5
6
7
8
BYTE ar1D[6]={1,2,3, 1,2,3}, **ar2D;
int width=3,height=2;
 
ar2D=new BYTE*[height];
for(int y=0;y<height;y++)ar2D[y]=&ar1D[y*width];
BYTE color=ar2D[1][2]; //<-- Чего и требовалось добиться.
 
delete ar2D; //<-- без []
Добавлено через 6 минут
Вот только не уверен на счет delete ar2D. Правильно ли удаляю массив указателей.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
12.06.2014, 05:21     Как одномерный массив представить двумерным? #23
Цитата Сообщение от Pro_ha Посмотреть сообщение
Правильно ли удаляю массив указателей.
удаление массива - delete [].
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 07:03     Как одномерный массив представить двумерным?
Еще ссылки по теме:
C++ Одномерный массив, подскажите как вывести, как просит в задании
C++ Как возвратить одномерный массив
Как странспонировать одномерный массив C++
C++ Как перевернуть одномерный массив?
C++ Одномерный массив, как выйти?

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
12.06.2014, 07:03     Как одномерный массив представить двумерным? #24
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
А в чем проблема имея строку получить доступ к ее элементу?:
ни в чем
простоя ступил
Цитата Сообщение от Pro_ha Посмотреть сообщение
Вот мой вариант (не проверял):
а лучше проверить, а еще лучше проанализировать ассемблерные листинги
по моему мнению, в этом варианте мы теряем и в памяти ( лишняя память под массив указателей) и в скорости
( сначала идет выбор указателя потом по этому указателю рассчитывается ячейка)
и это вместо простого умножения
Yandex
Объявления
12.06.2014, 07:03     Как одномерный массив представить двумерным?
Ответ Создать тему
Опции темы

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