Compare commits
2 Commits
337aa2d33c
...
6fbe746846
Author | SHA1 | Date | |
---|---|---|---|
6fbe746846 | |||
5881d77f95 |
133
content/posts/2023/cpp/link_to_class.md
Normal file
133
content/posts/2023/cpp/link_to_class.md
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
---
|
||||||
|
title: "⤵️ Передача переменной по ссылке в C/C++"
|
||||||
|
date: 2023-03-27T23:25:00+03:00
|
||||||
|
draft: false
|
||||||
|
tags: [c, cpp, development, tips]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Введение
|
||||||
|
|
||||||
|
Дано: передать в класс внешную переменную,
|
||||||
|
чтобы её изменения во вне класса передавались в пременную класса.
|
||||||
|
|
||||||
|
**Простым языком:**
|
||||||
|
Мне необходимо было из класса обрабатывать данные телеметрии,
|
||||||
|
значения которых изменялись в программе
|
||||||
|
и хранились в объявленных перменных вне класса.
|
||||||
|
|
||||||
|
При передачи переменной `variable` в функцию `example_func()`
|
||||||
|
передаётся значение перменной.
|
||||||
|
|
||||||
|
Если это значение изменить в переменной, само значение `variable`
|
||||||
|
не изменится.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void example_func(int variable);
|
||||||
|
```
|
||||||
|
|
||||||
|
Для реализации цели, нужно передать в функцию значение по ссылке.
|
||||||
|
Для этого использую операнд `*`, символ звёдочки.
|
||||||
|
|
||||||
|
Простой пример функции, которая меняет значение переданных в неё
|
||||||
|
двуъ перменных `x` и `y`.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void swap(int *x, int *y) {
|
||||||
|
int temp;
|
||||||
|
temp = *x; /* сохраняю значения по адресу х */
|
||||||
|
*х = *у; /* помещаю у в х */
|
||||||
|
*у = temp; /* помещаю х в у */
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Следует помнить, что `swap()` или любая другая функция,
|
||||||
|
использующая указатели на параметры должна вызываться с адресами аргументов.
|
||||||
|
|
||||||
|
Для этого используется оператор `&`, символ амперсанда.
|
||||||
|
|
||||||
|
Следующая программа демонстрирует правильный способ вызова `swap()`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void swap (int *x, int *y);
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int x, y;
|
||||||
|
x = 10;
|
||||||
|
у = 20;
|
||||||
|
|
||||||
|
swap(&x, &y);
|
||||||
|
printf ("%d %d", x, y);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
В данном примере переменной `х` присваивается значение `10`,
|
||||||
|
а переменной `у` значение `20`.
|
||||||
|
Затем вызывается функция `swap()` с адресами переменных `х` и `у`.
|
||||||
|
Унарный оператор `&` используется для получения адресов переменных.
|
||||||
|
Поэтому в функцию `swap()` передаются адреса переменных `х` и `у`,
|
||||||
|
а не их значения.
|
||||||
|
|
||||||
|
Спасибо ресурсу [c-cpp.ru](http://www.c-cpp.ru/books/sozdanie-peredachi-po-ssylke)
|
||||||
|
за код.
|
||||||
|
|
||||||
|
_Когда я кипел над кодом, то не мог вспомнить как проделать такой трюк.
|
||||||
|
(на Си последнее время пишу не часто, вот и запамятывал).
|
||||||
|
Вышеуказанную статью нагуглить получилось только
|
||||||
|
в ходе написании этого руководста, а результать того,
|
||||||
|
что я вспомнил самостоятельно, я расписал ниже._
|
||||||
|
|
||||||
|
## Код с использованием класса
|
||||||
|
|
||||||
|
Имеется класс `Example`, у которого есть приватная переменная
|
||||||
|
`variable`, которая объявлена с сиволом звёдочки.
|
||||||
|
|
||||||
|
А также конструктор и метод `show()`.
|
||||||
|
|
||||||
|
При создании класса я передаю в него ссылку на переменную
|
||||||
|
и сохраняю эту ссылку в приватной переменной класса `variable`.
|
||||||
|
|
||||||
|
Метод `show()` выводит значение перменной.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
class Example {
|
||||||
|
public:
|
||||||
|
Example(int *xxx) { variable = xxx; }
|
||||||
|
void show() { cout << "value: " << *variable << endl; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int *variable;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Полный код:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Example {
|
||||||
|
public:
|
||||||
|
Example(int *xxx) { variable = xxx; }
|
||||||
|
void show() { cout << "value: " << *variable << endl; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int *variable;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int test_var = 13;
|
||||||
|
|
||||||
|
Example x = Example(&test_var);
|
||||||
|
x.show(); // тут выведется 13
|
||||||
|
|
||||||
|
test_var = 14; // изменяю значение внешней переменной
|
||||||
|
x.show(); // тут выведется 14
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
66
content/posts/2023/html/contenteditable-placeholder.md
Normal file
66
content/posts/2023/html/contenteditable-placeholder.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
title: "🏷️ Реализация placeholder для изменяемых HTML элементов"
|
||||||
|
date: 2023-03-27T23:45:00+03:00
|
||||||
|
draft: false
|
||||||
|
tags: [development, tips, html, css]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Это очень просто
|
||||||
|
|
||||||
|
Не нужно слов, сразу показываю код!
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p id="post-title" contenteditable="true" data-ph="Post title"></p>
|
||||||
|
<p id="post-dec" contenteditable="true" data-ph="Post desc"></p>
|
||||||
|
```
|
||||||
|
|
||||||
|
**CSS:**
|
||||||
|
|
||||||
|
```css
|
||||||
|
[contenteditable=true]:empty:not(:focus):before {
|
||||||
|
content: attr(data-ph);
|
||||||
|
}
|
||||||
|
|
||||||
|
[contenteditable=true]:empty:before {
|
||||||
|
content: attr(data-ph);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Разбор
|
||||||
|
|
||||||
|
В HTML реализована фича, которая позволяет изменять содержимое
|
||||||
|
любого HTML элемента.
|
||||||
|
|
||||||
|
За это отвечает атрибут `contenteditable`.
|
||||||
|
|
||||||
|
Берём `<div>`, добавляет атрибут `contenteditable="true"`
|
||||||
|
и получаем аналог `<textarea>` 😉
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div id="textarea" contenteditable="true" data-ph="Input text...">some text</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Однако, если очистить текст из элемента,
|
||||||
|
он начинает скакать на странице и установка CSS свойств
|
||||||
|
`margin`, `padding` и других вообще не помогает.
|
||||||
|
|
||||||
|
Нужно, чтобы в элементе «что-то было».
|
||||||
|
|
||||||
|
Реализовать это можно с помощью CSS свойста `content`.
|
||||||
|
|
||||||
|
```css
|
||||||
|
[contenteditable=true]:empty:not(:focus):before {
|
||||||
|
content: attr(data-ph);
|
||||||
|
}
|
||||||
|
|
||||||
|
[contenteditable=true]:empty:before {
|
||||||
|
content: attr(data-ph);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Следующий код добавляет в тело элементов с атрибутом
|
||||||
|
`contenteditable=true` значение из атрибута HTML элемента `data-ph`.
|
||||||
|
|
||||||
|
Правила `:empty` и `:not(:focus)` проверяют что HTML тег пуст и не в фокусе.
|
Loading…
Reference in New Issue
Block a user