реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Из указателя получить массив с доступом по индексу в Си/С++
robix
сообщение Jul 16 2015, 06:49
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556



Всем привет!

Коллеги, подскажите если кто знает как решить задачку!?

1. Есть двумерный массив. Например: int arr[100][100];
2. Есть структура с указателем на двумерный массив, но не знаем какого размера он будет. Этому указателю присваиваем адрес arr. Например: void *parr; parr = (void*)arr; // может иначе!?
3. В программе можем получить доступ только к указателю из структуры, но необходимо обеспечить доступ к массиву по индексу без адресной арифметики, то есть типа parr[1][1] = 5; // или делаем другой указатель

Кто нибудь знает возможно ли организовать доступ к элементам массива по индексу, если мы получаем только указатель!? Тип данных элемента массива известен, а размерности берем из переменных (элементы структуры).
Go to the top of the page
 
+Quote Post
редактор
сообщение Jul 16 2015, 07:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Цитата
Кто нибудь знает возможно ли организовать доступ к элементам массива по индексу, если мы получаем только указатель!?

Да.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
robix
сообщение Jul 16 2015, 08:04
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556



Цитата(редактор @ Jul 16 2015, 11:45) *
Да.

Замечательно, а могли бы привести пример!?
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 16 2015, 08:07
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



дык если размерности динамические, то я бы хранил об этом в самом начале это массива. Ну а далее, можно уже через макросы или класс уже стучатся куда угодно. Или нет ?


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
robix
сообщение Jul 16 2015, 08:14
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556



Коллеги, вопрос не об алгоритме доступа, а о свойствах компилятора. Компилятор не позволяет преобразование типа void или другого в тип *[][]. А без этого преобразования получить доступ к элементам массива по индексу невозможно. Ну или опровергните меня, буду только рад.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 16 2015, 08:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (robix @ Jul 16 2015, 09:49) *
Кто нибудь знает возможно ли организовать доступ к элементам массива по индексу, если мы получаем только указатель!? Тип данных элемента массива известен, а размерности берем из переменных (элементы структуры).

В стиле array[][] в 'С' никак. В C++ нагородить класс можно практически для всего. Но пользоваться естественными и для 'С' и для контроллера указателями что мешает-то???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
robix
сообщение Jul 16 2015, 08:24
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556



Цитата(zltigo @ Jul 16 2015, 12:17) *
В стиле array[][] в 'С' никак. В C++ нагородить класс можно практически для всего. Но пользоваться естественными для 'С' указателями что мешает-то???

Для сложных алгоритмов с доступом к десяткам соседних элементов наглядность кода с естественными указателями отставляет желать лучшего. Надо через неделю паузы полчаса втыкать в то что написано.
Индексы существенно нагляднее, только и всего...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 16 2015, 08:42
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (robix @ Jul 16 2015, 11:24) *
Индексы существенно нагляднее, только и всего...

Макрорсы для наглядности никто не отменял.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
robix
сообщение Jul 16 2015, 08:44
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556



Ладно, спасибо. Буду пробовать макросы, раз уж никак...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 16 2015, 08:53
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (robix @ Jul 16 2015, 11:44) *
Ладно, спасибо. Буду пробовать макросы, раз уж никак...

Ну или С++, но мое личное предпочтение обойтись 'C' sm.gif



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jul 16 2015, 16:16
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(zltigo @ Jul 16 2015, 15:17) *
В стиле array[][] в 'С' никак.

Оказывается, можно, но только в С, к сожалению С++ такого не допускает.
Читал вчера про VLA, увлёкся и "случайно" нашёл другое их применение.
Код
void func(int n, int m, int arr[n][m] )
{
    for( int i = 0; i < n; i++)
        for( int j = 0; j < m; j++)
            arr[i][j] = 0; // тут при вычислении адреса операнда будет учитываться размерность m
}

//а так это можно применять:
#define N (10)
#define M (20)
int buf[N][M];
void f2()
{
    func( N, M, buf );
}

А размерность n, кстати, учитываться не будет, она для вычисления адреса не нужна.
Более сложные вещи можно делать комбинируя typedef (они тоже могут быть variably modified) и приведение указателей.
Описано в разделе 6.7.5.2 Array declarators стандарта С.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 16 2015, 17:54
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (SSerge @ Jul 16 2015, 19:16) *
Оказывается, можно, но только в С

Прикольно. Век живи, век учись. Но IAR без поддержки VLA не скушал, а GCC не отказался даже без С99.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 00:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016