Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
1

создание функции

08.10.2009, 14:45. Показов 2948. Ответов 17

Author24 — интернет-сервис помощи студентам
помогите описать функцию меняющую местами максимальные элементы матриц А и В произвольного порядка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2009, 14:45
Ответы с готовыми решениями:

создание функции
Я создал в программе функцию для того, чтобы дальше записывать в нее полученные данные. void...

Создание функции
Помогите, пожалуйста, разобраться с такой программой... Разработать функцию, приведенную...

создание функции в С++
подскажите пожалуйста подробно как создать свою функцию в С++ через файлы .h и .cpp при компиляции...

Создание функции
Есть программа для решения квадратных уравнений. void __fastcall TForm1::Button1Click(TObject...

17
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
08.10.2009, 15:30 2
допустим максимальный элемент матрицы A[169][164] и матрицы B[1055][6216]
Обмен будет таким
C++
1
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
В функцию передаешь 6 параметров - указатели на матрицы и 4 параметра размерностей матриц
2
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.10.2009, 16:10 3
Цитата Сообщение от M128K145 Посмотреть сообщение
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
Нельзя так - A[169][164] изменяется дважды до следующей sequence point.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
08.10.2009, 16:15 4
Somebody, я понимаю, но в С и С++ работает. Это вот в C#, Java и J# убрали такую возможность
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.10.2009, 16:21 5
Цитата Сообщение от M128K145 Посмотреть сообщение
Somebody, я понимаю, но в С и С++ работает. Это вот в C#, Java и J# убрали такую возможность
Это по сути из разряда i=i++, что в i? Возьмёт и заработает не так с каким-нибудь компилятором.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
08.10.2009, 16:23 6
Цитата Сообщение от Somebody Посмотреть сообщение
Нельзя так - A[169][164] изменяется дважды до следующей sequence point.
А что это занчит?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
08.10.2009, 16:43 7
Somebody, проверено на Dev-C++, MSVS 6.0/2003/2005/2008/2010, BC 3.1/6.0. Мне кажется, вероятность такого события стремится к 0 или компилятор какой-то ручной сборки. Хотя возможно ты и прав, gcc на такое способен, утверждать не буду.
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
08.10.2009, 17:05 8
Цитата Сообщение от M128K145 Посмотреть сообщение
допустим максимальный элемент матрицы A[169][164] и матрицы B[1055][6216]
Обмен будет таким
C++
1
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
В функцию передаешь 6 параметров - указатели на матрицы и 4 параметра размерностей матриц
здорово, сами придумали или из какой-нить литературы? возьму на заметку.
по затратам тактов есть информация для этого трюка. в плане, что быстрее стандартно поменять две перменные местами, используя буферную третью или вот таким способом? и на сколько?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
08.10.2009, 17:49 9
Вот инструкции процессора для первого способа первый
00401414 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00401417 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
0040141A |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040141D |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00401420 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00401423 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX


А вот для второго.
00401414 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00401417 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040141A |. 3110 XOR DWORD PTR DS:[EAX],EDX
0040141C |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0040141F |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00401422 |. 3110 XOR DWORD PTR DS:[EAX],EDX
00401424 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00401427 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040142A |. 3110 XOR DWORD PTR DS:[EAX],EDX

Видно, что второй способ пусть ненамного, но дольше.
Действительно, при использовании дополнительной переменной переменной получается
1) Кладём переменную в регистр
2) Меняем
И так 3 раза, итого 6 инструкций

Во втором способе
1) Кладём переменную в регистр
2) Кладём адрес второй переменной в региср
3) Побитовая команда XOR
И так 3 раза.
Всего 9 команд
1
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
08.10.2009, 19:37 10
всегда либо производительность, либо объём используемой памяти
однако, все используемые в данных преобразованиях команды процессора выполняются за одинаковое количество тактов?

ещё к примеру ускорения работы
for(i=N; --i>=0
выполняется быстрее чем
for(i=0; i<N; i++) из-за сравнения в первом случае перменной с нулём, а не с N. Проявляется хорошо при больших N.

и второй вопрос, 1 час назад поставил наконец вижуал 2008, где в нём можно нструкции процессора посмотреть?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
08.10.2009, 19:57 11
Цитата Сообщение от TanT Посмотреть сообщение
1 час назад поставил наконец вижуал 2008, где в нём можно нструкции процессора посмотреть?
ставишь брейкпоинт - вроде F9. Потом при запуске когда доходит до метки правой кнопкой - Go To Disassembly или как-то так
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
08.10.2009, 20:05 12
Цитата Сообщение от M128K145 Посмотреть сообщение
ставишь брейкпоинт - вроде F9. Потом при запуске когда доходит до метки правой кнопкой - Go To Disassembly или как-то так
не совсем то мне бы хотелось. некоторые программные продукты (скажем IAR) позволяют выводить в фаил полную расшифровку кода с комментариями и объёмом используемых ресурсов как каждой отдельной функцией, так и всем кодом. очень удобно при отладке, сразу видно где неоптимально реализованно чего-нить.
Хотелось бы узнать есть такая возможность в вижуале и где?

давно интересно, а спросить стеснялся
0
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
10.10.2009, 14:57  [ТС] 13
есть ещё у кого нибудь версии как это сделать?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
10.10.2009, 17:03 14
Цитата Сообщение от kravam Посмотреть сообщение
Видно, что второй способ пусть ненамного, но дольше. [....]
И так 3 раза, итого 6 инструкций [.....]
И так 3 раза. Всего 9 команд
К сожалению, это заблуждение. Современные процессоры имеют два конвейера выполнения и скорость исполнения кода определяется не только числом инструкций, но и возможностью их распараллеливания (спаривания, pairing) в конвейерах.
Конкретно для твоего примера, обе последовательности инструкций выполняются за 6 тактов (инструкции MOV и LEA во втором варианте кода независимы и поэтому выполняются за 1 такт в конвейерах U и V). Первый же вариант кода по Стандарту языка является, кроме того, и небезопасным, порождая Undefined behavior. И то, что наблюдаемые эффекты от этого UB совпадают с "желаемыми" - ничего не значит. Это просто чистое везение. Неизвестно, что произойдет при переносе кода на другой компилятор (например, через N лет на какой-нибудь VC++ 2020 ).

Добавлено через 18 минут
PS: вот любопытства для прогнал тестовую программу под Intel VTune Perfomance Analyzer. Компилятор MSVC++ 2005, Release, оптимизация по скорости выполнения. Результаты:
C++
1
2
3
4
5
6
7
8
9
10
{
    a ^= b ^= a ^= b;   // 819 попугаев
}
// ......
{
    int temp = a;       // 216
    a = b;              // 317 
    b = temp;           // 227
                        // итого: 760 попугаев
}
2
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
11.10.2009, 09:25 15
Цитата Сообщение от CheshireCat Посмотреть сообщение
Первый же вариант кода по Стандарту языка является, кроме того, и небезопасным, порождая Undefined behavior.
чтобы окончательно просветить этот вопрос: первый вариант это
C++
1
2
3
int temp = a;       // 216
    a = b;              // 317 
    b = temp;           // 227
?
отталкиваюсь от
Действительно, при использовании дополнительной переменной переменной получается
1) Кладём переменную в регистр
2) Меняем
И так 3 раза, итого 6 инструкций

Во втором способе
1) Кладём переменную в регистр
2) Кладём адрес второй переменной в региср
3) Побитовая команда XOR
И так 3 раза.
Всего 9 команд
P.S. подпопугаями подразумевается числовое значение, хранящееся в переменной, или иное?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.10.2009, 10:37 16
Нет, первый вариант - имелась в виду куча XOR'ов (я, похоже, где-то тут запутался....? ):
C++
1
a ^= b ^= a ^= b;
Что касается попугаев - то это показание счетчика Intel VTune Perfomance Analyzer, относящееся к данной строке. В тесте этот код прогонялся в цикле. Чем больше попугаев - тем больше времени намерил VTune и тем дольше будет выполняться код в реальных условиях. Правда, я пока не задавался вопросом, почему получены именно такие цифры, это потребует micro code optimization этапа анализа в VTune.
1
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
11.10.2009, 13:07 17
Цитата Сообщение от CheshireCat Посмотреть сообщение
К сожалению, это заблуждение. Современные процессоры имеют два конвейера выполнения и скорость исполнения кода определяется не только числом инструкций, но и возможностью их распараллеливания (спаривания, pairing) в конвейерах. Конкретно для твоего примера, обе последовательности инструкций выполняются за 6 тактов (инструкции MOV и LEA во втором варианте кода независимы и поэтому выполняются за 1 такт в конвейерах U и V).
Если не ошибаюсь, два конвейера (U и V) были очень-очень давно, а уже начиная с Pentium Pro всё намного сложнее.
0
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
12.10.2009, 20:22  [ТС] 18
опишити ещё по подробней суть моей проблемы пожалста)))))

???
0
12.10.2009, 20:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2009, 20:22
Помогаю со студенческими работами здесь

Создание функции
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;iomanip&gt; #include &lt;conio.h&gt;...

Создание своей функции
Всем привет =) скажите, как правильно передать в функцию значения массива? В моей функции должна...

Создание шаблонной функции
Создать шаблонную функцию, изменяющий порядок элементов таким образом: первая половина списка...

Создание перегруженной функции
Создайте перегруженные функции для вычисления абсолютной величины числа. Одна функция работает с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru