Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2012, 13:03   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
я так понимаю m имеет значение результата функции ceil()
оно не может быть константой.... ни в каком образе.
А теперь правильный ответ: не нужно путать стандарт языка с++ со стандратом языка си. Это два принципиально разных языка.


//-------------------------------------------


Расширение массивов



В Стандарте С99 появились два новых для С и достаточно важных свойства массивов: переменная длина и возможность включать в объявлениях массивов квалификаторы типа.

Массивы переменной длины

В С89 размерности массивов необходимо объявлять при помощи выражений из целых констант, причем размер массива фиксируется во время компиляции. В силу определенных обстоятельств, в С99 это правило было изменено. В С99 можно объявить массив, размерности которого определяются любыми допустимыми целыми выражениями, в том числе и такими, значения которых становятся известны только во время выполнения. Такой массив называется массивом переменной длины (variable-length array, VLA). Однако такими массивами могут быть только локальные массивы (то есть те, у которых область видимости — прототип или блок). Вот пример массива переменной длины:

void f(int diml, int dim2)
{
int matrix[diml][dim2]; /* двумерный массив переменной длины */
/* ... */
}
В данном случае размер matrix определяется значениями, передаваемыми функции f() через переменные dim1 и dim2. Таким образом, в результате каждого вызова f() может получиться массив matrix с самыми разными измерениями.

Важно понять, что массивы переменной длины за время "своей жизни" не меняют своих размеров. (Иными словами, они не являются динамическими.) На самом деле массив переменной длины создается с другим размером каждый раз, когда встречается его объявление.

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

Появление массивов переменной длины вызвало небольшое изменение в операторе sizeof. Вообще говоря, sizeof — это оператор, который вычисляется во время компиляции. То есть во время компиляции он обычно превращается в целую константу, значение которой равно размеру типа или объекта. Однако если sizeof применяется к массиву переменной длины, то свое значение он получает только во время выполнения. Это изменение было необходимо потому, что размер массива переменной длины нельзя узнать до времени выполнения.

Одной из главных причин появления массивов переменной длины является желание упростить программирование численных методов. Конечно, это средство применяется довольно широко. Но помните — массивы переменной длины не поддерживаются Стандартом С89 (и в языке C++).

Использование квалификаторов типов в объявлении массива

В С99 при объявлении массива в качестве параметра функции, внутри квадратных скобок этого объявления можно указать ключевое слово static. Оно сообщает компилятору, что в массиве, на который указывает этот параметр, всегда будет находиться как минимум названное количество элементов. Например:

Код:
int f(char str[static 80])
{
  // здесь str всегда является указателем на массив из 80 элементов
  //
}
Здесь дается гарантия, что str будет указывать на начало массива типа char, причем в нем будет не менее 80 элементов.

Внутри квадратных скобок также допускаются ключевые слова restrict, volatile и const, но только для параметров функций. Использование restrict означает, что указатель изначально является единственным средством доступа к объекту. Применение const показывает, что указатель указывает на один и тот же массив (то есть указатель всегда указывает на один и тот же объект). Можно использовать и volatile (означает "асинхронно-изменяемый"), хотя и нет смысла это делать.

//-------------------------------------------------------------------
(ц)http://www.chitay.org/c/11/1105.htm
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 13:10   #12
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

В любом случаи m является компилятору неизвестной на этапе исполнения и следовательно её нельзя вписывать в массив. и компилятор ему честно об этом сказал.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 13:12   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
У меня просто Си, а не С++. С этим не может быть связано
Тема называется: "Не компилируется в Visual C++"

Ты пишешь си-код, и пытаешься компилить его си++ компилятором?
А потом ты удивляешься, почему компилятор чужеродного языка не хочет компилить?

Ну ты попробуй тогда компилятору с++ скормить исходники на джаве, ну или какого нибудь бейсика.

А потом создай тему: "почему компилятор с++ не хочет компилировать исходный код написанный на других языках?"
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 13:17   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
В любом случаи m является компилятору неизвестной на этапе исполнения и следовательно её нельзя вписывать в массив. и компилятор ему честно об этом сказал.
Для тех, кто в танке: в сишечке это стандартная фича.
На плюсах не по стандарту, однако, поскольку сишку и кресты как правило компилят родственные компиляторы, то данная фича распространилась и на некоторые приплюснутые компили.

Например, гцц позволяет создавать массивы с количеством элементов, не являющейся константой времени компиляции.
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 13:23   #15
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Для тех, кто в танке: в сишечке это стандартная фича.
На плюсах не по стандарту, однако, поскольку сишку и кресты как правило компилят родственные компиляторы, то данная фича распространилась и на некоторые приплюснутые компили.

Например, гцц позволяет создавать массивы с количеством элементов, не являющейся константой времени компиляции.
В танке то не я компилятор.... у него это не съело.... моэно попробовать объявить const int m.... но тогда эта переменная защищена от записи.
ибо говорит о постоянности в памяти. Это раз два static в нашем случаи не объявишь... так что на ум приходит лишь отказаться от ceil или "поглучить".

Ну фиг с ним.... я давно уже структурным программированием не увлекаюсь.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 13:35   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
В танке то не я компилятор.... у него это не съело.... моэно попробовать объявить const int m.... но тогда эта переменная защищена от записи.
ибо говорит о постоянности в памяти. Это раз два static в нашем случаи не объявишь... так что на ум приходит лишь отказаться от ceil или "поглучить".

Ну фиг с ним.... я давно уже структурным программированием не увлекаюсь.
Компилятор с++ различает константу времени компиляции, и константу времени выполнения. По стандарту, массивы можно создавать только при помощи констант времени компиляции.
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 13:58   #17
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Компилятор с++ различает константу времени компиляции, и константу времени выполнения. По стандарту, массивы можно создавать только при помощи констант времени компиляции.
это логично. страуструп подумал над этим.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В C++ Builder компилируется, а в Visual C++ 2010. В чем может быть проблема? Bags Общие вопросы C/C++ 6 02.12.2012 00:25
Visual studio 2005. Не компилируется программа. Xramoi Общие вопросы C/C++ 8 01.02.2012 09:03
Visual Studio не компилируется программа. Ошибка в iostream.h (no such file or directory). В чем проблема? Mubat Visual C++ 2 19.10.2011 20:41
не компилируется норм (Visual c++) adwaer Visual C++ 4 19.03.2009 01:42