Wake of Gods Forum | Форум Во Имя Богов

Full Version: С++, общая тема
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
нет, алгоритмически
Ты о формальном доказательстве программ и о людях, которые не ошибаются и о надёжных данных внешних? )
я о том, что если нормальные значения переменной не могут выходить за тот диапазон, то будь то int или uint - диапазон нормальных значений не изменится.
Дайте я тоже поучаствую в споре: хотите не обращаться куды попало - юзайте вектор, например. при попытке лезть в отрицательные элементы получите исключение.
gamecreator Wrote:так мне же проще на c# писать, чем на с++
А причём здесь C#? Тема-то про С++, а не про него. До этого ты про него ни слова не говорил, а потом вдруг сказал про сборку мусора Rolleyes

Berserker Wrote:А при проектировании интерфейсов, структур и функций есть. Если использована int, то uint не подходят. Если uint, то любое int-рассчитанное значение не подходит.
Дык проектировать всё надо в едином стиле, тогда и проблем не будет.

NIKr0m@nceR Wrote:Дайте я тоже поучаствую в споре: хотите не обращаться куды попало - юзайте вектор, например. при попытке лезть в отрицательные элементы получите исключение.
Угу, я об этом говорил на 4-й странице темы. Ещё бы хотел добавить, что стоит использовать модификатор const так часто, как это возможно (особенно для классовых функций).
Научился передавать двумерный массив в функцию и работать далее как с одномерным:
Вопрос: внутри функции можно ли работать как-нибудь в более привычном виде?

Под более привычным имеется ввиду представить его как двумерный.

Слышал про массив указателей, вроде как должно писаться вместо (int *a) вот это:(int **a) Но я не понял как передать ему двумерный массив &kakoy_to_massiv[0][0] - так указывается только на начало массива, без одного 0 передается int *[5]
Блин, чувствую что я очень близко, но вот не могу дотянуть)
(04.04.2012 18:18)packa Wrote: [ -> ]Научился передавать двумерный массив в функцию и работать далее как с одномерным
неправильно ты массив передаешь. нужно просто название переменной записать
(04.04.2012 18:18)packa Wrote: [ -> ]Вопрос: внутри функции можно ли работать как-нибудь в более привычном виде?
я уже писал об этом:
(01.04.2012 19:23)gamecreator Wrote: [ -> ]если одномерный массив можно передать как написав int *array, так и int array[], то n-мерный статический массив нельзя передать, не указав размеры n-1 его измерений
т.е. тебе придется записать параметр как int a[][5] или int a[5][5]
(04.04.2012 18:18)packa Wrote: [ -> ]Слышал про массив указателей, вроде как должно писаться вместо (int *a) вот это:(int **a)
это для динамических массивов, тебе оно не поможет.
packa Wrote:Вопрос: внутри функции можно ли работать как-нибудь в более привычном виде?
Если не использовать шаблоны функций, а также хаки типа reinterpret_cast - то для статического массива никак нельзя, увы.

gamecreator Wrote:т.е. тебе придется записать параметр как int a[][5] или int a[5][5]
Ничего подобного! Игродел, не вводи человека в заблуждение.
Например, этот код прекрасно сработает как для двумерных статических, так и для динамических массивов: (Click to View)
   
А вообще, создавать подобным образом "динамические массивы" - это не есть гут. Потому что это массив указателей, а не "двумерный массив". У двумерного массива все его "строки" будут иметь одинаковую длину, а в случае с массивом указателей - это условие не обязательно будет верно...

Функция, изначально заточенная под статические массивы, всегда будет работать и с динамическим массивом тоже (если в ней не указывать размер массива явно). А вот обратное будет неверно, поэтому лучше всегда работать со стеком. Для "нормальных" динамических массивов в C++ уже давно придуман std::vector, и изобретать велосипед тут незачем. Именно вектор я тебе, Пакка, и рекомендую использовать.
(04.04.2012 19:54)Efrit Wrote: [ -> ]    Add_10_to_all_values_of_array(*dynamic_array, 4, 7); // добавляем 10 ко всем элементам динамического массива
не вводи человека в заблуждение. этим вызовом ты прибавишь 10 к первой строке массива и неизвестно чему, находящемуся в памяти после этой строки.
(04.04.2012 19:54)Efrit Wrote: [ -> ]А вообще, создавать подобным образом "динамические массивы" - это не есть гут. Потому что это массив указателей, а не "двумерный массив". У двумерного массива все его "строки" будут иметь одинаковую длину, а в случае с массивом указателей - это условие не обязательно будет верно...
как создашь - так и будет. зубчатые массивы никто не заставляет создавать.
gamecreator Wrote:не вводи человека в заблуждение. этим вызовом ты прибавишь 10 к первой строке массива и неизвестно чему, находящемуся в памяти после этой строки.
Ничего подобного. Ты бы хоть код скомпилировал для начала, прежде чем утверждать.
Если длина всех строк одинакова, то приведённый мною код всегда будет работать корректно.

gamecreator Wrote:как создашь - так и будет. зубчатые массивы никто не заставляет создавать.
Двумерный массив по определению обязан быть зубчатым. Если строки двумерного массива имеют разную длину - то это набор каких-то различных одномерных массивов, а не "матрица". Пакке нужна именно матрица, и для неё мой код вполне подходит.
(04.04.2012 21:48)Efrit Wrote: [ -> ]Ничего подобного. Ты бы хоть код скомпилировал для начала, прежде чем утверждать.
Если длина всех строк одинакова, то приведённый мною код всегда будет работать корректно.
я верю, что в большинстве случаев он будет работать корректно. на что ты рассчитывал писав свою функцию:
- тот, кто будет его вызывать, создаст строки матрицы строго в порядке от 0 до n-1
- менеджер памяти выделит каждый блок строго за предыдущим, без разрывов
(04.04.2012 21:48)Efrit Wrote: [ -> ]Если строки двумерного массива имеют разную длину - то это набор каких-то различных одномерных массивов, а не "матрица".
а если у них одинаковая длина? согласен, что это матрица?
Ну вообще, имхо, спор бессмысленный ибо странно говорить что является труЪ двумерным массивом если одно является одномерным массивом наделенным необходимым функционалом а второе фактически массивом массивов т.е. более общим объектом.
бтв, Efrit, а мне больше нравятся квадратные скобочки ибо читабельнее.
gamecreator, что значит "в большинстве случаев"? многомерные массивы именно так и создаются, я и говорю, что по факту это одномерный массив с необходимым функционалом.
NIKr0m@nceR, сначала посмотри о чем речь и как создается динамический массив в примере. одномерный массив не равно массив массивов
gamecreator, я посмотрел перед тем как писать, я и не говорю что равно. я говорю что называть какой-то из них двумерным массивом а другой нет ибо это нечто иное не вполне верно. Двумерный массив как контейнер для, к примеру, интов может быть реализован, как я понимаю, двумя способами: создать одномерный массив m*n и прикрутить интерфейс или создать массив указателей на массивы. когда пишется int example_array[2][4] то фактически компиллятор выделяет массив на 8 интов и позволяет к ним обращаться как example_array[i][j] что, вообще говоря, является переобозначением для удобства конструкции *(example_array + 4 * i + j). Насчет динамического - проглядел, там действительно что попало функция сделает. я вообще не понимаю, это две разные конструкции, зачем х в одну кучу валить неясно.

P.S. я не вдавался в подробности, но по стандарту 11 запилили контейнер array вроде. У него функционал какой? Его использовать разумнее чем вектор или нет?
судя по всему, std::array - аналог статического массива.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Reference URL's