информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСетевые кракеры и правда о деле ЛевинаСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Docker Hub закрыл доступ из России 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] A имеет тип (int [][10]) 14.10.03 12:19  Число просмотров: 1841
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
То есть массив массивов из десяти целых. И в принципе его можно привести к типу ((int [10])*) или как там записывается указатель на массив из 10-ти целых.

> 1. В массиве int A[10][10] ,- является ли A типом (int **)
> ?
> (Я так понял, что не является ,- он у меня функциями void a
> (int ** b) наотрез не принимается
Если размер известен заранее, то лучше передавать int b[][10] - все будет работать, если же нет, то выход для C - передавать двойной указатель и размерности (ну или засунуть тело массива и размерности в структуру и передавать везде указатель на нее) и ввести отдельную функцию индексирования этого массива. Ну или сделать массив указателей на одномерные массивы, как в последующем примере (который GG).

> и кроме того я последовательно память просмотрел ,- мой
> вывод - массив размещен последовательно)
:-)))) А что ты ожидал увидеть? :-)

> В конечном счете мне нужно было динамически выделить int
> A[10][10].
> Как я понял new может выделить только последовальную
> область, поэтому пришлось бы самому A[a][a*10+b];

> int ** GG, ee=0;
> GG = new (int *) [10];
> while (ee<10) GG[ee++] = new int [10];
Это один из самых распространенных способов.
Использование new, говорит об использовании C++, а там есть куча хороших контейнеров. Например vector. Об этом позже.

> Странно, но это у меня работает как int GG[10][10], т. е.
> как аналог int A[10][10], при том, что и void a (int ** b)
> его принимает.
Не странно.

> Я в принципе не до конца понимаю ситуацию, поэтому
> расчитываю, что вы что-нибудь умное скажите и у меня все
> станет на свои места.
В C многомерный массив трактуется как массив массивов. Первое индексирование находит нужный одномерный массив, а второе - нужный элемент в этом массиве.

Чтобы лучше понять, что происходит, представь себе массив структур
struct S{
    int a1;
    int a2;
    int a3;
    int a4;
    int a5;
};

struct S arr[5];

---
В памяти последовательно будут размещаться все эти структуры. Массив массивов не имеет принципиального отличия. int a[5][10] читается как (int a[10])[5]. И в памяти последовательно размещаются пять десятимерных массивов (именно так, потому как у скобок свой приоритет при составлении типа).

Операция a[i] - взятие индекса в C выполняется как взятие нужных данных по смещению (sizeof(*a) * i) от начала массива, то есть длина одной записи в массиве умножается на индекс.

В случае с int **a - невозможно определить размер второй размерности массива, вернее возможно, он равен 1 - поэтому компилятор и говорит о несоответсвии типов. Случай с массивом указателей работает потому, что все массивы одномерные: одномерный массив указателей на строки и по одномерному массиву с элементами каждой строки. Массив указателей можно имеет тип (int *)[], а его можно передавать как (int **)

> Что по этому поводу говорит стандарт языка C/C++
> и как решаются проблемы с динамическими многомерными
> массивами (предполагаю, что все решается как-то более
> элегантно) ?
Используй vector<vector<int>>. Его описание есть и в MSDN и во всех описаниях STL.

Или остановись на массиве указателей на строки

ЗЫ: Смешение стилей программирования - не очень хорошая идея (в частности использование new в явно C-style программе). У C есть своя функция для выделения памяти: malloc, а new предназначена не для выделения памяти, а для создания объектов.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach