![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Pieris |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.4.2009 Где: Питер Репутация: 1 Всего: 1 |
Изучаю Си(до С++ пока дела нет), тема массивы переменной длины(стандарт С99), использую компилятор gcc, включенный в среду Dev-C++(WindowsXp). Это моя первая тема на форуме(надеюсь в правильном разделе) и я честно перелопатил форум в поисках подобных тем, но к сожалению ничего не нашел.
Необходимо было написать программу с использованием функций, в качестве аргументов которых использовалась бы запись в стиле массивов переменной длины - одна для отображения двумерного массива, другая для копирования одного массива в другой. прототипы выглядят так:
определения так:
вызов функций вот так:
проблема заключена в том, что по отдельности, каждая из этих функций работает совершенно нормально( я проверял, закоментировав то одну то другую), но при попытке компиляции, когда они работают вместе, компилер выдает следующее: prior parameter's size depends on 'm' prior parameter's size depends on 'n' confused by earlier errors, bailing out Я честно пытался перевести эти мессаги, но всё что понял, так это то что компилер пытается сказать что-то типа: "размер предыдущего параметра зависит от ...", я не понимаю в чем дело, раздельно друг от друга функции работают, а если компилер хочет сказать что функции как-то связаны - то как такое может быть вообще? тем более что они используют разные переменные. Если у кого-нибудь есть соображения, пожалуйста поделитесь. |
||||||
|
|||||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
замени в аргументах функции double arr[x][y] на double *arr
-------------------- ![]() |
|||
|
||||
Pieris |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.4.2009 Где: Питер Репутация: 1 Всего: 1 |
Chelovek, дружище по-моему ты не врубаешься, я же сказал это стиль массивов переменной длины, характеризующийся тем, что сначала объявляются переменные, а затем они используются в качестве значений размера соответствующего массива, тем более если ты изучал Си, то должен знать что указание в качестве параметра простого указателя ничего не даст потомучто имя массива это адрес его первого элемента, кот. сам в свою очередь может быть массивом, например 5-ти элементов типа int, и указатель на int , такй как int *ptr работь не будет, но всё равно спасибо. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
Врубаться, я врубаюсь. С одномерными массивами можно поступить так, как я сказал. Но с двухмерными, почему-то не работает, сейчас проверил, хз почему, пытаюсь разобраться.
-------------------- ![]() |
|||
|
||||
Pieris |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.4.2009 Где: Питер Репутация: 1 Всего: 1 |
объяви указатель вот так: (*ptr)[ n ], где n - размерность твоего массива, ну например если массив int array[3][5], то нужный указатель будет (*ptr)[5] - и всё будет работать (скобки в (*) обязательны), НО пардон, мы отклоняемся от темы. |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
Cheloveck,
Но с двухмерными, почему-то не работает потому что вот это: массива это адрес его первого элемента неправда, и двумерный массив расположен в памяти не так как массив указателей. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
Вот тут твоя проблема обсуждается. Почитай, может поможет. Практически то, что я и сказал))
-------------------- ![]() |
|||
|
||||
Pieris |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.4.2009 Где: Питер Репутация: 1 Всего: 1 |
Во-первых я не понял, для меня ли твой мессидж, во-вторых ссылка не открывается, в-третьих варианты с традиционной записью параметров в стиле указателей или в стиле обычных массивов меня просто В ДАННОМ случае не интересуют, если ты представляешь что есть массив переменной длины и почему он так называется, то подобные ссылки и советы - просто бесполезный флуд. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
Я отлично представляю, что есть массив переменной длины и как они лежат в памяти, если тебе не устраивают классические решения, то сорри. З.Ы. ссылка с другого форума, по ходу тут их лочат, но там предлагаются традиционные решения с указателями... -------------------- ![]() |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Cheloveck, ты, скорее всего, путаешь массив переменной длины с динамическим массивом, отсюда и непонятки.
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
Pieris |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.4.2009 Где: Питер Репутация: 1 Всего: 1 |
я не хотел быть резок, просто логично предположить что если функции по отдельности работают, значит их определения и вызовы совершенно корректны, и в даном случае неважно как массивы расположены в памяти, но компилятор ругается и не компилит, когда эти ф-ции исп-ся совместно, вот в чем вопрос. А по поводу традиционных решений - упражнение звучит так: "напишите функции с исп. в кач. аргументов запись в стиле массивов переменной длины", я могу написать их традиционно, но это просто не будет решением задачи. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
напрасное обвинение, повнимательнее надо быть, там всего лишь пропущено двоеточие ![]() вот исправленная ссылка: http://www.linux.org.ru/view-message.jsp?msgid=658543 ![]() Это сообщение отредактировал(а) mes - 24.4.2009, 23:33 |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Чистое предположение: 1. Связаны функции общими дефайнами - надо смотреть дефайны и где определены и как объявлены массивы. |
|||
|
||||
Pieris |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 24.4.2009 Где: Питер Репутация: 1 Всего: 1 |
Определения функций я дал выше, компилер ругается не на вызовы функций а именно на определения, так что никаких общих дефайнов, и к тому же я пытался передавать параметры с исп. просто чисел наподобии:
но это ничего не меняет - прога не компилится... |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Приведите полный текст, если он не большой
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |