Скажите, а все вот эти упражнения со ссылками и указателями имеют практический смысл? В плане быстродействия, или может чего другого... Я б, как старый ардуинщик, написал бы в лоб:
[uquote="Allex",url="/forum/viewtopic.php?p=3616862#p3616862"]Я б, как старый ардуинщик, написал бы в лоб:[/uquote]
Ардуинщики пишут на С++, потому аргументы имеет смысл передавать как ссылки, что и делает стандартная функция swap, правда она еще и шаблонная:
Тем, что вы передаёте параметры по значению. То есть, в функцию попадают не внешние переменные, а только их значения. Если же передать по ссылке/указателю, то передаётся ссылка/указатель и вы получаете возможность менять значение переменных.
Просто меняем адреса переменных? Или не дошло?
Не адреса, а значения.
что и делает стандартная функция swap, правда она еще и шаблонная:
Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная.
[uquote="da-nie",url="/forum/viewtopic.php?p=3616889#p3616889"]Вот тут не понял. Функция void SwapInt16Values(int16_t& pValue1, int16_t& pValue2) не шаблонная. [/uquote]
Для SwapInt16Values я просты ссылки добавил, а std::swap() - шаблонная, но тут грузить еще и шаблонами никакого смысла нет
я дико извиняюсь: а в контексте параметров функции какая разница между ссылкой и указателем? только что ссылка не может изменяться или еще какие-то нюансы есть?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="ARV",url="/forum/viewtopic.php?p=3616906#p3616906"]а в контексте параметров функции какая разница между ссылкой и указателем? только что ссылка не может изменяться или еще какие-то нюансы есть?[/uquote]
Нюансы есть, например, по константной сылке можно передать временный объект:
А указатель у него не возьмешь... Но изначально автора вопроса интересовало можно ли избавиться от указателей внутри функции, так что основная разница в упрощении.
[uquote="ARV",url="/forum/viewtopic.php?p=3616929#p3616929"]недопустимо, если в set параметр указатель? интересно, почему? временный объект создается же в памяти, и имеет адрес... или опять нюансы?[/uquote]
Когда-то читал, но сейчас точно не скажу, вроде дело в невозможности применять & к rvalue, а временные объекты как раз rvalue и есть.
Это (в C++) означает, что переменная передана по ссылке. То есть, любые изменения её внутри функции изменяют оригинальную переменную извне. Внутри функции (с точки зрения синтаксиса) с этими переменными работать нужно ровно так же, как если бы они были переданы просто по значению.
#include <iostream>
using namespace std;
void swap_c_style(int a, int b)
{
int r = a;
a = b;
b = r;
}
void swap_c_pointer_style (int *a, int *b)
{
int r = *a;
*a = *b;
*b = r;
}
void swap_cpp_style(int &a, int &b)
{
int r = a;
a = b;
b = r;
}
int main()
{
int x, y;
x = 2; y = 3;
swap_c_style(x, y);
cout << "x: " << x << ", y: " << y << endl;
x = 2; y = 3;
swap_c_pointer_style(&x, &y);
cout << "x: " << x << ", y: " << y << endl;
x = 2; y = 3;
swap_cpp_style(x, y);
cout << "x: " << x << ", y: " << y << endl;
return 0;
}
[uquote="Allex",url="/forum/viewtopic.php?p=3616962#p3616962"]Не означает ли эта запись, что внутри функции мы работаем с адресами переменных?[/uquote]
Означает. Мы передаём константные адреса переменных, по которым работаем с самими переменными внутри функции.
Единственные, на мой взгляд, отличия от указателей - синтаксис и константность.
Как создать и подключить .h и .с файлы? Как правильно?
Создаю timer8.c с реализацие функции, и создаю timer8.h с обьявлением функции. Кидаю в одну папку с main.cpp файлом.
В main в начале пишу:
Как итог "undefined reference to `Timer0Init()'". Если в .h файле добавить "#include "timer8.c"" то ошибки нет. Но это же идеологически не правильно.
Пишу в AtmelStudio7.
Как правильно делать?
FeCat писал(а):Кидаю в одну папку с main.cpp файлом.
1. Этого, наверное, мало. Нужно добавить исполняемый файл в проект.
2. Объявление в .cpp-файлах внешних функций, находящихся в .c-файлах нужно делать через обрамление в extern "C"{}
[uquote="Аlex",url="/forum/viewtopic.php?p=3617081#p3617081"]Нужно добавить исполняемый файл в проект.[/uquote]
[uquote="ARV",url="/forum/viewtopic.php?p=3617076#p3617076"]добавлять исходники в проект средствами IDE[/uquote]
Т.е. это нормально-правильно, что если в майне есть инклюд .h файла, то .cpp автоматом к нему не подтягивается? Надо обязательно средствами IDE добавлять, а не из main или добавленных к main файлов. Далать "#include "timer8.cpp"" - вроде как не правильно?