powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Двумерные массивы и С++
20 сообщений из 70, страница 3 из 3
Двумерные массивы и С++
    #39289277
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaDima TПоработает до чего-то подобного
Код: plaintext
1.
2.
x = 200000;
f(x);


Не беспокойтесь за переполнение стека раньше времени.
Соглашусь, кто-то уже побеспокоился за меня. Проблему переполнения стэка наблюдал недавно в MSVC2015 с массивами фиксированного размера, затестил double arr[n]; так оно просто не компилируется, похоже MS просто еще не решил как реализовать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289347
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си.
2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new
3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли.
Выделение памяти на стеке меня совершенно не интересует
1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо.
2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома).
3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили.


Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? )

Конкретно вы не правы в том:
1. Что утверждали что С++ не имеет никакого отношения к функции malloc. Выше вам привели ссылку на стандарта языка С++ и даже цитату опровергающее ваше суждение
2. Пусть у вас сохранится ваше личное мнение, на которое вы безусловно имеете все права, и пусть malloc - в принципе нелегальная функция в контексте С++. Я уже не раз вам подсказал, в том случае, если вы используете оператор new, аналогичный код сохранится, как и 4 строчки. И конечно, ваши придирки не по существу (и в принципе необоснованные, см. п. 1) не должны были иметь место.
3. Откуда у вас информация о том, как часто в языке С++ используется new ?

Я недостаточно хорошо разбираюсь в специфике организации работы кучи и стека, потому не могу как-то обстоятельно прокомментировать ваш последний абзац. Но у меня не раз возникала ситуация, что выделение памяти на стеке приводило к краху программы. Приведите пожалуйста конкретный пример, как по вашему правильным было бы динамически выделить память на массив массивов или двумерный массив используя только С++
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289348
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку.
Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete().
Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать.

P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289349
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку.
Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete().
Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать.

P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать.

Возможно вы и правы, однако первоначальное утверждение было не том, нужно или не нужно (или насколько это хороший тон), а легально или нелегально в принципе относительно языка С++. А это кардинально разные понятия
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289350
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКогда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete().
Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать.
А можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289351
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах.
Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new.
Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289365
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovAnatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах.
Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new.
Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete.

Послушайте, я вообще по этому поводу ничего не говорю. Да и что значит ваше 'неправильно'? Незаконно? Думаю вы имеете ввиду другое. Под 'неправильно' вы понимаете 'было бы лучше/следует/хороший тон'. Я в этом далеко не уверен, но про это речь выше и не шла. Выше было утверждение, согласно которому, malloc и С++ никаким образом не связаны, что в программах на языке С++ malloc использовать не то чтобы нежелательно или это есть плохой тон, а вообще нельзя. Вот и всё.

Вообще пустой спор, что мы тут развели ни о чем - это настолько очевидные вещи. Как будто я вас пытаюсь убедить что malloc хорошо, а new плохо. Или что при вызове malloc тоже вызывается конструктор. Таких глупостей я вам не говорю.


Да и вообще, я что, написал что мой код в самом первом посте является примером хорошего кода на С++? По-моему я написал что так я делаю, и как лучше сделать это грамотно с использованием всех возможных средств С++. Более того, я задал уточняющий вопрос:
SSq2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ?
Но дело не в этом даже, просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289980
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неопрятный код допустим в "стартовых скриптах". Просто потому, что такой скрипт работает в известном окружении и на многие "принятые здесь умолчания" можно спокойно заложиться. Даже если окружение (внезапно) изменилось, то в самом пиковом раскладе такой скрипт можно "перебить лапками" за пару-тройку минут через "цопи цон филе".
С программами такой подход не работает просто потому, что компилируемую программу нельзя просто так взять и "поредактировать по месту".
Мне, например, больше года пришлось воевать с разработчиками из-за того, что, грубо говоря, кому-то было лень написать два блока try/catch вместо одного - часть реальной системы гарантированно ложилась на пару-тройку дней при каждом обновлении. И это - java, где всё должно быть защищено и безопасно, но цена неряшливости - нервы и потерянное время сотен живых людей.

P.S. А так, да - подумаешь написал в статической функции не то, что полагается, а то, что привык.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39290037
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Узбагойся, тут тебе не Ява. Люди понимают отличие new от malloc
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39290383
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, стоило пропустить пару дней, а тут такие открытия делаются...
SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си?
Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39290695
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaЭх, стоило пропустить пару дней, а тут такие открытия делаются...
SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си?
Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится.

И каким образом из этого следует, что данная функция не имеет никакого отношения к С++? Из того что x принадлежит X не следует, что x не может принадлежать Y. Возможно для вас это не так, потому что вы считаете:
BagaBagaAnatoly Moskovsky,
тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся.

Возможно лучшей аргументацией для вас будет BS и его книга The C++ Programming Language:

BSC++ was developed from the C programming language and, with few exceptions, retains C as a
subset. The base language, the C subset of C++, is designed so that there is a very close correspondence
between its types, operators, and statements and the objects that computers deal with
directly: numbers, characters, and addresses.

BSClearly, C++ owes much to C [Kernighan,1978]. C is retained as a subset.

0. Вы делаете вывод о том, что функция malloc принадлежит языку С.
1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++.
2. Из п. 0 и п. 1 следует, что функция malloc также является частью С++

Не могли бы вы аргументировано, не ссылаясь на ваши личные суждения опровергнуть эти три пункта, в том случае, если вы с ними не согласны. Вы скажете свою точку зрения, я в ответ ни скажу ни слова по этому вопросу и мы прекратим дискуссию. Просто я хочу понять вас, почему вы рассуждаете так, как вы рассуждаете
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39291316
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury0. Вы делаете вывод о том, что функция malloc принадлежит языку С.

Надеюсь, вы не собираетесь это отрицать?

SashaMercury1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++.

Я и не утверждаю, что С и С++ не пересекаются вовсе. Но я бы и не стал приписывать старине Бьярне утверждение, что malloc является частью С++. На CppCon он призывает не пользоваться "raw new", а не то что malloc... При этом ссылки на конкретный пункт стандарта, где бы malloc представлялась как часть С++, я от вас так и не дождался. Но есть простые факты:
1. средства управления динамическим выделением памяти описываются пунктом 18.6 Dynamic memory management стандарта. Там есть new и delete в различных вариантах. Там нет malloc и free.
2. malloc и free явным образом (а не "в комментариях по ходу изложения") присутствуют в пункте 20.7.13. C library

Наконец, если считать, что malloc есть "натуральная" часть языка С++ для динамического выделения памяти, то каким образом при помощи malloc (и без использования new или inplace new) выделить память в куче для столь же "натурального" объекта С++, как vector, для определенность пусть будет vector <string>? Если покажете "в коде" - мне придётся с вами согласиться. В противном случае получается нонсенс: стандартный механизм С++ для выделения динамической памяти не может быть использован для динамического выделения памяти для любого стандартного объекта С++ (или строже - для любого не-POD-объекта)...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39291332
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga,

все эти потуги вокруг malloc станут ненужными, если приложению требуется работать с несколькими пулами памяти, причём без разницы - C или C++
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39291359
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
malloc это механизм нижнего уровня по отношению к С++.

То что им тоже можно пользоваться, ничего не меняет.

Непонятно, что вообще вы хотите доказать.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296739
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. У меня возник ещё один вопрос по двумерным массивам.
В стандарте Си сказано следующее:
ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static or thread storage duration is not initialized
explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules,
and any padding is initialized to zero bits;
— if it is a union, the first named member is initialized (recursively) according to these
rules, and any padding is initialized to zero bits;

Насколько мне понятно, в том случае если мы выделяем память на массив на стеке
Код: plaintext
1.
2.
	const int size = 400;
	int a[size][size];


то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил)

Аналогичных рассуждений в стандарте С++ я не нашел. Однако нашёл следующее:
N4594 8.5.1.12When initializing a multi-dimensional array, the initializer-clauses initialize the elements with the last
(rightmost) index of the array varying the fastest (8.3.4). [ Example:
Код: plaintext
1.
int x[2][2] = { 3, 1, 4, 2 };


initializes x[0][0] to 3, x[0][1] to 1, x[1][0] to 4, and x[1][1] to 2. On the other hand,
Код: plaintext
1.
2.
3.
float y[4][3] = {
{ 1 }, { 2 }, { 3 }, { 4 }
};


initializes the first column of y (regarded as a two-dimensional array) and leaves the rest zero. —end
example ]

Исходя из этого, предположил, что такой код:
Код: plaintext
1.
2.
	const int size = 400;
	int a[size][size] = {};



установит каждый бит данного массива к 0. Однако не нашёл где об этом явно сказано в стандарте языка, и вообще, насколько законны такие действия. Подскажите пожалуйста, насколько это законно
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296741
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ стандарте Си сказано следующее:
ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static or thread storage duration is not initialized
explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules,
and any padding is initialized to zero bits;
— if it is a union, the first named member is initialized (recursively) according to these
rules, and any padding is initialized to zero bits;

Насколько мне понятно, в том случае если мы выделяем память на массив на стеке
Код: plaintext
1.
2.
	const int size = 400;
	int a[size][size];



то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил)
Нет. Вы неверно прочли. Инициализация нулями происходит только для объектов у которых "static or thread storage duration". А стековые (automatic) не инициализируются.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296742
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++ - то же самое
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296746
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ С++ - то же самое

Очень жаль что нет такой возможности. И странно, что её нет. Думаю это было бы востребовано. А такой код для С++
Код: plaintext
1.
2.
        const int size = 400;
	int a[size][size] = {};



тоже нелегален? (на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296748
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнелегален
А где там говорится про нелегальность?
Просто переменная содержит неопределенное значение. А сам код вполне легален.


SashaMercury(на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно
Наличие инициализатора {} как бы подразумевает явную инициализацию (для чисел - нулями). Так что непонятно что смущает.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39296749
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, спасибо!
...
Рейтинг: 0 / 0
20 сообщений из 70, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Двумерные массивы и С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]