Ок, ребят. Вижу желание поспорить. У меня ща времени нет. У меня нет цели доказывать свою правоту - мне это нафиг не надо. Кто хочет моего совета и опыта пожалуйста.
Поэтому коротко.
Димка зря обижаешься. Где логика? Зачем МНЕ на ТЕБЯ наезжать. Я же сказал, что не хочу никого обижать. И если я говорю ошибка, то значит я вижу ошибку. А доказательства ты бы увидел сам если бы в 102 написал тело ф-ций. Ты не передал в ф-ю размерность массива. В этом ошибка. И дело не в том, что твои решения альтернативны, а в том, что они содержат ошибку. Я понимаю, есть люди, которым это очень тяжело признавать (сам такой). Тем более сам грешу, когда привожу ошибочные примеры (случаи были). Но исправляться никогда не поздно.
Твой код в 102 содержит эти ошибки:
void f(int a[]) { ... }
...
int a[10];
f(a);
void f(int a[10][]) { ... }
...
int a[10][10];
f(a);
В ф-ю надо передать размерность, которую потом проверить. Или не так? Как ты собираешься проверить границы массива? Это же элементарно. Об это споткнёшся сразу как только напишешь тело ф-ции - ты этого не сделал.
В 110 и 114 ты ловко вывернулся объявив константы. Поэтому был мой 115.
Ну и поскольку ты не можешь нормально разговаривать как взрослый человек, а хочешь пообижаться, и видишь в замечаниях только попытку тебя обидеть, я тебе больше отвечать не буду, дабы дальше не обижать. Сорри. Я не обиделся, просто не хочется обижать кого-то вольно, или невольно.
Кхе, кхе. Не кипятись, Джон
.
Может быть и прав. Меня тут аллергия сильно придавила. Уже неделю таблетки принимаю. Башка не работает на 100% - отсюда раздражённость.
nikedeforest, ты всё-таки не хочешь понять о чём я говорю? Или просто ещё не до конца представил себе ситуёвину? Я не против термина двумерный многомерный. Тем более, что первое предложение - копия Страуструпа.
Ок, раз уж на то пошло - для меня библия С++ - Страуструп. Кто может лучше папы знать своё дитятко? Итак раз уж хочется цитат титанов, их есть у меня. Кстати "почти по Джону" - это тоже шутка.
Тем не менее рекомендую прочитать всё:
из пункта 2.3.6 Массивы:
Многомерные массивы представлены как массивы массивов.
...
Ниже описывается
массив из двух элементов, каждый из которых является, в свою очередь,
массивом из 5 элементов типа char:
char v[2][5];
Про передачу в ф-ю массива - целый топик:
4.6.5 Параметр-массив
Если в качестве параметра функции указан массив, то передается
указатель на его первый элемент. Например:
int strlen(const char*);
void f()
{
char v[] = "массив";
strlen(v);
strlen("Николай");
}
Это означает, что фактический параметр типа T[] преобразуется к типу T*,
и затем передается. Поэтому присваивание элементу формального
параметра-массива изменяет этот элемент. Иными словами,
массивы отличаются от других типов тем, что они не передаются
и не могут передаваться по значению.
В вызываемой функции размер передаваемого массива неизвестен.
Это неприятно, но есть несколько способов обойти данную трудность.
Прежде всего, все строки оканчиваются нулевым символом, и значит их
размер легко вычислить. Можно передавать еще один параметр,
задающий размер массива. Другой способ: определить
структуру, содержащую указатель на массив и размер массива, и
передавать ее как параметр (см. также $1.2.5). Например:
void compute1(int* vec_ptr, int vec_size); // 1-ый способ
struct vec { // 2-ой способ
int* ptr;
int size;
};
void compute2(vec v);
Сложнее с многомерными массивами, но часто вместо них можно
использовать массив указателей, сведя эти случаи к одномерным
массивам. Например:
char* day[] = {
"mon", "tue", "wed", "thu", "fri", "sat", "sun"
};
Теперь рассмотрим функцию, работающую с двумерным массивом - матрицей.
Если размеры обоих индексов известны на этапе трансляции, то
проблем нет:
void print_m34(int m[3][4])
{
for (int i = 0; i<3; i++) {
for (int j = 0; j<4; J++)
cout << ' ' << m[i][j];
cout << '\n';
}
}
Конечно, матрица по-прежнему передается как указатель, а размерности
приведены просто для полноты описания.
Первая размерность для вычисления адреса элемента неважна
($R.8.2.4), поэтому ее можно передавать как параметр:
void print_mi4(int m[][4], int dim1)
{
for ( int i = 0; i<dim1; i++) {
for ( int j = 0; j<4; j++)
cout << ' ' << m[i][j];
cout << '\n';
}
}
Самый сложный случай - когда надо передавать обе размерности.
Здесь "очевидное" решение просто непригодно:
void print_mij(int m[][], int dim1, int dim2) // ошибка
{
for ( int i = 0; i<dim1; i++) {
for ( int j = 0; j<dim2; j++)
cout << ' ' << m[i][j];
cout << '\n';
}
}
Во-первых, описание параметра m[][] недопустимо, поскольку для
вычисления адреса элемента многомерного массива нужно знать
вторую размерность. Во-вторых, выражение m[i ][j]
вычисляется как *(*(m+i)+j), а это, по всей видимости, не то, что
имел в виду программист. Приведем правильное решение:
void print_mij(int** m, int dim1, int dim2)
{
for (int i = 0; i< dim1; i++) {
for (int j = 0; j<dim2; j++)
cout << ' ' << ((int*)m)[i*dim2+j]; // запутано
cout << '\n';
}
}
Выражение, используемое для выбора элемента матрицы, эквивалентно
тому, которое создает для этой же цели транслятор, когда известна
последняя размерность. Можно ввести дополнительную переменную,
чтобы это выражение стало понятнее:
int* v = (int*)m;
// ...
v[i*dim2+j]
Топика "Многомерные массивы" я не нашёл. Наверно Страуструп не читал Шилдта (ЭТО ШУТКА!!!)
Кстати ф-я print_mij это практически то, что надо Carrie Bradshaw. Ещё одно доказательство. Только судя по всему это нафиг никому не надо.
Лёш, в иконках самая правая - разделить тему. Там выберешь - "выбрать топики". Перекидываешь в правое которые надо. Потом выбираешь цель-тему.
Ну соответственно параметры название темы, известить и тд - разберёшься
Лучше потренируйся на парочке тестовых тем, "Чтобы не было мучительно больно"
Вить, согласен, но споров больше не будет. Во всяком случае с моей стороны. Я уже сказал - я не теоретик, красиво говорить не умею (может в этом всё проблема?), а своим опытом поделюсь с каждым кто в нём нуждается. Если руки дойдут я сам всё перенесу, кстати там в той теме тоже надо флуд подчистить.