![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Dark Elf |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 26.12.2003 Где: Брисбен Репутация: 9 Всего: 10 |
Привет всем
Есть такая задача - есть следующий код:
Выдаёт ошибки: [C++ Error] Approximator.cpp(185): E2034 Cannot convert 'long double ( *)[4]' to 'long double * *' [C++ Error] Approximator.cpp(185): E2342 Type mismatch in parameter 'a' (wanted 'long double * *', got 'long double ( *)[4]') Вопрос: как передать данный массив в функцию Zeidel? Заранее спасибо Оффтоп:сегодня все интересуются указателями я смотрю |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
У тебя видимо первый параметр функции типа long double **, а должен быть типа long double (*)[4]
Вообще двухмерный массив передается в функцию как указатель на одномерный массив. long double ** это не очень логично. Напиши такой прототип Zeidel(long double (*arr)[4], /*...*/) Это сообщение отредактировал(а) LPBOY - 3.8.2005, 19:07 --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Dark Elf |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 26.12.2003 Где: Брисбен Репутация: 9 Всего: 10 |
Функцию я переделать могу - но мне нужно будет передавать и long double [5][5] и т.д. я бы хотел что-то универсальное т.к. выяснил что boost::multi_array не катит
|
|||
|
||||
| Kaskad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 24.9.2004 Репутация: нет Всего: 3 |
а трёх и более мерный так же? И зачем скобки: int *[4] int (*)[4] в чём фишка? -------------------- Well come to America! |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Указатели на массивы с разными размерами - это разные типы... Вывод один: писать шаблон...
Сейчас еще подумаю и напишу че-нить --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Шаблон еще хорош тем что имеет замечательную особенность - выводить размеры статического массива, код может получиться проще и красивее.
Кстати если ты собирался "передавать и long double [5][5] и т.д" почему не передавал в параметрах размеров? С помощью шаблонов это можно красиво избежать. --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Dark Elf |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 26.12.2003 Где: Брисбен Репутация: 9 Всего: 10 |
Ты имеешь в виду так:
Тут возникает следуюущая проблема: Как сделать так? int n = 5; long double ** x = new long double[5][5]; Т.е. как создавать многомерные динамические массивы? Оффтоп:ой как плохо что для Борланда нету boost::multi_array |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Dark Elf
Не печалься!
Это сообщение отредактировал(а) Void - 3.8.2005, 19:50 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| LPBOY |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Нет так не будет работать, надо так
Передавать надо ссылку на массив.
Ну если тебе нужны еще и динамические массивы, передавай отдельно размер... а шаблоны тогда не пойдут. --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||
|
|||||||
| Dark Elf |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 26.12.2003 Где: Брисбен Репутация: 9 Всего: 10 |
LPBOY - спасибо
Void - я сам в своё время написал двумерный массив, правда с использование оператора () например MyArray(3,2) = 7; но хотел просто обойтись стандартными средствами |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Dark Elf
А зачем? Любой адаптер будет в 50-100 строчек, и при этом удобнее в использовании и типобезопаснее кода с указателями. Шаблонный вариант LPBOY тоже неплох, но он ведет к генерации экземпляра функции Zeidel для каждой размернсоти массива. Если тебя это не волнует - имхо, это наилучший вариант. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Вообще-то я, в отличие от Void'a ничего такого не предложил... Только пару советов попытался дать... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| LPBOY |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Kaskad,
Если мы передаем в функцию массив, то происходит преобразование массива в указатель. Поэтому следующие объявления функций:
абсолютно эквивалентны. 2-хмерный массив, можно сказать что это одномерный массив элементами которого являются другие одномерные массивы. Поэтому после преобразования получаем указатель на одномерный массив.
Аналогично с 3-хмерными массивами
Объявление int (*arr)[5]; означает указатель на массив из 5-ти элементов int. А без скобок: int *arr[5]; значит массив из 5-ти указателей на int. Если понятно почему, остальное можешь не читать... Б.Эккель предлагает так читать такие выражения: -сначала начинаем читать от имени переменной (т.е. arr) -затем идем направо пока не встретим скобку -затем налево опять пока не встретим скобку, затем опять направо и т.д. и попутно произносим то что встречается на пути * произносим "указатель" [5] произносим "массив из 5 элементов" Например: int (*arr)[5], начинаем от имени переменной (говорим "arr это...") теперь идем направо и сразу же встречаем скобку (пока молчим потому что ничего не встретили), идем налево пока не встретим другой скобки, и попутно мы встретили * поэтому продолжаем "arr это... указатель..." Встретили скобку опять идем направо, встречаем [5], поэтому продолжаем "arr это... указатель...на массив из 5 элементов" Идем налево, встречаем int и заканчиваем "arr это... указатель...на массив из 5 элементов... типа int" В случае int *arr[5] получится "arr это... массив из 5-ти элементов... типа int*(т.е. указателей на int)" Теперь чуть-чуть посложнее void * (*(*fp)(int))[5]; (int) - читается "функция принимающая аргумент типа int" Читаем "fp это... указатель... на функцию принимающую аргумент типа int... которая возвращает указатель... на массив из 5-ти элементов ... типа void* (т.е. указателей на void)" А такие выражения int (*)[4], в которых пропущены имена переменных означают соответствующие типы. --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||||||
|
|||||||||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
А почему бы в духе C не передавать long ***a в функцию. А массив как-нибудь так:
Ведь это, по-моему самое простое.. 2 LPBOY - клевая цитатка. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |