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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальное объявление структуры, с константой при задании размер массива 
:(
    Опции темы
gggl
Дата 13.11.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include <stdio.h>
#include <stdlib.h>

#include <stddef.h>
#include <stdint.h>

const int table_size = 4096;
const unsigned max_str_size = 15;

struct list
    {
        char data[max_str_size];
        struct list *next;
    };

int main(void)
{
    return 0;
}

Это код не компилиться - main1.c:12: error: variably modified ‘data’ at file scope
если в - char data[max_str_size]; написать вместо max_str_size любое число или же перенести объявление структуры в main все нормально компилиться.
В чем может быть причина почему исходный вариант не хочет работать???

Это сообщение отредактировал(а) gggl - 13.11.2011, 18:14
PM MAIL ICQ   Вверх
mes
Дата 13.11.2011, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(gggl @  13.11.2011,  17:11 Найти цитируемый пост)
const unsigned max_str_size = 15;

enum { max_str_size = 15 };


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


Новичок



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

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



Скомпилилось но выглядит как большой страшный костыль...
PM MAIL ICQ   Вверх
gggl
Дата 13.11.2011, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Скорее всего придется использовать #define max_str_size 15
хотя где то слышал что в данном случае лучше так не делать...
PM MAIL ICQ   Вверх
math64
Дата 13.11.2011, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если пишешь на Си без плюсов, принято так:
Код

#define MAX_STR_SIZE 15

struct list
    {
        char data[MAX_STR_SIZE];
        struct list *next;
    };

не знал что с enum скомпилируется - может, не всеми компиляторами.
C const в Си без плюсов компилироваться не должно (в отличие от Си++ - где как раз принято использовать const)
В Си без плюсов const оздачает "только для чтения". Проинициализировав константу, компилятор уже не знает о её значении и не будет подставлять её значение при использовании.
В C++ наоборот, компилятор помнит значение константы (для простых типов), может использовать её для определения размера массива и будет использовать команду с непосредственной адресацией, если это возможно.
PM   Вверх
bsa
Дата 13.11.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



gggl, обычно, для этого используют динамические массивы... Или std::string, если это C++.
PM   Вверх
gggl
Дата 13.11.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извините, пример на С, просто в списке подсветки был только С++
компилятор gcc, значит так и сделаю через дефайн, просто меня удивило что вынеся объявление структуры из main в глобальное пространство программа перестала компилиться, хотя при объявлении ее внутри майн"а все компилилось, значит это просто особенность gcc...

Значит правильно я понял что в Си const принадлежит к run-time а в С++ compile-time? или же это опять особенность компилятора?

Это сообщение отредактировал(а) gggl - 13.11.2011, 19:26
PM MAIL ICQ   Вверх
mes
Дата 13.11.2011, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(gggl @  13.11.2011,  18:22 Найти цитируемый пост)
Значит правильно я понял что в Си const принадлежит к run-time а в С++ compile-time? или же это опять особенность компилятора?

нет неправильно.. C++ имеет костыль, когда сохраняет (параллельно переменной) значение инициализации,  которое позволяет использовать для указания размера массива.

Добавлено через 1 минуту и 23 секунды
Цитата(gggl @  13.11.2011,  17:45 Найти цитируемый пост)
Скомпилилось но выглядит как большой страшный костыль..

Цитата(gggl @  13.11.2011,  18:22 Найти цитируемый пост)
 значит так и сделаю через дефайн 

ну да, через дефайн не костыль.. smile 



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


Эксперт
****


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

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



Цитата(mes @  13.11.2011,  19:56 Найти цитируемый пост)
C++ имеет костыль

Это не костыль. Просто разработчики первой версии C++ хотели минимизировать число новых ключевых слов.
const имеет два значения:
1 - то что было в C - переменная доступна только для чтения (в C# для этого используется слово readonly)
2 - переменная - константа (в C# это const).
Следовало бы добавить новое ключевое слово, как это сделано в C#, но нужна была совместимость с C.
но всё же в C++ const соответсвует в C не const, а static const, иначе константы нельза было бы объявлать в заголовке.
Для объявления переменной нужно писать extern const.

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


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


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

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



Цитата(math64 @  13.11.2011,  22:10 Найти цитируемый пост)
Это не костыль. 

 smile  ну если только притянутое за уши - не костыль..
Цитата

An integral constant-expression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types  initialized with constant expressions (8.5), non-type template parameters of integral or enumeration types, and sizeof expressions. 


Добавлено через 4 минуты и 44 секунды
Цитата(math64 @  13.11.2011,  22:10 Найти цитируемый пост)
Следовало бы добавить новое ключевое слово, как это сделано в C#, но нужна была совместимость с C.

совместимость в несовместимом поведении ? в C++11 наконец то осознали и подправили сие недаразуменее нормальным constexpr.. 

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


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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