Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-931
alextov
2002-06-06 11:29
2002.07.01
Проблема использования view в TOraTable (ODAC)


1-963
Lizard
2002-06-19 12:53
2002.07.01
Как приаттачить к письму несколько файлов ?


7-1231
Дмитрий Иванов
2002-03-31 05:25
2002.07.01
проверка диска в сидироме


3-875
Ulugbek
2002-06-06 16:26
2002.07.01
Мастера опять проблема!


4-1249
spiderman
2002-05-03 13:09
2002.07.01
Сообщение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский