![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Mpak |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 12.11.2006 Репутация: нет Всего: 7 |
Например Векторы мы передаем
в описании пишется
А как с двумерными??? Это сообщение отредактировал(а) Mpak - 21.12.2006, 13:31 -------------------- В любой откомпилированной программе есть, по крайней мере, одна ошибка... P.S. А у меня их минимум две... |
||||
|
|||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: нет Всего: 34 |
По-моему так:
|
|||
|
||||
| TaNK |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
-------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
||||||||
|
|||||||||
| Mpak |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 12.11.2006 Репутация: нет Всего: 7 |
alberth, почему именно [10]?
Добавлено @ 13:53 TaNK, что значит ** и uc -------------------- В любой откомпилированной программе есть, по крайней мере, одна ошибка... P.S. А у меня их минимум две... |
|||
|
||||
| TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
** - указатель на указатель массивов uc - название ее..если хочешь могу код полность привести, чтоб понятно было? Добавлено @ 14:15 только это для матрицы пример, подойдет он тебе? -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
| Mpak |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 12.11.2006 Репутация: нет Всего: 7 |
TaNK, Приведи, надеюсь он сильно сложный
-------------------- В любой откомпилированной программе есть, по крайней мере, одна ошибка... P.S. А у меня их минимум две... |
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: нет Всего: 34 |
||||
|
||||
| TaNK |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
да нет...не очень он и трудный этот пример
-------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
||||
|
|||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
alberth всеж имхо прав, говоря о передаче именно массива. Скобки только левые крайнии могут не содержать размера. При этом sizeof(такое) вовсе вам не даст размер массива.. даст размер указателя) Передается только он. всеж синтаксически если говорить тогда так:
и малоли что никто не пишет.. я вот недавно в реальном проекте такое увидел....долго думал) как вариант можно использовать void* в параметрах ф-ции) на любителя... Это сообщение отредактировал(а) jonie - 22.12.2006, 01:41 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
извините ерунду сморозил -
int **uc - указатель на массив указателей! в примере выше -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
| jonie |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
вот так это выглядит в памяти при разыменовании...
массива там нет. Да, при доступе это выглядит как доступ к массиву (потому как раскрывается uc[i][j] компилятором как *((*uc + i)+j) что через sizeof() распишется как *((*uc + i*sizeof(int*))+j*sizeof(int)) что в точности дает доступ к элементу), но имхо называть это массивом никак нельзя.. Указатель на указатель и не более.
а это выглядит воообще как : int* (*name)[]; Это сообщение отредактировал(а) jonie - 22.12.2006, 11:49 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||
|
|||||||
| TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
Значит Хомоненко - тоже ерунду сморозил...это я кажется там посмотрел....
-------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Немного поправлю. Объявление вида int *a; int b[100]; Второе - однозначно массив, а первое указатель. Но: a = new int[100]; Теперь a является массивом Пу сути дела - имя массива с точки зрения типа С++ является указателем на тип массива. Поэтому говорить, что вижу указатель, но не вижу массива немножко односторонне. К многомерным массивам это также относится. Объявление вида int a[2][3] является по сути указателем на массив указателей т.е. int*[2]; Это два указателя на массивы из трех элементов. А так как массив (имя массива) это и есть указатель - то значит два указателя на указатели. Данное и реализуется приведенным выше примером работы с матрицами |
|||
|
||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
ф-ция в С не может возращать ф-ции или массивы....указатели на них может (ANSI ISO\IEC 14882-2003(E) вроде гдето там есть имеенно такое определение.... )... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Таки нет. Эта штука создаст массив в стеке из 6 элементов. Никаких указателей на указатели. Другое дело, что локально a[i][j] будет обрабатываться компилером нормально, но по-другому: Что-то типа: *(a + i*n + j); где n - вторая размерность массива. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Anikmar, следует не забывать, что b - const int*
Это сообщение отредактировал(а) Xenon - 22.12.2006, 16:43 |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Естественно не может, но если попробовать так:
Спору нет - естественно. В статическом варианте при попытке сделать так: char **a; char b[3][2]; a = b; Компилятор выдаст ошибку о преобразовании типов и напишет примерно следующее "Не могу преобразовать char*[2] в char** У меня именно так выдал - из этого я сделал вывод, что статическое объявление компилятор также считает массивом указателей. |
||||
|
|||||
| KelTron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Если точнее то имя массива - указатель на его первый элемент
Скорее массивом указателей int *a[2], а указателем на массив указателей является a (int** a) -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
У всех так выдает. Но это ситуации не меняет. Читаем Страуструпа и Стандарт. Компилер в этом случае трактует получившееся как массив указателей. Но указателя на указатели там нет. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Это уже к семантике русского языка. Массив указателей или указатель на указатели... В общем вы поняли Я имел в ввиду типы переменных. объявление int a[5]; С точки зрения С++ типом переменной a является "Указатель на int" А вот значение этого указателя указывает на первый элемент массива. |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Anikmar, так тоже верно
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет, не к семантике русского языка.
Нет, не является. Читаем, опять-таки, Страуструпа. a - не переменная даже, так как она не имеет типа. При объявлении массива char a[3][2]; в памяти не выделяется ни байта ни под один указатель. Это сообщение отредактировал(а) JackYF - 22.12.2006, 17:44 |
||||
|
|||||
| lasalexx |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 19.7.2004 Где: Tbilisi Репутация: нет Всего: 1 |
вот уже несколько дней думаю как можно передать статистический масив функции. в конце концов сделал вот так:
но выдает ошибку:
а ведь когда делаю с одномерным масивом
всё нормально получается. Так в чём разница? И можно ли вообще сделать то что я хочу не используя динамическую память? |
||||||
|
|||||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
|
|||
|
||||
| lasalexx |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 19.7.2004 Где: Tbilisi Репутация: нет Всего: 1 |
Но тут MyArray матрица 3х4, а я хочу что б функция работала на все размеры. |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
JusTalionis, тогда используй двойной указатель(**) и динамическое выделение памяти
|
|||
|
||||
| threef |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Нет необходимости использовать динамическое выделение памяти. А вот внутри функции придется "попотеть" - две квадратных скобки работать откажутся.
Добавлено @ 17:25 или проще :
Это сообщение отредактировал(а) threef - 23.2.2007, 17:23 |
||||
|
|||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ну если С-style не принципиален, то:
Это сообщение отредактировал(а) Daevaorn - 23.2.2007, 17:31 |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
]threef, это извращения, зачем так издеваться над своим (и чужим мозгом), когда проще выделить память динамически..
|
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
vinter, извращения - это то, к чему ты не привык ? Так и пиши, "мне это не нравится". Остальное - тема для обсуждения, а не "извращения". Посчитай обращения к менеджеру кучи при динамическом выделении памяти так, как это предлагаешь ты. А не хочешь издеваться над мозгом - пользуй готовые коллекции.
|
|||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
зачем такой гимар с указателями...шаблоны самый удобный способ!
template<typename Type, const int size_i, const int j> void func(Type (&mas)[size_i][size_j]){} int main() { int mas[10][10]; func(mas); return 0; } --------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
ip127001, извини, не понял вообще твоей задумки...
Это на каждый размер массива будет свой экземпляр функции... гм... вообще неожиданный вариант. Не знаю. Мне не очень нравится. Гораздо понятнее и "принятее" все-таки передавать размеры в функцию и не мучится. |
|||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
в теме написанно, что нужно передать двумерный массив...что может быть проще этого?
а размеры передавать..так же для каждой размерности свою фукцию! только если размерность ограниченна....скажем 3. ток тогда можно типа этого написать
так? иль я что-то не понял? --------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
с чем?
если ты про этот пример...то так же как с обычным массивом...
--------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| ip127001 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 24.11.2006 Где: Omsk Репутация: -2 Всего: -1 |
то что разное это я знаю......при том чушь я какую-то написал 2 раз...пардон...нормально 2 мерный массив передавать указателю...стыдно, стыдно
--------------------
aqua currit et debere currere ut currere solebat |
|||
|
||||
| tonjo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
При работе с двумерными массивами работаю именно так, но вот при создании таким способом нескольких массивов больших размеров [32][256] типа int и double, программа вылетает с сообщением, что больше она не может создать ничего с помощью new (2-3 массива создает лекго!). Пишу на C++.NET Вопрос: кто-нибудь сталкивался с подобным? и ещё вопрос: можно ли ненужные уже массивы удалять из памяти? Использование delete вызывает ошибку памяти. Что делать? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
значит где-то "не так" работаешь - портишь кучу. выходишь за пределы или что-то похожее... по той же причине. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |