то писать 1, в других случаях +1 от того, что там записано?
да, именно это и нужно
ДВА ФАЙЛА нужно (отрывать)
валидно? #include <stdio.h> #include <stdint.h> int main(void) { uint16_t amount = 1; FILE* config = fopen("./file.dat", "r+b"); if (config == NULL) { printf("Creating file.dat and writing 1\n"); FILE* create = fopen("./file.dat", "wb"); if (create == NULL) { perror("Idk whats happening"); return 1; } fwrite(&amount, sizeof(uint16_t), 1, create); fclose(create); return 1; } fread(&amount, sizeof(uint16_t), 1, config); ++amount; printf("%u\n", amount); rewind(config); fwrite(&amount, sizeof(uint16_t), 1, config); fclose(config); return 0; }
Как этот код связан с C++?
А чат про C++
Непосредственно же
Более-менее всё ок
С - часть с++
ты снова обманываешь!
Никогда не обманываю, всегда говорю только правду
с++ обратно совместим с си
Только интерфейсы, не?
си код компилируется компилятором с++ практически в полном объеме
> Практически В этом проблема
ты опять хочешь чтобы завелась шарманка про restrict?
ты не сможешь сказать что не скомпилируется или будет работать не правильно
ну, обьясни какие, это ведь важные и распространение вещи в си, раз такая проблема
Массивы динамические
так, какая конструкция не будет компилироваться
restrict Думаю этого достаточно
без этого слова код будет компилироваться и работать
А если Extern C?
#define restrict И нет проблем
Так на то и он extern C :D
ну, это оптимизация процесса сборки, она никак не влияет на логику
Но таки компилирует😂
Про динамические массивы выше писал Их тоже не использовать?
почему, они будут компилироваться и работать, это слово никак не влияет на код и логику
Очень влияет, тут не про слово речь А про int n = 5; int b[n];
VLA, массив переменной длины
это не динамический массив и это не скомпилируется
Да! В плюсах не скопмириуется, без расширения компилятора А вот в Си - пожалуйста
динамический массив, это массив размер которого может задаваться в рантайме. Ты называешь вещи не правильно
А я не в рантайие задал размер массива? constexpr, define вроде не писал
потому что си вообще в целом не против дописать за тебя const
нет, компилятор просто увидел что n - литерал (нигде не меняется) и за тебя сделал его константой
вот ответ почему оно скомпилируется
О0 введи, сделай его слепым
int n; scanf(“%d”, &n); int b[n]; Пойдет?
размер массива известен во время компиляции, всегда. Если не известен ничего не скомпилируется, оказалось что компилятор умнее тебя
ну скомпилируй
и даже ворнингов не будет? Мне кажется кто-то тут брешит и на си не соблюдает стандарт, а потом плюется что другой компилятор работает не так как тебе хочется
О чем вообще речь. Это ill-formed программа на C++, так как размер массива, согласно стандарту, должен являться constant expression.
верно подметили, но не ill-formed программа на Си
То, что какие-то компиляторы поддерживают VLA — это дело этих компиляторов. Стандарт же говорит, что это не C++
Именно! Некоторые компиляторов С++ поддерживают VLA, но это расширение компилятора А в СИ - Стандарт
Реализации компиляторов не определяют язык C++. Они могут поддерживать хоть Haskell и компилировать его успешно.
скомпиль мне пожалуйста
Технически - Я не вижу проблем. Получили некоторую цифру, и расширили стек вниз...
Говорит https://eel.is/c++draft/dcl.array > The constant-expression shall be a converted constant expression of type std::size_t
3.7.1 shall: An indication of a requirement on programming language standard or processors. Нарушение shall clause — нарушение требований. То есть, ill-formed программа
Размер массива известен до его декларации. Про тип переменных - не понял. Как ты собираешься это написать?
стек расширить "вниз"
В C++ более строгая типизация. В С++ есть много новых ключевых слов.
Ну это так-то очевидно, потому что вы смотрите пункт, который объясняет следующую запись: D1 [ constant-expressionopt ] attribute-specifier-seqopt Это не доказывает абсолютно ничего.
скомпилишь? https://godbolt.org/z/K8a4fP4ae
Да. Что не так.. внизу стек не ограничен. 😜
я только вектор знаю
Только вот к данной ситуации это никак не относится.
@MasterZiv сделай пожалуйста красиво, напиши свой царский дефайн
Ну да. Это синтаксис массива.
Нет, вы опять врете, это всего лишь один из синтаксисов. Более того, увеличивать их количество компилятору не запрещено. Вы смотрите на запись A[B], где вам объясняют, что в данном слкчае значит B и что с ним нужно делать. Это совершенно не то, что мне нужно и никак не является аргументом в споре.
И где в стандарте синтаксис массивов, отличный от T D1 [ constant-expression_opt] attribute-specifier-seq_opt? И где в стандарте сказано, что constant-expression может быть не constant expression?
> И где в стандарте синтаксис массивов, отличный от Буквально следующим пунктом. https://eel.is/c++draft/dcl.array#2 > И где в стандарте сказано, что constant-expression может быть не constant expression? Это и не должно быть нигде написано.
мне нужно сохранить в таком "массиве" ну, скажем, 50 мегабайт объектов
Извиняюсь, у меня сохранен другой драфт, нежели на сайтике. Следующий синтаксис — с пустыми квадратными скобками Должно быть написано. Стандарт определяет язык. То, что не определено стандартом — не часть языка
к слову, там помимо fam много всего интересного, если ты уберёшь это структурку у тебя всё равно ничего не соберётся) даже если рестрикты уберёшь, даже если авто и регистр уберёшь
И опять же 3.7.1 shall: An indication of a requirement on programming language standard or processors. Есть constant-expession это не constant expression, то это нарушение требования
Утверждения с вашей стороны вида «когда стандарт требует, он на самом деле не требует» кажутся очень странными
> Извиняюсь, у меня сохранен другой драфт, нежели на сайтике. Вы мне скинули ссылку на этот сайт. > Стандарт определяет язык. А конкретный пункт, ссылку на который вы дали, определяет конкретную запись, которую вы, почему-то считаете аргументом в споре при том, что это совершенно не тот случай. > То, что не определено стандартом — не часть языка Не факт, опять же. Вам уже рассказали про расширения.
Вы не спали? У вас явно какие-то проблемы с пониманием моих сообщений.
Я не делал такие утверждения. Вы точно следите за разговором?
Расширения по определению диалект языка
каков ваш тезис? что VLA являются частью C++?
По ссылке приведено два синтаксиса: T D1 [ constant-expression_opt] attribute-specifier-seq_opt T D1 [ ] attribute-specifier-seq_opt Какой из них, вкупе с требованием the constant-expression shall be a converted constant expression of type std::size_t, разрешает нижеприведенный код? int n; std::cin >> n; int arr[n];
Нет, не являются, ты бредишь
> Какой из них, вкупе с требованием the constant-expression shall be a converted constant expression of type std::size_t, разрешает нижеприведенный код? Это требование вообще-то есть только у одного из пунктов. Дальнейшие ответы не имеют смысла.
пересечения есть, как и прямые отсылки. например offsetof
Вы таки тролль! А в следующем пункте пустые скобки: []
Вы таки ппочитайте раздел стандарта, на который сами же ссылаетесь. Потом мы можем продолжить.
dcl.array все-таки не описывает объявления массивов, когда в квадратных скобках не constant-expression, поэтому VLA это не well-formed код с точки зрения плюсового стандарта
Где/как определяется well-formed'ность?
1) описано, как такие декларации себя ведут 2) не нарушаются требования (shall)
формально описано в http://eel.is/c++draft/intro#compliance.general-2
> 1) описано, как такие декларации себя ведут Если в документации к конкретному расширению написано, как оно себя ведет, это не считается? >2) не нарушаются требования (shall) Они в примере с VLA и не нарушаются же.
у С++ две формы объявления массивов: 1) D1 [ constant-expression opt ] attribute-specifier-seq opt 2) D1 [ ] attribute-specifier-seq opt VLA синтаксически никак не вписывается во вторую форму, поэтому рассматриваем первую. на нее наложено следующее требование: The constant-expression shall be a converted constant expression of type std::size_t. (http://eel.is/c++draft/dcl.array#1.sentence-2) внимание на shall, то есть это требование (https://www.iso.org/sites/directives/current/part2/index.xhtml#_idTextAnchor082). VLA его нарушает. таким образом VLA для C++ переходит в разряд ill-formed. далее у нас есть сишный стандарт, который описывает поведение таких деклараций. так как в C++ это ill-formed, то плюсовый компилятор, который транслирует такую декларацию согласно сишному стандарту, не перестает быть conforming реализацией C++
> далее у нас есть сишный стандарт, который описывает поведение таких деклараций. так как в C++ это ill-formed, то плюсовый компилятор, который транслирует такую декларацию согласно сишному стандарту, не перестает быть conforming реализацией C++ Почему "далее"? Почему расширение по-вашему способно только "отменять стандартный ill-formed", то есть имеет как-будто меньший приоритет?
https://eel.is/c++draft/intro.compliance#general-8 > A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any well-formed program. Implementations are required to diagnose programs that use such extensions that are ill-formed according to this International Standard. Having done so, however, they can compile and execute such programs. Если расширение что-то разрешает, это не отменяет того, что согласно стандарту код не является корректным.
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Язык C++ определяется только одним стандартом. Документации к расширениям компиляторов (которые оные, согласно стандарту, могут иметь) не определяют язык C++.
> это не отменяет того, что согласно стандарту код не является корректным. Это и не подтверждает, что он является ill-formed в какой-то имплементации С++. В этом пункте написано лишь про диагностику случаев, когда расширение используется, чтобы сделать поведение well-formed.
> Документации к расширениям компиляторов (которые оные, согласно стандарту, могут иметь) не определяют язык C++. С++ с расширениями все еще является С++, даже по стандарту.
то есть C++\CLI какой-нибудь это ISO C++ просто потому, что там все вписывается в conforming расширения? (предположим, что там нем non-conforming расширений)
Это конкретная имплементация С++.
Я нашел начало
как можно создать статический массив оставив пустыми квадратные скобки: int a[]?
Когда сразу его инициализируешь. Размер вычислится автоматически
int a[] = { 1, 2, 3, 42 };
а блин, не подумал, спасибо
Как можно расширить то чего нет?
Всё говно GCC собрал?
Не, это всё строго в рамках С11
Стек существует. :)
Обсуждают сегодня