Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Пытаюсь сделать на Ардуине одну вещь. У меня есть структура такого типа: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. и несколько методов работы с ней: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. Чтобы добавить к значению datetime несколько секунд, используется метод addSeconds. Однако на выходе у меня остается старое значение. Чую, что намудрил с указателями, но не пойму где именно. Никак не пойму, как правильно объявить и вызывать метод addSeconds, чтобы переменная dt стала указателем на переменную, которую надо поменять. Вот тестовый код: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 20:55 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
ЛюбезныйНикак не пойму, как правильно объявить и вызывать метод addSeconds, чтобы переменная dt стала указателем на переменную, которую надо поменять. Или "datetime* dt" или "datetime& dt" - выбирай на вкус. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 21:03 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Проблема в том, что внутри этого метода addSeconds есть вызов другого метода, принимающего указатель на datetime. Получается передача указателя в указатель, и компилятор не хочет это пропускать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 21:06 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Любезныйи компилятор не хочет это пропускать. а так? Код: plaintext 1. 2. 3. или так? Код: plaintext 1. 2. 3. вообще, если так Код: plaintext 1. то это означает, что при вызове функции addSeconds будет создан новый объект datetime, в который скопируется передаваемый параметр, работа внутри будет вестись с этим объектом, а не с передаваемым параметром, поэтому значение после выхода не меняется. Ну и плюс ещё будет вызван конструктор. Т.е. передавать сложные объекты таким образом в функции бывает накладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 05:12 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
ЛюбезныйПроблема в том, что внутри этого метода addSeconds есть вызов другого метода, принимающего указатель на datetime. Получается передача указателя в указатель, и компилятор не хочет это пропускать. Чтобы переданная в функцию переменная меняла свое значение после завершения функции надо передать в нее либо ссылку, либо указатель. Первое является по сути константным указателем, поэтому если нет желания "перенаправить" внутри вызываемой функции указатель на другое место, то лучше использовать ссылки (чтобы компилятор мог сделать оптимизации + меньше потенциальных ошибок). Поэтому надо так (формальный параметр dt становится ссылкой на переменную вызывающей функции): Код: plaintext 1. 2. 3. 4. 5. 6. "Внутренние" функции должны выглядеть похожим образом (src и res являются ссылкой на первую ссылку, которая является ссылкой на реальную переменную -> src и res является ссылкой на реальную переменную): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. Смысл твое чудо- кода я не анализировал, только изменил правильность работы с ссылками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 10:05 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Любезный, boost::datetime же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:04 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Любезный, Код: plaintext 1. 2. 3. 4. 5. 6. Ты видимо модифицируешь переменную dt , а передаёшь то ты её в функцию ПО ЗНАЧЕНИЮ, это значение в функции и умирает.. Не майся дурью , используй boost::datetime. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:07 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
ЛюбезныйПроблема в том, что внутри этого метода addSeconds есть вызов другого метода, принимающего указатель на datetime. Получается передача указателя в указатель, и компилятор не хочет это пропускать. Не ну это тебе книжки надо читать. Так мы тебе каждую строчку твоего кода писать будем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:08 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
MasterZivЛюбезный, boost::datetime же... Буст в ардуине? Не смешите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 14:40 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
автора так? Код: sql 1. 2. 3. авторexit status 1 could not convert 'dt' from 'datetime*' to 'datetime' авторили так? Код: sql 1. 2. 3. авторexit status 1 could not convert '& dt' from 'datetime*' to 'datetime' авторто это означает, что при вызове функции addSeconds будет создан новый объект datetime, в который скопируется передаваемый параметр, работа внутри будет вестись с этим объектом, а не с передаваемым параметром, поэтому значение после выхода не меняется. Ну и плюс ещё будет вызван конструктор. Т.е. передавать сложные объекты таким образом в функции бывает накладно. Всем большое спасибо за подсказки. То, что у меня идет передача по значению мне было понятно и ранее, однако у меня просто не шибко укладывается в голове, как организовать внутри метода, принимающего в качестве входного параметра указатель на переменную, вызов другого метода, принимающего тот же самый указатель для корректировки значения переменной. Была бы возможность явно указать, что я перекидываю адрес переменной в памяти из одного метода в другой... Надо мне слегка отоспаться после дежурства, может быть, завтра удастся что-то попробовать в среде с компиляцией и проверкой результата на плате. Бусты - не знаю, как Ардуино может их воспринять. Хочу все же сделать что-то простенькое и попутно понять арифметику и записи указателей в Си-подобных языках. Книжку читаю, нашел там про передачу ссылки на структуру и про запись вида res->day, здесь как раз понятно. А про передачу указателя из метода в метод - как-то не прет, может быть, книжка объясняет не шибко ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 18:29 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Буст не трогай, это нехороший совет был. Если в С++ с трудом разбираешься, то буст тебе мозг взорвет. А с указателями все просто, указатель это адрес в памяти где лежит данные заданного типа. Сами данные Код: plaintext 1. адрес этих данных Код: plaintext 1. Указатель Код: plaintext 1. Получение данных по указателю Код: plaintext 1. Но лучше указателями лишний раз не пользоваться, стрелять в ноги с ними проще простого. Используй ссылки Код: plaintext 1. 2. 3. Просто добавил & после типа и в функцию передается не копия переменной, а используется сама переменная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 18:45 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
Любезныйу меня просто не шибко укладывается в голове, как организовать внутри метода, принимающего в качестве входного параметра указатель на переменную, вызов другого метода, принимающего тот же самый указатель После того, как ты получаешь указатель на вход - можешь засовывать этот указатель куда угодно и сколько угодно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 19:19 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
авторБуст не трогай, это нехороший совет был. Если в С++ с трудом разбираешься, то буст тебе мозг взорвет. А с указателями все просто, указатель это адрес в памяти где лежит данные заданного типа. За этот пост отдельное спасибо: всё коротко, ёмко и ясно в одном сообщении. В книжке, которую я смотрю, всё это разбито на несколько страниц, и у меня это как-то не компоновалось. авторНо лучше указателями лишний раз не пользоваться, стрелять в ноги с ними проще простого. Используй ссылки Конкретно в данном случае я решил сделать через ссылки, и всё заработало. Но к сожалению, насколько я понял, ссылки - это прерогатива плюсового языка, а так как я потом хочу научиться программировать микроконтроллеры на чистом С, от указателей никуда не уйти. Впрочем, я предпочитаю стрелять сразу в голову. :) Разберусь, тем более в этой теме уже написано достаточно всего. Всем огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 10:47 |
|
||
|
Прошу помочь новичку в С понять указатели и ссылки
|
|||
|---|---|---|---|
|
#18+
ЛюбезныйавторБуст не трогай, это нехороший совет был. Если в С++ с трудом разбираешься, то буст тебе мозг взорвет. А с указателями все просто, указатель это адрес в памяти где лежит данные заданного типа. За этот пост отдельное спасибо: всё коротко, ёмко и ясно в одном сообщении. В книжке, которую я смотрю, всё это разбито на несколько страниц, и у меня это как-то не компоновалось. авторНо лучше указателями лишний раз не пользоваться, стрелять в ноги с ними проще простого. Используй ссылки Конкретно в данном случае я решил сделать через ссылки, и всё заработало. Но к сожалению, насколько я понял, ссылки - это прерогатива плюсового языка, а так как я потом хочу научиться программировать микроконтроллеры на чистом С, от указателей никуда не уйти. Впрочем, я предпочитаю стрелять сразу в голову. :) Разберусь, тем более в этой теме уже написано достаточно всего. Всем огромное спасибо. Вообще, что написано тут, написано в любой книжке (по С или С++). Почему бы тебе их не почитать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 12:52 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39618846&tid=2017917]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 265ms |
| total: | 414ms |

| 0 / 0 |
