- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
int maxOf5(int a, int b, int c, int d, int e) {
int arr[5];
arr[0] = a;
arr[1] = b;
arr[2] = c;
arr[3] = d;
arr[4] = e;
bubbleSort(&arr, 5);
return arr[0];
}
bugmenot 22.12.2010 10:15 # +7
bax 22.12.2010 10:16 # 0
KomprendaTerrorSquad 22.12.2010 10:18 # −8
bugmenot 22.12.2010 10:20 # 0
разлогиниться забыл, лол
TarasB 22.12.2010 10:40 # 0
А что, логарифм уже не считается? Его можно тратить как угодно?
bugmenot 22.12.2010 13:04 # 0
я только что 15 минут потратил, чтобы выяснить, надо ли заменять ReallocMem на пару FreeMem/GetMem, любого байтоёба уделаю :-Р
TarasB 22.12.2010 12:49 # 0
bugmenot 22.12.2010 12:59 # 0
и да, откуда уэб обезьяне знать про асимптотику
хотя "порядок" звучало подозрительно
interested 22.12.2010 10:59 # 0
&arr возвращает адрес arr. Этот тип похож на int**, только он ещё содержит явное число элементов int*[5].
Вопрос в том... Что же принимает bubbleSort?
От меня этот момент как-то ускользает...
TarasB 22.12.2010 11:55 # 0
bugmenot 22.12.2010 11:56 # 0
interested 22.12.2010 12:09 # 0
В стандарте есть два типа массивов array of N type T и array of unknown bound type T, последний точно определяется указателем, а вот первый неким указателем с длиной. И так получается, что адрес указателя не конвертируется в адрес указателя с диной. Хотя сами указатели на массивы приводятся легко к указателю.
То есть, неявно передать адрес указателя с длиной, значит вызвать ошибку преобразования типов. Так оно кажется.
Я попробовал сообразить... И просто не нашёл такого прототипа bubbleSort, который не вызвал бы ошибку типа при передаче &arr.
TarasB 22.12.2010 12:51 # 0
Это просто передача int*
Про передачу по ссылке я фигню сказал, иначе было бы написано sort(arr без амперсанда.
interested 22.12.2010 13:21 # 0
Если бы "бубле" имело простой прототип bubbleSort(int[],int), то вызов выглядел бы так: bubbleSort(arr,int);
Вот я и не понимаю... Что за "бубле-то" должно быть, чтобы ему &arr отдавать...
Я склоняюсь к тому, что для массива, который объявлен с явным числом элементов оператор получения адреса указателя -- бессмыслица.
rat4 22.12.2010 14:03 # +1
void bubbleSort(void* a, ptrdiff_t b);
Не?
TarasB 22.12.2010 14:13 # 0
interested 22.12.2010 14:17 # 0
TarasB 22.12.2010 14:27 # 0
Передача указателя на массив уже разрешена без каста.
interested 22.12.2010 14:33 # +1
Я, конечно, не знаю, как это может восприниматься разными компиляторами, но не должно... Теоретически &arr и arr -- это разные вещи. То есть в bubbleSort(int*,int) не получится без явного каста подпихнуть &arr. Конечно, вы всегда можете сделать аналогично операции с void*: reinterpret_cast<int*>(&arr), но это уже говорит о пробеле на этапе проектирования, который привёл к "шву" на этапе конструирования.
Я продолжаю придерживаться позиции, что смысла в &arr просто нет никакого, нужно было передавать arr.
TarasB 22.12.2010 14:41 # 0
int* - это тип такой, "указатель на инт".
&i - это указательнь на конкретную переменную.
> Теоретически &arr и arr -- это разные вещи.
Это-то причём?
Похоже ты знаешь С ещё хуже, чем я.
interested 22.12.2010 14:50 # 0
В выражении int arr[5]; arr -- не int, а что-то другое, что приводится неявно (по стандарту) к int*. Потому &arr -- это уже адрес адреса переменной типа int. Что-то похожее на int** (но не оно). Положить int** в int* нельзя. При этом и &arr положить в int** тоже нельзя.
TarasB 22.12.2010 14:55 # 0
Да.
> Что-то похожее на int** (но не оно).
Не оно, да. Это int*.
ЛОЛ.
interested 22.12.2010 15:02 # 0
Вам не кажется, что если прямая операция адресации выполнена два раза, то обратная операция разименования тоже должна быть выполнена дважды?
Ну... На худой конец, что ли, попробуйте скомпилировать у себя код вида:
int arr[1] = {0};
int * intPtr = &arr;
Я уж и на знаю, что ещё сделать, чтобы вы увидели разницу.
TarasB 22.12.2010 15:45 # 0
Где тебе тут привиделся адрес адреса?
Я вижу только адрес массива. Массив - это не указатель. Это область памяти, в которой лежат несколько переменных подряд. А в функцию передаётся указатель на эту область памяти.
Короче, заканчивай ПХП защищать, плохо влияет.
interested 22.12.2010 15:53 # 0
Массив действительно не является указателем, это бесспорно. Но что такое переменная arr? Так вот, переменная arr -- это "что-то", что в программе представляет собой абстракцию массива. Однако, согласно стандарту, эта абстракция приводится в указатель на первый элемент при операциях над ней. Так вот положено в C++.
Что есть &? & -- это оператор, который будучи применён к переменной возвращает адрес этой переменной в памяти.
Что же будет, если мы напишем &arr?
arr неявно превратится в указатель на первый элемент массива, после чего от этого указателя будет взят адрес. То есть, это уже (в общем случае) не адрес первого элемента, а адрес указателя, который содержит адрес первого элемента.
Адрес адреса...
ch 22.12.2010 19:08 # 0
interested 22.12.2010 19:50 # 0
Вы взяли адрес arr и положили его в первый элемент массива адресов.
В строке два левое выражение имеет тип int*[1], как и правое &arr, а вовсе не int*, ага.
А я код писал, где была попытка положить &arr в int*, как предлагал TarasB.
interested 22.12.2010 20:01 # 0
bugmenot 22.12.2010 20:03 # 0
"passing pointers by reference is so C++"
interested 22.12.2010 20:06 # +1
guest6 01.09.2023 23:00 # 0
Смотря где.
absolut 22.12.2010 15:57 # +1
Sauron 22.12.2010 16:02 # 0
guest 23.12.2010 02:21 # +2
Тоесть я при передаче любого указателя должен использовать ptrdiff_t ?
absolut 23.12.2010 02:43 # +1
guest 23.12.2010 03:02 # 0
rat4 23.12.2010 09:42 # 0
rat4 23.12.2010 09:42 # 0
guest 23.12.2010 09:49 # −1
Dummy00001 22.12.2010 15:10 # 0
на мелких N bubble sort более эффективен чем quick sort.
это наверное самая читабельная реализация какую только и можно придумать.
absolut 22.12.2010 15:40 # +4
Dummy00001 22.12.2010 15:53 # +1
absolut 22.12.2010 15:38 # +1
Dummy00001 22.12.2010 16:43 # 0
Dummy00001 22.12.2010 16:51 # 0
народ и не улавливает что "&arr" и "arr" имеют тот же самый эффект и тот же самый тип. в оригинальном С "&arr" было ошибкой (метка/имя массива уже есть по определению указатель; ассемблерщики должны улавить откуда ноги у синтаксиса растут). но народ просто постоянно на это спотыкался, почему и разрешили в языке "&arr" и оно аналогично "arr" и есть указатель на массив/первый элемент массива.
ЗЫ та же самая фигня и про указатели на функции: имя функции есть указатель, и &func_name просто синоним введенный для читабельности.
interested 22.12.2010 18:15 # 0
И специально попытался крутануть код в MSVC++, известен он свой "нестандартностью", результат тот же был: ошибка кастинга типа.
Это новшество 2011го стандарта будет?
SemenBooxy 22.12.2010 18:59 # +2
void sort(int *arr, int size) {}
void func() {}
int _tmain(int argc, _TCHAR* argv[]) {
int arr[5] = {0};
cout << typeid(arr).name() << endl; // int [5]
cout << typeid(&arr).name() << endl; // int (*)[5]
cout << typeid(func).name() << endl; // void __cdecl (void)
cout << typeid(&func).name() << endl; // void (__cdecl*)(void)
sort(arr, 5); // correct
sort(&arr, 5); // ill-formed
return 0;
}
interested 22.12.2010 19:52 # 0
absolut 23.12.2010 16:39 # 0
interested 24.12.2010 09:55 # 0
rat4 22.12.2010 19:09 # +1
guest 02.01.2011 01:38 # −1