Как сделать двойную ссылку
БлогNot. Как сделать в HTML «двойную» ссылку, то есть, чтобы при щелчке по ссылке соверша.
Как сделать в HTML «двойную» ссылку, то есть, чтобы при щелчке по ссылке совершался переход на нужный адрес плюс открывалось новое окно с другим адресом?
В качестве ответа на заданный простой вопрос привожу здесь код на HTML + JavaScript. Следует учесть, что браузер может блокировать всплывающие окна, открываемые через JavaScript.
Листинг сохраняется в файле с расширением HTML, а открыть этот пример пытается файлы из текущей папки с именами html1.html и html2.html
27.01.2009, 17:27 [19105 просмотров]
Сделать двойную ссылку
![]()






Отправлено 19 Январь 2017 — 14:41
Как сделать двойную ссылку? То бишь мне надо если человек зарегистрирован, то он нормально переходил по ней, а если нет то его кидало по другой ссылки.
Вот как у меня, но что мне добавить сюда?
- StevMype это нравится
#2
Santiago






Отправлено 19 Январь 2017 — 16:54
Anchor 1 Anchor 1
$userLoggedIn заменяй на свое условие, как там у тебя проверяется,авторизован пользователь или нет
#3
Nekro






Отправлено 19 Январь 2017 — 21:15
Anchor 1 Anchor 1
$userLoggedIn заменяй на свое условие, как там у тебя проверяется,авторизован пользователь или нет
Благодарю, а как узнать как у меня проверяется?
#4
Santiago






Отправлено 19 Январь 2017 — 21:34
Благодарю, а как узнать как у меня проверяется?
Смотреть код)) Во всех движках по разному. Где-то обращаются напрямую в сессию, где-то есть вспомогательные классы или функции
Как сделать двойную ссылку
= Мир MS Excel/Статьи об Excel
МЕНЮ САЙТА
Информация о сайте
Развите сайта
Приемы работы
Инструменты и настройки
Интеграция
Готовые решения
Вопросы и решения
Работа и общение
Работа форума и сайта
Библиотека
Книги по Excel
Книги по VBA
Видеосалон
Справочники
Разработчик
КАТЕГОРИИ РАЗДЕЛА
| Приёмы работы с книгами, листами, диапазонами, ячейками [6] |
| Приёмы работы с формулами [14] |
| Настройки Excel [3] |
| Инструменты Excel [4] |
| Интеграция Excel с другими приложениями [4] |
| Форматирование [1] |
| Выпадающие списки [2] |
| Примечания [1] |
| Сводные таблицы [1] |
| Гиперссылки [1] |
| Excel и интернет [1] |
| Excel для Windows и Excel для Mac OS [2] |
Функция ДВССЫЛ() и стиль ссылок R1C1
Что мы знаем о функции ДВССЫЛ()?
Название ДВССЫЛ означает Двойная ссылка, то есть ссылка на ссылку. Эта функция позволяет получить значение ячейки, имя (адрес) которой является аргументом функции ДВССЫЛ(). Например, формула =ДВССЫЛ(«A1») вернёт содержимое ячейки А1, а формула =ДВССЫЛ(A1) вернёт содержимое ячейки, адрес которой находится в ячейке А1. Аналогичный результат дадут формулы =ДВССЫЛ(«R1C1») и =ДВССЫЛ(R1C1), если Excel настроен на применение стиля ссылок R1C1.

Небольшое отступление. Excel в зависимости от настроек работает с одним из двух стилей ссылок: A1 или R1C1. В первом случае столбцы обозначаются буквами латинского алфавита, соответственно, адрес ячейки выглядит как А1, D10 и т.д. Во втором случае столбцы, так же как и строки, обозначаются числами, а адрес выглядит, например, так: R1C1, R10C4 (строка10 столбец4), R[-1]C (ячейка в предыдущей строке и в том же столбце относительно активной).
Большинство пользователей предпочитают использовать стиль A1, но для некоторых задач стиль R1C1 является более удобным.
Изменить используемый стиль ссылок можно в Параметрах Excel — Формулы — флажок Стиль ссылок R1C1.
Второй, необязательный, аргумент функции ДВССЫЛ(), который может быть равен 0 или 1 (ЛОЖЬ или ИСТИНА), как раз определяет стиль используемой ссылки. 1 соответствует стилю A1 (принимается по умолчанию), а 0 — типу R1C1
Самое интересное заключается в том, что функция ДВССЫЛ() позволяет менять стиль ссылок в формуле, не изменяя настройки Excel, например, использовать в формулах стиль ссылок R1C1, в то время как Excel настроен на стиль A1.
Рассмотрим несколько примеров.
Пример1.
Предположим, нам нужно подсчитывать сумму с накоплением для столбца с данными (см. рисунок).

Одним из вариантов формулы является =СУММ(B1;A2). Но у этой формулы есть недостаток: при удалении строки формула ломается и возвращает ошибку #ССЫЛКА! Как сделать так, чтобы при удалении строки формула по-прежнему ссылалась на предыдущую ячейку? На помощь приходит ДВССЫЛ в формуле =СУММ(ДВССЫЛ(«R[-1]C»;0);A2). В данной формуле R[-1]C — это ссылка на ячейку, которая находится на строку выше от активной ячейки и в том же столбце. А второй аргумент функции ДВССЫЛ(), равный 0, как раз и позволяет использовать этот стиль ссылок в формуле, не изменяя общие настройки Excel.

Пример2.
Достаточно часто функция ДВССЫЛ() используется, когда нужно брать данные с разных листов в зависимости от значения ячейки, в которой содержится имя листа.
Предположим, есть некие данные за несколько лет по месяцам. Данные за год располагаются на листе с соответствующим именем. В приложенном файле-примере это листы 2014, 2015 и 2016.
На листе Отчёт мы хотим получить данные с выбранного листа. Выбор осуществляется с помощью выпадающего списка в ячейке B1. Структура таблиц на всех листах одинакова (см. рисунок)


В этом случае формула на листе Отчёт будет выглядеть так =ДВССЫЛ($B$1&»!RC»;0), где в ячейке $B$1 содержится год, адрес RC означает, что мы получим значение из тех же строки и столбца, что и активная ячейка, а второй аргумент 0, как мы уже знаем, позволяет использовать стиль ссылок R1C1. Причём эта формула легко копируется как вниз, так и вправо на всю таблицу.
Кроме этого, предположим, на листах 2015 и 2016 мы хотим получить разницу показателей по сравнению с тем же периодом предыдущего года.
С этой задачей успешно справится формула =B4-ДВССЫЛ($B$1-1&»!RC[-2]»;0). В данном случае мы берём значения с листа, год которого на 1 меньше, чем у текущего, из ячейки, находящейся на той же строке, но на два столбца левее активной, и вычитаем его из данных за текущий год. Формула также копируется вниз и вправо.

В заключении надо добавить, что функция ДВССЫЛ() является волатильной, поэтому не стоит увлекаться ей на больших объёмах
Для чего нужна двойная ссылка &&?
В таком коде мы как бы создаём псевдоним для a, который называется b. То есть обе эти переменные указывают на одну и ту же область памяти, у этих переменных одинаковый адрес.
Такая логика плюс-минус работает с такой записью:
const int& c = 5;
Я представляю это так: 5 находится в области памяти, записать в которую мы ничего не можем (из-за этого мы не можем написать, допустим, 5 = a), но при этом мы можем из этой области читать. Получается, что запись без const опасна — мы рискуем изменить что-то в этой памяти, а с const всё хорошо — мы создали псевдоним для области памяти, которую мы можем только читать.
А вот это что такое и какой у этого смысл, я не могу понять:
int&& d = 5;
Псевдоним для псевдонима. не могу понять. Чувствуется потребность в знании языка ассемблера, но я хотел бы для начала основы понять.
- Вопрос задан более года назад
- 305 просмотров
5 комментариев
Простой 5 комментариев
Евгений Шатунов @MarkusD Куратор тега C++
Я представляю это так: 5 находится в области памяти, записать в которую мы ничего не можем (из-за этого мы не можем написать, допустим, 5 = a), но при этом мы можем из этой области читать.
Этот момент ты понимаешь неправильно.
5 — это литерал с категорией prvalue . Категория выражения говорит о том, что выражение имеет полный тип и не является полиморфным, не является массивом, лишено идентичности.
Но вот что важно! Для такого выражения невозможно получить адрес и такое выражение не может находиться в левой части операции присвоения.
Вот почему 5 = a приводит к ошибке трансляции.
Но что тогда происходит в выражении const int& c = 5; ?
Тут происходит инициализация константной ссылки. prvalue могут использоваться для инициализации только константной ссылки, в следствии чего создается локальный временный объект с типом эквивалентным подлежащему типу ссылки. Литерал же используется для инициализации этого локального временного. Обычно локальный временный уничтожается сразу после завершения операции. Однако здесь вступает в силу продление жизни временного за счет именно инициализации константной ссылки.
Код очень простой, но понимать его нужно только правильно. Иное понимание такого простого кода обычно приводит к неуловимым ошибкам и большим проблемам отладки.
Вот достаточно простой пример такой ошибки. Код работает не так, как написан.
Kevsh @FaulerAffe Автор вопроса
Евгений Шатунов, я прогнал у себя ваш пример и у меня отладчик в цикл даже не заходит. Что тут должно вызвать ошибку мне не очень ясно, если честно. Мы возвращаем ссылку на вектор — то есть в цикле мы работаем прямо с тем вектором, который создаётся при создании объекта класса. Такая логика вроде работает, если переписать всё вот таким образом:
auto vect = Foo<>.GetValues(); for (const auto& value : vect)
Видимо тут проблема в том, что результат вызова функции никуда не сохраняется.
Ещё возник вопрос, а есть ли разница между этими вариантами? В обоих случаях c имеет один и тот же адрес.
#include int main()
#include int main()
Евгений Шатунов @MarkusD Куратор тега C++
Ещё возник вопрос, а есть ли разница между этими вариантами? В обоих случаях c имеет один и тот же адрес.
Нет, разницы между этими двумя примерами нет никакой. Ссылка, согласно стандарту, это эфемер. У ссылки не описывается характеристик размера или выравнивания. С т.з. стандарта ссылка присутствует в коде только до момента окончания 7й стадии трансляции — стадии компиляции кода.
На практике, все трансляторы под ссылкой понимают нечто иное и не такое эфемерное. Но суть сейчас в том, что на счет ссылки говорит стандарт.
я прогнал у себя ваш пример и у меня отладчик в цикл даже не заходит.
Это все потому что ты пока еще не очень хорошо ориентируешься между стандартами. В 14-м стандарте этот код может даже работать так как он написан. В 17-м поведет себя так, как я описал и это будет правильно. Если у тебя стандарт 17й и нет входа в цикл, то все тоже нормально.
Все потому что в моем примере присутствует неопределенное поведение в следствии обращения к висячей ссылке.
Я изначально написал что пример у тебя простой, но понимать его нужно строго правильно.
В 17-м стандарте мой пример будет эквивалентен вот этому коду.
int main() < const std::vector& data< Foo<>.GetValues() >; auto current = data.begin(); auto end = data.end(); for( ; current != end; ++current ) < const auto& value = *current; std::cout >
Теперь проблему лучше видно?
Давай обратим внимание на std::vector& data< Foo<>.GetValues() >; и то, что я писал комментарием выше. Локальный временный уничтожается сразу после завершения операции.
Сразу же после инициализации data становится висячей ссылкой. Следующая же строка уже вносит в код UB.
Kevsh @FaulerAffe Автор вопроса
Евгений Шатунов, а вот этот пример у меня даже не компилируется, ну и ладно. Как я понял — был создан временный объект, мы вернули константную ссылку на его поле, после чего объект сразу же уничтожается, от чего ссылка, с помощью которой мы создали вектор data, стала висячей. Вы хотели сказать, что нельзя возвращать из функции ссылку на временный объект? Не очень понятно, какая разница — возвращать константную ссылку или обычную (именно в вашем примере)?
Кстати о ссылках на временные объекты:
class A < private: int value; public: A(int x) < this->value = x; >; int& getValue() < return this->value; >; >; A& getRef() < A a(5); return a; >int main() < A& m = getRef(); std::cout
Вот тут всё понятно - выводится мусор, потому что возвращаемый по ссылке объект уже уничтожен.
А вот тут другая ситуация:
int& getRef() < A a(5); return a.getValue(); >int main()
Тут возвращается ссылка на поле уничтожаемого объекта, а выводится все корректно. Странно
Евгений Шатунов @MarkusD Куратор тега C++
Владимир Коршунов
int& m = getRef(); - тут ровно так же UB и, на самом деле, это чистая случайность что вывелась 5 .
int - это очень плохой тип для таких проверок. Измени код чтобы везде использовался std::shared_ptr и посмотри что будет. Транслятор тебе даже пометил неприемлемость возврата ссылки на локальный объект.
Продление жизни временного работает только при инициализации константных ссылок.
Вы хотели сказать, что нельзя возвращать из функции ссылку на временный объект?
Это - само собой разумеющееся. В коде моих примеров ведь нет возврата временных объектов по ссылке.
Я хотел сказать что нужно правильно понимать время жизни локальных временных и продление их жизни через инициализацию константной ссылки.
const int& c = 5; - тут локальный временный int( 5 ) продолжит жить после инициализации локальной ссылки.
for( const auto& value : Foo<>.GetValues() ) - тут локальный временный Foo<> уничтожается еще до выборки первого элемента.
Решения вопроса 1
Программист на «си с крестами» и не только
Ссылка на временный объект.
Прямо ( int&& d = 5 ) используется крайне редко, чтобы продлить время жизни временному объекту.
Куда чаще оно используется в типах возврата ( string&& Container::give() ), и означает: это ссылка на объект, который спокойно можно выпотрошить. Или в типах параметров — Container& Container::operator = (string&& x) : то есть принимает объект, который больше не нужен.
Для чего потрошить объекты? Вот представьте себе код.
std::vector doSmth() < std::vectorr; r.push_back(42); return r; > . std::vector a = doSmth();
Забьём на необязательные оптимизации — как эта штука будет действовать по семантике Крестов?
std::vector r; — создадим в стековом фрейме переменную r.
return r; — vector(const vector&) в какое-то место, предложенное вызывающей функцией.
std::vector a = doSmth(); — vector(const vector&) из этого места в a.
Си++17 ТРЕБУЕТ, чтобы подобный возврат гарантированно вызывал ОДИН конструктор копирования (а если конструировать на месте вроде return vector< 42 >; — то ни одного), но у нас-то Си++03. Не много конструкторов? А ведь зная, что объект больше не нужен, можем просто перенести указатель из одного вектора в другой, точка — даже впрямую, без оптимизаций, никаких перевыделений памяти. Вот этот прямой перенос указателей я и назвал словом «выпотрошить объект».
Пример 1: container = string("alpha") + "bravo"; Тут в контейнер перемещается временная строка.
Пример 2: string a = "alpha"; container = a; Не компилируется: строка a не временная.
Пример 3. container1 = container2.give(); Перенос строки из контейнера в контейнер без выделения памяти.
Пример 4: string a = "alpha"; container = std::move(a); Компилируется (мы функцией move сказали: с обычным объектом обращаться как с временным), но в результате в строке a может быть что угодно и не стоит закладываться на дальнейшее её значение. Но объект после потрошения в любом случае должен быть корректным, ведь ему ещё вызывать деструктор 🙂
Последний вопрос: кто потрошит? Функция, которая принимает временную ссылку как параметр. В данном случае Container::op=. Чем потрошит? — ну, например, кодом myString=std::move(x) или std::swap(myString, x) . А они, в свою очередь — внутренняя string::op= и дружественная swap — прямыми играми с указателями.