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

Поиск:

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


Новичок



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

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



привожу полный код:
Код

#include<stdio.h>
#define ROWS 3
#define COLS 5
void show_varr(int x, int y, double arr[x][y]); // форма без имен не поддерж. gcc
void copy_varr(int n, int m, double arr_s[n][m], double arr_t[n][m]);
int main(void)
{
    double source2d[ROWS][COLS] = { {1.1,2.2,3.3,4.4,5.5},
                                    {6.6,7.7,8.8,9.9,1.1},
                                    {2.2,3.3,4.4,5.5,6.6}  };
    double target2d[ROWS][COLS] = {0.0};                   // заполнил нулями
    printf("source2d:\n");
    show_varr(ROWS, COLS, source2d);
    printf("\ntarget2d:\n");
    show_varr(ROWS, COLS, target2d);
    copy_varr(ROWS, COLS, source2d, target2d);
    printf("\nAfter using function copy_varr(), target2d:\n");
    show_varr(3, 5, target2d);
    
    getchar();
    
    return 0;
}
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]) // эту строку подсвечивает  компилер стр. 34 (см ниже)
{
     int i, j;
     for(i = 0; i < n; i++)
     {
        for(j = 0; j < m; j++)
           arr_t[i][j] = arr_s[i][j];   // а это стр. 40 на кот. компилер ссылается в посл. мессаге об ошибках  (см. ниже)
     }
}


а ругается на др. фукцию:
Цитата

 C:\Dev-Cpp\Проекты\глава10\упр10-8.c In function `show_varr': 
34 C:\Dev-Cpp\Проекты\глава10\упр10-8.c prior parameter's size depends on 'm' 
34 C:\Dev-Cpp\Проекты\глава10\упр10-8.c prior parameter's size depends on 'n' 
34 C:\Dev-Cpp\Проекты\глава10\упр10-8.c prior parameter's size depends on 'm' 
34 C:\Dev-Cpp\Проекты\глава10\упр10-8.c prior parameter's size depends on 'n' 
40 C:\Dev-Cpp\Проекты\глава10\упр10-8.c confused by earlier errors, bailing out 

PM MAIL ICQ   Вверх
Cheloveck
Дата 25.4.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

#include <cstdio>

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');
    }
}

int main()
{
    double test[2][2];
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
            test[i][j] = i + j;
    }
    show_varr(2, 2, test);
    return 0;
}

Код

$ g++ main.cpp
main.cpp:3: error: ‘x’ was not declared in this scope
main.cpp:3: error: ‘y’ was not declared in this scope
main.cpp: In function ‘void show_varr(int, int)’:
main.cpp:9: error: ‘arr’ was not declared in this scope
main.cpp: In function ‘int main()’:
main.cpp:3: error: too many arguments to function ‘void show_varr(int, int)’
main.cpp:22: error: at this point in file


У меня, допустим, не компилится даже одна (g++ 4.3.3-2)(gcc то же самое)... И ещё, компилятор от майкрософт вообще не потдерживает массивы с переменной длиной.

Это сообщение отредактировал(а) Cheloveck - 25.4.2009, 00:03


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


Эксперт
****


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

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



Как я и предполагал - это чудо на BDS компилиться не хочет.
Я бы делал так:
Код

#include<stdio.h>
#define ROWS 3
#define COLS 5
void show_varr(int x, int y, double arr[ROWS][COLS]); // форма без имен не поддерж. gcc
void copy_varr(int n, int m, double arr_s[ROWS][COLS], double arr_t[ROWS][COLS]);

PM MAIL ICQ   Вверх
Dov
Дата 25.4.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Anikmar,  а нафига тогда первые 2 параметра у этих ф-ций?


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


Новичок



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

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



Цитата

Я бы делал так:
 
Код

#include<stdio.h>
#define ROWS 3
#define COLS 5
void show_varr(int x, int y, double arr[ROWS][COLS]); // форма без имен не поддерж. gcc
void copy_varr(int n, int m, double arr_s[ROWS][COLS], double arr_t[ROWS][COLS]);
 

да всё бы хорошо, только аргументы функций заданные в начале( int x, int y и тд) и есть переменные, описывающие размерность массива, и именно поэтому они объявляются раньше массива, стандарт С99 даже регламентирует форму записи без указния имен переменных в прототипах функций, использующих массивы переменной длины - вот так:
Код

void show_array(int , int, arr[*][*]);

я это тоже пробовал, но в этом случае gcc честно признался, что он ещё не поддерживает это нововведение стандарта С99
PM MAIL ICQ   Вверх
Anikmar
Дата 25.4.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dov @  25.4.2009,  00:14 Найти цитируемый пост)
Anikmar,  а нафига тогда первые 2 параметра у этих ф-ций? 

А фиг его знает!  smile 

Я просто так никогда не делал.  smile 


PM MAIL ICQ   Вверх
Pieris
Дата 25.4.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Chelovek, ты вот пишешь:
Цитата

У меня, допустим, не компилится даже одна (g++ 4.3.3-2)(gcc то же самое)... И ещё, компилятор от майкрософт вообще не потдерживает массивы с переменной длиной.

это и должно так быть потому что С99 это точка расхождения Си и С++, компилятор С++ и не будет это компилить, даже с одной такой функцией.Массивы переменной длины включены в стандарт си для облегчения исп. библиотек FORTRAN, кот. славится своими функциями для научных расчетов. Попробуй откомпилить задав компилятором по умолчанию Си, а не С++.
PM MAIL ICQ   Вверх
J0ker
Дата 25.4.2009, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Pieris @  24.4.2009,  20:46 Найти цитируемый пост)
 prior parameter's size depends on 'm' 
 prior parameter's size depends on 'n' 

gcc-3.4 сломан:
http://gcc.gnu.org/gcc-3.4/c99status.html
http://gcc.gnu.org/ml/gcc-bugs/2004-04/msg02261.html

Добавлено через 2 минуты и 20 секунд
я вам вообще рекомендую забить на эту мертвую фичу - переходите на С++ и юзайте динамические массивы


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


Новичок



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

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



J0ker, спасибо, я думаю это и есть ответ, а переходить на С++ мне рановато, там более я решил сначала в достаточной мере освоить чистый Си.

Я уже было руки опустил, но тут неожиданно посоветовали включить опцию командной строки -std=c99, в среде 
Dev-C++ это делается(для тех кому придется сталкиваться) через Сервис-Параметры компилятора- и на первой вкладке поставить галочку напротив "Добавить следующие команды к запуску компилятора", после чего в поле пониже написать -std=c99 (и ессно ОК). Но есть одна особенность - при включенной опции Оптимизации, компилер даже при исп. опции -std=c99 не компилит, так что её придется отключить.

Одним словом решение надено, я думаю тема закрыта!   smile 

Это сообщение отредактировал(а) Pieris - 25.4.2009, 11:51
PM MAIL ICQ   Вверх
Anikmar
Дата 25.4.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(J0ker @  25.4.2009,  01:34 Найти цитируемый пост)
я вам вообще рекомендую забить на эту мертвую фичу - переходите на С++ и юзайте динамические массивы

Золотые слова. Я даже сперва не врубился - что это за прикол.

Цитата(Pieris @  25.4.2009,  11:07 Найти цитируемый пост)
 а переходить на С++ мне рановато

Ох... Чем изучать умирающие фичи - лучше сразу на плюсы. ИМХО: гораздо тяжелее переходить на плюсы хорошо освоив С, чем его зная чисто поверхностно.

PM MAIL ICQ   Вверх
J0ker
Дата 25.4.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Pieris @  25.4.2009,  11:07 Найти цитируемый пост)
J0ker, спасибо, я думаю это и есть ответ, а переходить на С++ мне рановато, там более я решил сначала в достаточной мере освоить чистый Си.

С++ не является расширением С - никакой связи тут нет, можете смело переходить


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 26.4.2009, 09:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Anikmar @  25.4.2009,  18:13 Найти цитируемый пост)
Ох... Чем изучать умирающие фичи - лучше сразу на плюсы.

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
J0ker
Дата 26.4.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MAKCim @  26.4.2009,  09:57 Найти цитируемый пост)
код только усложняется как в плане его понимания

ну само-собой
автомобиль-то завсегда сложнее велосипеда  smile 

Цитата(MAKCim @  26.4.2009,  09:57 Найти цитируемый пост)
так и в низкоуровневой реализации семантики

это смотря какую семантику реализовавать
например если из автомобиля реализовывать семантику велосипеда, то да, усложняется
тока нахрена оно надо? искусства ради? ну так мы уже наблюдали потуги реализации семантики автомобиля велосипедами - и смех и грех  smile 


--------------------
user posted image
PM MAIL   Вверх
Anikmar
Дата 26.4.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @  26.4.2009,  09:57 Найти цитируемый пост)
а лучше не быть таким категоричным
плюсы не панацея

Ну я не на столько категоричен, чтобы плюсы назвать панацеей. Я так думаю только в сравнение конкретно  Си и плюсов. Например сравнивать плюсы и делфи я не возьмусь ( в виду плохого знания делфи). А плюсы и С сравнивать могу - так как сам начинал с Си. И считаю, что нет вещей, которые с одинаковой трудоемкостью можно было бы сделать на СИ и нельзя на плюсах, а вот наоборот - спорно. Так что думаю все-таки плюсы более стоящая для изучения вещь.

PM MAIL ICQ   Вверх
MAKCim
Дата 26.4.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Anikmar
не вижу преимуществ С++ перед С

ООП упоминать не стОит  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0952 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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