![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#11 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
//------------------------------------------- Расширение массивов В Стандарте С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. Оно сообщает компилятору, что в массиве, на который указывает этот параметр, всегда будет находиться как минимум названное количество элементов. Например: Код:
Внутри квадратных скобок также допускаются ключевые слова restrict, volatile и const, но только для параметров функций. Использование restrict означает, что указатель изначально является единственным средством доступа к объекту. Применение const показывает, что указатель указывает на один и тот же массив (то есть указатель всегда указывает на один и тот же объект). Можно использовать и volatile (означает "асинхронно-изменяемый"), хотя и нет смысла это делать. //------------------------------------------------------------------- (ц)http://www.chitay.org/c/11/1105.htm |
|
![]() |
![]() |
![]() |
#12 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
![]()
В любом случаи m является компилятору неизвестной на этапе исполнения и следовательно её нельзя вписывать в массив. и компилятор ему честно об этом сказал.
Если помог, тут весы есть
![]() |
![]() |
![]() |
![]() |
#13 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
Тема называется: "Не компилируется в Visual C++"
Ты пишешь си-код, и пытаешься компилить его си++ компилятором? А потом ты удивляешься, почему компилятор чужеродного языка не хочет компилить? Ну ты попробуй тогда компилятору с++ скормить исходники на джаве, ну или какого нибудь бейсика. А потом создай тему: "почему компилятор с++ не хочет компилировать исходный код написанный на других языках?" |
![]() |
![]() |
![]() |
#14 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
На плюсах не по стандарту, однако, поскольку сишку и кресты как правило компилят родственные компиляторы, то данная фича распространилась и на некоторые приплюснутые компили. Например, гцц позволяет создавать массивы с количеством элементов, не являющейся константой времени компиляции. |
|
![]() |
![]() |
![]() |
#15 | |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
![]() Цитата:
ибо говорит о постоянности в памяти. Это раз два static в нашем случаи не объявишь... так что на ум приходит лишь отказаться от ceil или "поглучить". Ну фиг с ним.... я давно уже структурным программированием не увлекаюсь.
Если помог, тут весы есть
![]() |
|
![]() |
![]() |
![]() |
#16 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#17 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
![]()
это логично. страуструп подумал над этим.
Если помог, тут весы есть
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В 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 |