04.04.2012, 00:25
04.04.2012, 00:38
Ты о формальном доказательстве программ и о людях, которые не ошибаются и о надёжных данных внешних? )
04.04.2012, 01:07
я о том, что если нормальные значения переменной не могут выходить за тот диапазон, то будь то int или uint - диапазон нормальных значений не изменится.
04.04.2012, 10:03
Дайте я тоже поучаствую в споре: хотите не обращаться куды попало - юзайте вектор, например. при попытке лезть в отрицательные элементы получите исключение.
04.04.2012, 12:47
gamecreator Wrote:так мне же проще на c# писать, чем на с++А причём здесь C#? Тема-то про С++, а не про него. До этого ты про него ни слова не говорил, а потом вдруг сказал про сборку мусора

Berserker Wrote:А при проектировании интерфейсов, структур и функций есть. Если использована int, то uint не подходят. Если uint, то любое int-рассчитанное значение не подходит.Дык проектировать всё надо в едином стиле, тогда и проблем не будет.
NIKr0m@nceR Wrote:Дайте я тоже поучаствую в споре: хотите не обращаться куды попало - юзайте вектор, например. при попытке лезть в отрицательные элементы получите исключение.Угу, я об этом говорил на 4-й странице темы. Ещё бы хотел добавить, что стоит использовать модификатор const так часто, как это возможно (особенно для классовых функций).
04.04.2012, 18:18
Научился передавать двумерный массив в функцию и работать далее как с одномерным:
Вопрос: внутри функции можно ли работать как-нибудь в более привычном виде?
Под более привычным имеется ввиду представить его как двумерный.
Слышал про массив указателей, вроде как должно писаться вместо (int *a) вот это:(int **a) Но я не понял как передать ему двумерный массив &kakoy_to_massiv[0][0] - так указывается только на начало массива, без одного 0 передается int *[5]
Блин, чувствую что я очень близко, но вот не могу дотянуть)
Spoiler (Click to View)
PHP Code:
{
int kakoy_to_massiv[5][5];
kakaya_to_functcia(kakoy_to_massiv[0]);
}
void kakaya_to_functcia(int *a){
for (int i=0; i<5; i++){
for (int j=0; j<5; j++){
a[j+i*5]+=2;
}
}
}
Под более привычным имеется ввиду представить его как двумерный.
Слышал про массив указателей, вроде как должно писаться вместо (int *a) вот это:(int **a) Но я не понял как передать ему двумерный массив &kakoy_to_massiv[0][0] - так указывается только на начало массива, без одного 0 передается int *[5]
Блин, чувствую что я очень близко, но вот не могу дотянуть)
04.04.2012, 19:21
(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)это для динамических массивов, тебе оно не поможет.
04.04.2012, 19:54
packa Wrote:Вопрос: внутри функции можно ли работать как-нибудь в более привычном виде?Если не использовать шаблоны функций, а также хаки типа reinterpret_cast - то для статического массива никак нельзя, увы.
gamecreator Wrote:т.е. тебе придется записать параметр как int a[][5] или int a[5][5]Ничего подобного! Игродел, не вводи человека в заблуждение.
Например, этот код прекрасно сработает как для двумерных статических, так и для динамических массивов: (Click to View)
PHP Code:
void Add_10_to_all_values_of_array(int* array, const unsigned int height, const unsigned int width)
{
if (!array) return;
for (unsigned int i = 0; i < height; ++i)
for (unsigned int j = 0; j < width; ++j)
*(array + i*width + j) += 10;
}
int main()
{
int static_array[4][7] = // создаём статический массив и заполняем его числами
{{0, 0, 0, 5, 0, 0, 0},
{1, 1, 1, 6, 1, 1, 1},
{2, 2, 2, 7, 2, 2, 2},
{3, 3, 3, 8, 3, 3, 3}};
int **dynamic_array = new int*[4];
for (unsigned int i = 0; i < 4; ++i) dynamic_array[i] = new int[7]; // создаём динамический массив
for (unsigned int i = 0; i < 4; ++i)
for (unsigned int j = 0; j < 7; ++j)
if (j != 3) dynamic_array[i][j] = i; // заполняем его теми же числами, что и в статическом массиве
else dynamic_array[i][j] = i + 5;
Add_10_to_all_values_of_array(&static_array[0][0], 4, 7); // добавляем 10 ко всем элементам статического массива
Add_10_to_all_values_of_array(*dynamic_array, 4, 7); // добавляем 10 ко всем элементам динамического массива
return 0;
}
А вообще, создавать подобным образом "динамические массивы" - это не есть гут. Потому что это массив указателей, а не "двумерный массив". У двумерного массива все его "строки" будут иметь одинаковую длину, а в случае с массивом указателей - это условие не обязательно будет верно...
Функция, изначально заточенная под статические массивы, всегда будет работать и с динамическим массивом тоже (если в ней не указывать размер массива явно). А вот обратное будет неверно, поэтому лучше всегда работать со стеком. Для "нормальных" динамических массивов в C++ уже давно придуман std::vector, и изобретать велосипед тут незачем. Именно вектор я тебе, Пакка, и рекомендую использовать.
04.04.2012, 21:15
(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: [ -> ]А вообще, создавать подобным образом "динамические массивы" - это не есть гут. Потому что это массив указателей, а не "двумерный массив". У двумерного массива все его "строки" будут иметь одинаковую длину, а в случае с массивом указателей - это условие не обязательно будет верно...как создашь - так и будет. зубчатые массивы никто не заставляет создавать.
04.04.2012, 21:48
gamecreator Wrote:не вводи человека в заблуждение. этим вызовом ты прибавишь 10 к первой строке массива и неизвестно чему, находящемуся в памяти после этой строки.Ничего подобного. Ты бы хоть код скомпилировал для начала, прежде чем утверждать.
Если длина всех строк одинакова, то приведённый мною код всегда будет работать корректно.
gamecreator Wrote:как создашь - так и будет. зубчатые массивы никто не заставляет создавать.Двумерный массив по определению обязан быть зубчатым. Если строки двумерного массива имеют разную длину - то это набор каких-то различных одномерных массивов, а не "матрица". Пакке нужна именно матрица, и для неё мой код вполне подходит.
05.04.2012, 01:20
(04.04.2012 21:48)Efrit Wrote: [ -> ]Ничего подобного. Ты бы хоть код скомпилировал для начала, прежде чем утверждать.я верю, что в большинстве случаев он будет работать корректно. на что ты рассчитывал писав свою функцию:
Если длина всех строк одинакова, то приведённый мною код всегда будет работать корректно.
- тот, кто будет его вызывать, создаст строки матрицы строго в порядке от 0 до n-1
- менеджер памяти выделит каждый блок строго за предыдущим, без разрывов
(04.04.2012 21:48)Efrit Wrote: [ -> ]Если строки двумерного массива имеют разную длину - то это набор каких-то различных одномерных массивов, а не "матрица".а если у них одинаковая длина? согласен, что это матрица?
05.04.2012, 11:47
Ну вообще, имхо, спор бессмысленный ибо странно говорить что является труЪ двумерным массивом если одно является одномерным массивом наделенным необходимым функционалом а второе фактически массивом массивов т.е. более общим объектом.
бтв, Efrit, а мне больше нравятся квадратные скобочки ибо читабельнее.
gamecreator, что значит "в большинстве случаев"? многомерные массивы именно так и создаются, я и говорю, что по факту это одномерный массив с необходимым функционалом.
бтв, Efrit, а мне больше нравятся квадратные скобочки ибо читабельнее.
gamecreator, что значит "в большинстве случаев"? многомерные массивы именно так и создаются, я и говорю, что по факту это одномерный массив с необходимым функционалом.
05.04.2012, 12:56
NIKr0m@nceR, сначала посмотри о чем речь и как создается динамический массив в примере. одномерный массив не равно массив массивов
05.04.2012, 13:23
gamecreator, я посмотрел перед тем как писать, я и не говорю что равно. я говорю что называть какой-то из них двумерным массивом а другой нет ибо это нечто иное не вполне верно. Двумерный массив как контейнер для, к примеру, интов может быть реализован, как я понимаю, двумя способами: создать одномерный массив m*n и прикрутить интерфейс или создать массив указателей на массивы. когда пишется int example_array[2][4] то фактически компиллятор выделяет массив на 8 интов и позволяет к ним обращаться как example_array[i][j] что, вообще говоря, является переобозначением для удобства конструкции *(example_array + 4 * i + j). Насчет динамического - проглядел, там действительно что попало функция сделает. я вообще не понимаю, это две разные конструкции, зачем х в одну кучу валить неясно.
P.S. я не вдавался в подробности, но по стандарту 11 запилили контейнер array вроде. У него функционал какой? Его использовать разумнее чем вектор или нет?
P.S. я не вдавался в подробности, но по стандарту 11 запилили контейнер array вроде. У него функционал какой? Его использовать разумнее чем вектор или нет?
05.04.2012, 14:29
судя по всему, std::array - аналог статического массива.