Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массивы переменой длины в кач. аргументов функции, неясная ошибка при компиляции (Яз. Си) 
V
    Опции темы
Pieris
Дата 24.4.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



     Изучаю Си(до С++ пока дела нет), тема массивы переменной длины(стандарт С99), использую компилятор gcc, включенный в среду Dev-C++(WindowsXp). Это моя первая тема на форуме(надеюсь в правильном разделе) и я честно перелопатил форум в поисках подобных тем, но к сожалению ничего не нашел.
Необходимо было написать программу с использованием функций, в качестве аргументов которых использовалась бы запись в стиле массивов переменной длины - одна для отображения двумерного массива, другая для копирования одного массива в другой.
прототипы выглядят так:
Код

void show_varr(int x, int y, double arr[x][y]);
void copy_varr(int n, int m, double arr_s[n][m], double arr_t[n][m]);

определения так:
Код

void show_varr(int x, int y, double arr[x][y])
{
     int i, j;
     for(i = 0; i < x; i++)
     {
        for(j = 0; j < y; j++)
           printf("%.1f ", arr[i][j]);
        putchar('\n');
     }
}
void copy_varr(int n, int m, double arr_s[n][m], double arr_t[n][m])
{
     int i, j;
     for(i = 0; i < n; i++)
     {
        for(j = 0; j < m; j++)
           arr_t[i][j] = arr_s[i][j];
     }
}

вызов функций вот так:
Код

show_varr(ROWS, COLS, source2d);                  // ROWS и COLS определены заранее при пом. #define
copy_varr(ROWS, COLS, source2d, target2d);  // source2d и target2d - обычные двум. массивы
// первый из которых проинициализирован нек. значениями, а второй нулями

проблема заключена в том, что по отдельности, каждая из этих функций работает совершенно нормально( я проверял, закоментировав то одну то другую), но при попытке компиляции, когда они работают вместе, компилер выдает следующее:
 prior parameter's size depends on 'm' 
 prior parameter's size depends on 'n' 
 confused by earlier errors, bailing out 
Я честно пытался перевести эти мессаги, но всё что понял, так это то что компилер пытается сказать что-то типа: "размер предыдущего параметра зависит от ...", я не понимаю в чем дело, раздельно друг от друга функции работают, а если компилер хочет сказать что функции как-то связаны - то как такое может быть вообще? тем более что они используют разные переменные.
Если у кого-нибудь есть соображения, пожалуйста поделитесь.
PM MAIL ICQ   Вверх
Cheloveck
Дата 24.4.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



замени в аргументах функции double arr[x][y] на double *arr


--------------------
user posted image
PM Jabber   Вверх
Pieris
Дата 24.4.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



Цитата

замени в аргументах функции double arr[x][y] на double *arr 

Chelovek, дружище по-моему ты не врубаешься, я же сказал это стиль массивов переменной длины, характеризующийся тем, что сначала объявляются переменные, а затем они используются в качестве значений размера соответствующего массива, тем более если ты изучал Си, то должен знать что указание в качестве параметра простого указателя ничего не даст потомучто имя массива это адрес его первого элемента, кот. сам в свою очередь может быть массивом, например 5-ти элементов типа int, и указатель на int , такй как int  *ptr работь не будет, но всё равно спасибо.
PM MAIL ICQ   Вверх
Cheloveck
Дата 24.4.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Врубаться, я врубаюсь. С одномерными массивами можно поступить так, как я сказал. Но с двухмерными, почему-то не работает, сейчас проверил, хз почему, пытаюсь разобраться.


--------------------
user posted image
PM Jabber   Вверх
Pieris
Дата 24.4.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



Цитата

Врубаться, я врубаюсь. С одномерными массивами можно поступить так, как я сказал. Но с двухмерными, почему-то не работает, сейчас проверил, хз почему, пытаюсь разобраться. 

объяви указатель вот так: (*ptr)[ n ], где n - размерность твоего массива, ну например если массив int array[3][5], то нужный указатель будет (*ptr)[5] - и всё будет работать (скобки в (*) обязательны), НО пардон, мы отклоняемся от темы.
PM MAIL ICQ   Вверх
Rififi
Дата 24.4.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Cheloveck
Но с двухмерными, почему-то не работает
потому что вот это:
массива это адрес его первого элемента
неправда, и двумерный массив расположен в памяти не так как массив указателей.
PM MAIL   Вверх
Cheloveck
Дата 24.4.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Вот тут твоя проблема обсуждается. Почитай, может поможет. Практически то, что я и сказал))


--------------------
user posted image
PM Jabber   Вверх
Pieris
Дата 24.4.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



Цитата

Вот тут твоя проблема обсуждается. Почитай, может поможет. Практически то, что я и сказал)) 

Во-первых я не понял, для меня ли твой мессидж, во-вторых ссылка не открывается, в-третьих варианты с традиционной записью параметров в стиле указателей или в стиле обычных массивов меня просто В ДАННОМ случае не интересуют, если ты представляешь что есть массив переменной длины и почему он так называется, то подобные ссылки и советы - просто бесполезный флуд.
PM MAIL ICQ   Вверх
Cheloveck
Дата 24.4.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата

если ты представляешь что есть массив переменной длины и почему он так называется, то подобные ссылки и советы - просто бесполезный флуд

Я отлично представляю, что есть массив переменной длины и как они лежат в памяти, если тебе не устраивают классические решения, то сорри.

З.Ы. ссылка с другого форума, по ходу тут их лочат, но там предлагаются традиционные решения с указателями...


--------------------
user posted image
PM Jabber   Вверх
Dov
Дата 24.4.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Cheloveck, ты, скорее всего, путаешь массив переменной длины с динамическим массивом, отсюда и непонятки. 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Pieris
Дата 24.4.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



Цитата

Я отлично представляю, что есть массив переменной длины и как они лежат в памяти, если тебе не устраивают классические решения, то сорри.

я не хотел быть резок, просто логично предположить что если функции по отдельности работают, значит их определения и вызовы совершенно корректны, и в даном случае неважно как массивы расположены в памяти, но компилятор ругается и не компилит, когда эти ф-ции исп-ся совместно, вот в чем вопрос.
А по поводу традиционных решений - упражнение звучит так: "напишите функции с исп. в кач. аргументов запись в стиле массивов переменной длины", я могу написать их традиционно, но это просто не будет решением задачи.
PM MAIL ICQ   Вверх
mes
Дата 24.4.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Pieris @  24.4.2009,  22:09 Найти цитируемый пост)
во-вторых ссылка не открывается

Цитата(Cheloveck @  24.4.2009,  22:15 Найти цитируемый пост)
З.Ы. ссылка с другого форума, по ходу тут их лочат, 

напрасное обвинение, повнимательнее надо быть, там  всего лишь пропущено двоеточие  smile 
 вот исправленная ссылка: http://www.linux.org.ru/view-message.jsp?msgid=658543
smile

Это сообщение отредактировал(а) mes - 24.4.2009, 23:33


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 24.4.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Pieris @  24.4.2009,  20:46 Найти цитируемый пост)
а если компилер хочет сказать что функции как-то связаны - то как такое может быть вообще? тем более что они используют разные переменные.
Если у кого-нибудь есть соображения, пожалуйста поделитесь. 

Чистое предположение:
1. Связаны функции общими дефайнами - надо смотреть дефайны и где определены и как объявлены массивы.
PM MAIL ICQ   Вверх
Pieris
Дата 24.4.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



Цитата

Чистое предположение:
1. Связаны функции общими дефайнами - надо смотреть дефайны и где определены и как объявлены массивы. 

Определения функций я дал выше, компилер ругается не на вызовы функций а именно на определения, так что никаких общих дефайнов, и к тому же я пытался передавать параметры с исп. просто чисел наподобии:
Код

show_varr(3, 5, sourse2d);

но это ничего не меняет - прога не компилится...
PM MAIL ICQ   Вверх
Anikmar
Дата 24.4.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Приведите полный текст, если он не большой
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.