Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.01;
Скачать: CL | DM;

Вниз

массивы открытого типа в С/С++   Найти похожие ветки 

 
Val ©   (2002-05-28 19:11) [0]

Подскажите пожалуйста, как в С/С++ реализуется передача массива открытого типа, как параметра, в функцию


 
VictorT ©   (2002-05-28 19:16) [1]

Что такое массив открытого типа?


 
Val ©   (2002-05-28 19:24) [2]

без указания размерности, динамический.
я реализую функцию, в которую должны передаваться массивы разной размерности. Вопрос собственно, как это делают на С? я его почти не знаю :((


 
Val ©   (2002-05-28 19:25) [3]

то что в паскале делается так:
MyFunction(mas1: array of integer): integer;


 
VictorT ©   (2002-05-28 19:35) [4]

А, ты в этом смысле... Тогда, используя эту терминологию, в С при передаче массива в функцию, его всегда можно считать открытым, т.к. передается только указатель не первый елемент массива и никакой информации о его размере. Твой пример на с будет выглядеть так:

int MyFunction(int mas1[])


 
Val ©   (2002-05-28 19:39) [5]

а в случае двумерного массива?


 
VictorT ©   (2002-05-28 20:04) [6]

Для одномерного массива можно ещё записать так:
int MyFunction(int **mas1)
а для двухмерного, соответственно:
int MyFunction(int **mas1)



 
Val ©   (2002-05-28 20:21) [7]

понятно, он определяется как указатель, или указатель на указатель в случае двумерности. Но каким образом с ним работать, когда я пытаюсь передать в функцию массив обявленый как mas1[3][3], то компилятор выдает сообщение о невозможности конвертации mas[3]* в mas ** - а как же тогда передавать статические массивы, то есть, нужно передавать указательна mas1? Но так (*mas1) тоже не верно:(
или я сегодня переработал :(


 
Иля ©   (2002-05-28 22:27) [8]

int *mas;

А когда будешь обращаться, обрабатывай, как-нибудь вроде этого:
mas[y*m+x]


 
Suntechnic ©   (2002-05-28 23:12) [9]

В случае многомерных массивов в С++ размерность должна указываться из расчёта (общая размерность массива -1 ). Т.е. для передачи двухмерного статического массива последняя размерность обязана быть указана. Для трёх мерного- две размерности должны быть указаны и т.д. Подчёркиваю ещё раз. Это касается статических массивов. Т.е. теоретичски int ** p; это есть представление двумерного массива, но на самом деле это всего лишь указаетль на указатель.
Короче для передачи статического двумерного массива необходимо написать:

void fun( int array[][3])// we have to specify at least 1 dimension
{
}
код вызова:
int array[3][3];
fun( array);


Но не обязательно надо иметь дело со статическими массивами. Их можно размещать динамически, тогда описание прототипа ф-ции см. VictorT © (28.05.02 20:04)

А вообще целесообразно для динамических массивов использовать vector из STL. Большинство имеено так и поступает.


 
Val ©   (2002-05-29 11:44) [10]

хм, у меня объявление такое:
const int N = 5;
const int M = 6;
int A[N][N];
int B[M][M];
int SumOfElements(int** mas , int ElNum);

вызов
SumOfElements(A, N);
SumOfElements(B, M);

не верен(компилятор пишет, что нельзя преобразовать int[5]* в int**), что не так?


 
Vitaly ©   (2002-05-29 12:09) [11]

Потому что двумерный статический массив
int a[m][n] не тоже самое, что int **.

Это разные типы данных - о чем тебе и говорит компилятор.

int **a - понимай, как массив указателей на int
(sizeof(a[i]) = sizeof(указатель))
int a[n][m] - массив указателей на массив int[m]
(sizeof(a[i]) = sizeof(int)*m)

Причем первая размерность (N) компилятору нужна только
для резервирования памяти под весь массив. При обращении
к конкретному элементу a[i][j], к базовому адресу массива
прибавляется i * sizeof(a[i])+ j * sizeof(int) и берется
значение по этому адресу.

Соответственно, если различаются базовые описания массивов
(см. sizeof(a[i]), то и адрес соответствующей ячейки будет
различным.

Если чего-то непонятно - мыль.



Страницы: 1 вся ветка

Текущий архив: 2002.07.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
7-1218
petr
2002-04-04 11:05
2002.07.01
Подключение сетевого диска


14-1134
Cobalt
2002-05-28 08:20
2002.07.01
В защиту нравственности


1-969
VDen
2002-06-20 09:19
2002.07.01
Открытие формы в D5


4-1252
lukey
2002-04-22 07:34
2002.07.01
Работы с векторной графикой


7-1227
OlegatoR
2002-04-03 11:35
2002.07.01
TaskBar