Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Max777
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
#1

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

08.10.2009, 14:45. Просмотров 2653. Ответов 17

помогите описать функцию меняющую местами максимальные элементы матриц А и В произвольного порядка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2009, 14:45     создание функции
Посмотрите здесь:

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

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

Создание функции - C++
Есть программа для решения квадратных уравнений. void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString aE,bE,cE; float...

Создание функции - C++
#include "stdafx.h" #include <iostream> #include <locale> #include <iomanip> #include <conio.h> using namespace std; int...

создание функции - C++
Я создал в программе функцию для того, чтобы дальше записывать в нее полученные данные. void print_values(char*str, double v){ // вывод в...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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 параметра размерностей матриц
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
08.10.2009, 16:10     создание функции #3
Цитата Сообщение от M128K145 Посмотреть сообщение
A[169][164] ^= B[1055][6216] ^= A[169][164] ^= B[1055][6216];
Нельзя так - A[169][164] изменяется дважды до следующей sequence point.
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
08.10.2009, 16:15     создание функции #4
Somebody, я понимаю, но в С и С++ работает. Это вот в C#, Java и J# убрали такую возможность
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
08.10.2009, 16:21     создание функции #5
Цитата Сообщение от M128K145 Посмотреть сообщение
Somebody, я понимаю, но в С и С++ работает. Это вот в C#, Java и J# убрали такую возможность
Это по сути из разряда i=i++, что в i? Возьмёт и заработает не так с каким-нибудь компилятором.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
08.10.2009, 16:23     создание функции #6
Цитата Сообщение от Somebody Посмотреть сообщение
Нельзя так - A[169][164] изменяется дважды до следующей sequence point.
А что это занчит?
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
08.10.2009, 16:43     создание функции #7
Somebody, проверено на Dev-C++, MSVS 6.0/2003/2005/2008/2010, BC 3.1/6.0. Мне кажется, вероятность такого события стремится к 0 или компилятор какой-то ручной сборки. Хотя возможно ты и прав, gcc на такое способен, утверждать не буду.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
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 параметра размерностей матриц
здорово, сами придумали или из какой-нить литературы? возьму на заметку.
по затратам тактов есть информация для этого трюка. в плане, что быстрее стандартно поменять две перменные местами, используя буферную третью или вот таким способом? и на сколько?
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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 команд
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
08.10.2009, 19:37     создание функции #10
всегда либо производительность, либо объём используемой памяти
однако, все используемые в данных преобразованиях команды процессора выполняются за одинаковое количество тактов?

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

и второй вопрос, 1 час назад поставил наконец вижуал 2008, где в нём можно нструкции процессора посмотреть?
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
08.10.2009, 19:57     создание функции #11
Цитата Сообщение от TanT Посмотреть сообщение
1 час назад поставил наконец вижуал 2008, где в нём можно нструкции процессора посмотреть?
ставишь брейкпоинт - вроде F9. Потом при запуске когда доходит до метки правой кнопкой - Go To Disassembly или как-то так
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
08.10.2009, 20:05     создание функции #12
Цитата Сообщение от M128K145 Посмотреть сообщение
ставишь брейкпоинт - вроде F9. Потом при запуске когда доходит до метки правой кнопкой - Go To Disassembly или как-то так
не совсем то мне бы хотелось. некоторые программные продукты (скажем IAR) позволяют выводить в фаил полную расшифровку кода с комментариями и объёмом используемых ресурсов как каждой отдельной функцией, так и всем кодом. очень удобно при отладке, сразу видно где неоптимально реализованно чего-нить.
Хотелось бы узнать есть такая возможность в вижуале и где?

давно интересно, а спросить стеснялся
Max777
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 31
10.10.2009, 14:57  [ТС]     создание функции #13
есть ещё у кого нибудь версии как это сделать?
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,365
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 попугаев
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2009, 09:25     создание функции
Еще ссылки по теме:

Создание функции с параметрами - C++
Здравствуйте, есть код #include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include &lt;GL/glut.h&gt; #pragma comment(lib, &quot;opengl32.lib&quot;)...

Создание шаблона функции - C++
Пожалуйста помогите решить задачу, что то сам никак не могу сообразить((( вот текст: Описать шаблон функции, которая считает сумму...

Создание шаблона функции - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt; T min(T a, T b) { T minVal = a; if (minVal &gt; b) minVal =...

Создание собственной функции - C++
Даны натуральные числа m, n и целые числа A1,..., An; B1,..., Bm;C1,..., C10. Создать собственную функцию для расчёта минимума из массива...

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


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

Или воспользуйтесь поиском по форуму:
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
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. подпопугаями подразумевается числовое значение, хранящееся в переменной, или иное?
Yandex
Объявления
11.10.2009, 09:25     создание функции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru