Модераторы: 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   Вверх
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   Вверх
math64
Дата 26.4.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Pieris @  25.4.2009,  00:39 Найти цитируемый пост)
это и должно так быть потому что С99 это точка расхождения Си и С++, компилятор С++ и не будет это компилить

Точка расхождения - создание C++. В C++ модификаторы const, extern, static имеют другое значение чем в C.
const в C++ = static const в С
Предварительное объявление переменной extern и затем static даёт в C++ extern, а в C static.
PM   Вверх
mes
Дата 26.4.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MAKCim @  26.4.2009,  20:41 Найти цитируемый пост)
не вижу преимуществ С++ перед С

я с Си плохо знаком, вот что напрашивается :
возможность перегрузки функций, типобезопасные шаблоны, средства разделения доступа (public, private в классе)
виртуальные функции и т.д.
 smile 


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


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


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

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



счас выльется воды на 20 страниц и на этом всё закончится.. проходили уже..  smile 


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


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


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

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



mes

преимущества где?


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

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


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


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

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



Цитата(MAKCim @  26.4.2009,  21:19 Найти цитируемый пост)
mes, 

преимущества где? 

тут тогда надо уточнить, что подразумевается под преимуществами, если приведенное выше не подпадает в эту категорию. 
и помойму пока не поздно перенести этот этот оффтоп в холивар. smile



Это сообщение отредактировал(а) mes - 26.4.2009, 22:29


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


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


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

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



Цитата(mes @  26.4.2009,  22:29 Найти цитируемый пост)
тут тогда надо уточнить, что подразумевается под преимуществами

что делает его более эффективным во всех смыслах


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

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


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


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

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



Цитата(MAKCim @  26.4.2009,  21:33 Найти цитируемый пост)
что делает его более эффективным во всех смыслах 

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



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


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


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

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



mes
Цитата(MAKCim @  26.4.2009,  22:33 Найти цитируемый пост)
во всех смыслах 




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

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


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


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

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



Цитата(mes @  26.4.2009,  21:38 Найти цитируемый пост)
во всех смыслах 

учитывая то, что стандартный С++ позволяет практически все то, что и стандартный Си,
но помимо этого имеет кучу дополнительных средств, начиная от перегрузки функции и заканчивая набором стандартных шаблонов,
Вы считаете, что все эти дополнительные возможности не приносят никакой ощутимой эффективности ?





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


Эксперт
****


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

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



Цитата(Dov @  26.4.2009,  22:19 Найти цитируемый пост)
счас выльется воды на 20 страниц и на этом всё закончится.. проходили уже..    

Вот так рождаются баяны  smile .

Это вопрос уже к религиозным войнам относится, хотя странно обсуждать и сравнивать Си и С++. Я понимаю С++ и С# или C++ и Делфи. Лично я, когда появился С++ считал, что Си мне хватит за глаза и незачем изучать какие-то дурацкие веяния типа ООП, классов, перегрузки и т.п. Но мнение свое изменил достаточно быстро.

С точки зрения эффективности уже готового машинного кода - тут вся ответственность лежит на компиляторе. 
С точки зрения эффективности работы программиста - думаю спор просто глупый выйдет - естественно С++ по всем параметрам выиграет перед Си - так как С++ позволит сделать практически все то же, что и Си, а вот наоборот не получится. Так что думаю, что баян здесь развивать не стоит.


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


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


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

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



Цитата(Anikmar @  27.4.2009,  09:17 Найти цитируемый пост)
С точки зрения эффективности работы программиста - думаю спор просто глупый выйдет - естественно С++ по всем параметрам выиграет перед Си - так как С++ позволит сделать практически все то же, что и Си, а вот наоборот не получится.

еще как получится  smile 


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

PM MAIL   Вверх
mes
Дата 27.4.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MAKCim @  27.4.2009,  09:01 Найти цитируемый пост)

еще как получится  smile 

но с ручными затратами. Взять хотя бы тот самый динамический полиморфизм - на cpp практически ничего не надо делать для его воплощения, плюс легко добавлять новые полиморфные типы в иерархию.
А как с этим обстоит в Си ?



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


Эксперт
****


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

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



Единственное что в C сделать проще - инициализацию массивов и структур.
Код

#include <stdio.h>
int a[10] =
{ [5 ... 7] 100 };
struct S {
int a;
int b;
} s = { b: 1000 };
int main(int argc, char**argv) {
int i;
for(i=0; i < 10; i++) printf("%d ", a[i]);
printf("\n%d,%d\n",s.a,s.b);
}

PM   Вверх
mes
Дата 27.4.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(math64 @  27.4.2009,  11:01 Найти цитируемый пост)
{ [5 ... 7] 100 };

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



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


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


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

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



Цитата(mes @  27.4.2009,  11:43 Найти цитируемый пост)
А как с этим обстоит в Си ?

хорошо

Код

struct ops
{
    /* polymorphic functions */

    void (*f1)(void*, int, char);
    void (*f2)(void*, const char*);
    void (*f3)(void*, long);
};

struct base_object
{
    struct ops *ops;
};

struct derived_1_object
{
    struct base_object base_object;
};

struct derived_2_object
{
    struct base_object base_object;
};

struct derived_3_object
{
    struct derived_2_object derived_2_object;
};

void iterate(struct base_object *array, int nr)
{
    int i;

    for (i = 0; i < nr; ++i)
    {
        array->ops->f1(&array[i], i, '0' + (random() % 10));
    }
}



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

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


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


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

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



я даже больше скажу
sysfs и реализация kobject/kset в ядре linux - это сплошной полиморфизм на С
там все предельно просто и эффективно

я вообще-то специально оговорил, что не стОит начинать споры про ООП, т. к ООП != ЯП


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

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


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


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

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



MAKCim,  приведенный код, работает также и на плюсах, однако там так не пишут.
почему если помимо этого способа, есть еще другой, то выбор остановился за вторым ?

И вот еще, а то никак не пойму, Вы считаете, что 
1. тех средств что в Си достаточно, и можно выкрутиться в любой ситуации
2. тех средств что в Си явно достаточно, и предлагаемые возможности С++ просто излишни.

Цитата(MAKCim @  27.4.2009,  12:29 Найти цитируемый пост)
я вообще-то специально оговорил, что не стОит начинать споры про ООП, т. к ООП != ЯП 

так вроде пока не затрагивали: в частности полиморфизм свойствен далеко не только  ООП.

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








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


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


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

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



Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
тех средств что в Си достаточно, и можно выкрутиться в любой ситуации

да

Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
тех средств что в Си явно достаточно, и предлагаемые возможности С++ просто излишни.

да


Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
так вроде пока не затрагивали: в частности полиморфизм свойствен далеко не только  ООП.

ну как бы "полиморфизм-наследование-инкапсуляция"  smile 

Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
Ну а вобще я думаю подобный спор можно решить, только сравнив изящность двух решений одной небольшой, но показательной задачи..

для меня все очевидно
я этих задач уже достаточно много решил

мою позицию никому не навязываю, но и доказывать никому ничего не буду 


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

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


Новичок



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

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



Раньше я конечно просматривал программерские форумы, но пока не поучавствовал сам, не почувствовал, насколько у людей прослеживается тенденция отступать собственно от темы. Вряд-ли это есть хорошо, хотя бы потому, что сторонний человек, придя на интересующую его ветку форума, может просто не увидеть за деревьями леса (читай решения конкретного вопроса за обсуждениями сторонних тем). Не желая поддерживать эту тенденцию, я хочу вкрадце резюмировать информацию по существу вопроса:
  • Массивы переменной длины ДЕЙСТВИТЕЛЬНО существуют и называются ИМЕННО массивами переменной длины (подчеркиваю это, т.к. на другом форуме меня обвинили в том, что я использую терминологию своего препода).
  • Массивы переменной длины применяются ТОЛЬКО в языке Си(без плюсов) и ТОЛЬКО при использовании компилятора, поддерживающего стандарт С99, и совершенно понятно что компиляторы С++ НЕ БУДУТ компилировать такой код ПО ОПРЕДЕЛЕНИЮ.
  • Массивы переменной длины(как можно было-бы подумать) НЕ ИЗМЕНЯЮТ в действительности своей длины и будучи созданным, сохраняют свои размеры, а называются так из-за того, что размерность таких массивов задается не при помощи констант или константных выражений, а при помощи переменных, и именно поэтому, в отличие от традиционного синтаксиса наподобии
    int function(int *ptr, int n) или double function( double arr[][10], int n) - где n ОДНА из размерностей массива, используют запись, где размерность массива задается переменными, объявленными В ОБЯЗАТЕЛЬНОМ порядке РАНЬШЕ, чем объявление массива, использующего эти переменные в качестве размерностей, т.е. например: 
    void funct(int rows, int cols, double arr[rows][cols]) (понятно, что тип возвращаемого функцией значения, как и тип массива может быть любым).
  • Использование МПД имеет ряд ограничений: они объявляются либо в (теле) функции, либо как параметры функции.Кроме того их нельзя инициализировать в объявлении.
  • Приемуществом функций использующих запись в стиле МПД является то, что они могут использоваться для обработки массивов любых размерностей, и поскольку в действительности объявление такого массива в списке параметров функции на самом деле не приводит к созданию массива, фактически такая функция работает(как и в случае старого синтаксиса) с данными переданного ей исходного массива.
  • По поводу ошибок компиляции при использовании синтаксиса в стиле МПД можно сказать следующее: конкретно компилятор GCC по умолчанию использует синтаксис последнего стандарта(т.е. С99), и ЕСЛИ у вас не компилится такой код, попробуйте поэксперементировать с опциями оптимизации, именно это явилось причиной моих злоключений, если вы используете другой компилятор, то убедитесь что он поддерживает стандарт С99, и если это имеет место, но программа попрежнему не компилится, то возможно компилятору нужно явно указать опцию, задействующую возможности стандарта С99(в gcc например это опция командной строки -std=c99, хотя как сказано выше её применение в данной конкретной среде излишне), ЕСЛИ и в этом случае результат отрицательный, попробуйте поиграть с опциями оптимизации, возможно причина кроется именно в этом.
Да простят мне модераторы, неумелое использование тегов.

Это сообщение отредактировал(а) Pieris - 27.4.2009, 23:55
PM MAIL ICQ   Вверх
mes
Дата 28.4.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Pieris @  27.4.2009,  22:50 Найти цитируемый пост)
для обработки массивов любых размерностей

насколько я понимаю, для обработки статических массивов любой размерности.




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


Эксперт
****


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

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



Массив выделяется на стеке, он не статический, но нужно чтобы размер стека был достаточен для размещения такого массива.

Добавлено через 3 минуты и 2 секунды
это про массив исопльзуемый в функции. массив передаваемый через параметры может быть выделен где угодно - хоть статический, хоть на стеке, хоть с помощью malloc().
PM   Вверх
mes
Дата 28.4.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(math64 @  28.4.2009,  09:40 Найти цитируемый пост)
Массив выделяется на стеке, он не статический, но нужно чтобы размер стека был достаточен для размещения такого массива.

Статический массив - противопоставление динамическому массиву и о том где выделено для него память не говорится.

Выражение 
Цитата

для обработки массивов любых размерностей

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

Хотя вполне допускаю, что не совсем точно понял мысль. 
smile




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


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


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

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



mes, массив переменной длины подразумевает то, что его размеры компилятор вычисляет не на этапе компиляции (как у обычных статических массивов, где размеры задаются константами), а во время работы программы. В этом плане, по моему мнению, речь о динамических массивах не идёт, по вышеизложенной причине.   smile

Добавлено @ 12:19
т.е. можно сделать так:
Код
void func(int cols, int rows)
{
    int arr[cols][rows];
}

здесь при каждом вызове ф-ции размеры массива могут меняться.

Это сообщение отредактировал(а) Dov - 28.4.2009, 12:22


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


uploading...
****


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

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



Цитата

здесь при каждом вызове ф-ции размеры массива могут меняться.

 smile это же не будет работать

Добавлено @ 14:16
 smile 
Это шедевр smile 

тема началась с
Цитата

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

развернулась дискуссия на 4 страницы..и на последней странице я вижу сообщение
Цитата

sysfs и реализация kobject/kset в ядре linux - это сплошной полиморфизм на С

 smile вы не загнули ребята?

Добавлено через 7 минут и 3 секунды
Dov

Код

template <int cols, int rows>
void func()
{
    int arr[cols][rows];
}

может вот так имелось ввиду?

Это сообщение отредактировал(а) azesmcar - 28.4.2009, 14:17
PM   Вверх
math64
Дата 28.4.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Имелось ввиду не это
Код

template <int cols, int rows>
void func()
{
    int arr[cols][rows];

}

Здесь при каждом вызове (с разными аргументами) генерируется свой код. И кроме тог cols, rows должны быть константами.
Код

void func(int cols, int rows)
{
    int arr[cols][rows];
   /* do something this arr */
}
int main (int argc, char**argv) {
  if (argc < 3)
    return 1;
  int cols = atoi(arv[1]);
  int rows = atoi(arv[2]);
  if (cols <= 0 || rows <= 0 || cols * rows > 10000)
    return 2;
  func(cols, rows);
  return;
}

PM   Вверх
MAKCim
Дата 28.4.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



azesmcar
Цитата(azesmcar @  28.4.2009,  14:14 Найти цитируемый пост)
это же не будет работать

будет




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

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


uploading...
****


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

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



Цитата

будет

 smile 

Выдаст что-то вроде expected constant expression.

Добавлено через 11 минут и 47 секунд
user posted image

даже если этот код где-то и работает - этот код непереносим.
PM   Вверх
mes
Дата 28.4.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  28.4.2009,  13:51 Найти цитируемый пост)
Выдаст что-то вроде expected constant expression.

не из того стандарта выдержка smile
Цитата(azesmcar @  28.4.2009,  13:51 Найти цитируемый пост)
даже если этот код где-то и работает - этот код непереносим. 


Цитата(Pieris @  27.4.2009,  22:50 Найти цитируемый пост)
Массивы переменной длины применяются ТОЛЬКО в языке Си(без плюсов) и ТОЛЬКО при использовании компилятора, поддерживающего стандарт С99, и совершенно понятно что компиляторы С++ НЕ БУДУТ компилировать такой код ПО ОПРЕДЕЛЕНИЮ.

smile


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


uploading...
****


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

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



mes

аааа smile 
ну извиняйте..не прочитал все 4 страницы..я думал речь о С++ идет smile
Развели дискуссию сам черт ногу сломает smile
PM   Вверх
math64
Дата 28.4.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как ни странно, работает, даже если файл дать расширение .cpp (компилятор gcc, естественно)
PM   Вверх
azesmcar
Дата 28.4.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата

Как ни странно, работает, даже если файл дать расширение .cpp (компилятор gcc, естественно) 

Ему наплевать на расширение.
Цитата

компилятор gcc

этого хватит.

а вот на визуал студии - не работает.
1>c:\my projects\dd\dd\main.c(5) : error C2057: expected constant expression
1>c:\my projects\dd\dd\main.c(5) : error C2466: cannot allocate an array of constant size 0
1>c:\my projects\dd\dd\main.c(5) : error C2057: expected constant expression
1>c:\my projects\dd\dd\main.c(5) : error C2466: cannot allocate an array of constant size 0
1>c:\my projects\dd\dd\main.c(5) : error C2087: 'arr' : missing subscript
1>c:\my projects\dd\dd\main.c(5) : error C2133: 'arr' : unknown size

Добавлено через 14 минут и 19 секунд
Поскольку привел издержку из стандарта (привел из неправильного smile) приведу теперь из правильного.

Цитата

C99 adds a new array type called a variable length array type. The inability to declare arrays
whose size is known only at execution time was often cited as a primary deterrent to using C as
20 a numerical computing language. Adoption of some standard notion of execution time arrays
was considered crucial for C’s acceptance in the numerical computing world.
The number of elements specified in the declaration of a variable length array type is a runtime
expression. Before C99, this size expression was required to be an integer constant expression


Но студия все равно не компилирует smile 
PM   Вверх
UnrealMan
Дата 28.4.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  26.4.2009,  22:29 Найти цитируемый пост)
тут тогда надо уточнить, что подразумевается под преимуществами, если приведенное выше не подпадает в эту категорию. 
и помойму пока не поздно перенести этот этот оффтоп в холивар. 

По этому поводу уже был один эпический holywar: http://forum.vingrad.ru/forum/topic-230321...+/view-all.html

Цитата(Pieris @  27.4.2009,  23:50 Найти цитируемый пост)
Массивы переменной длины применяются ТОЛЬКО в языке Си(без плюсов) и ТОЛЬКО при использовании компилятора, поддерживающего стандарт С99, и совершенно понятно что компиляторы С++ НЕ БУДУТ компилировать такой код ПО ОПРЕДЕЛЕНИЮ.

Наверное, было бы правильнее сказать так: массивы переменной длины входят в текущий стандарт в C, но не входят в текущий стандарт C++. Некоторые гнутые компиляторы C++ поддерживают массивы переменной длины в качестве расширения.
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.2316 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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