Форум: "Потрепаться";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
Внизмассивы открытого типа в С/С++ Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c