Это потому, что вы ничего не пишете для консоли или интерфейса. Debug.write отличается от console.write
Кроме того, функция делегата может возвращаться через 1 секунду. Лучшая парадигма будет использовать await.
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Call the method that runs asynchronously.
Dim result As String = Await WaitAsynchronouslyAsync()
' Call the method that runs synchronously.
'Dim result As String = Await WaitSynchronously()
' Display the result.
TextBox1.Text &= result
End Sub
' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Finished"
End Function
' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
' Import System.Threading for the Sleep method.
Thread.Sleep(10000)
Return "Finished"
End Function
https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/await-operator
Где
MIN
иMAX
определены в C, если они вообще определены?
Нет.
Как лучше всего реализовать их как можно более обобщенно и безопасно по типу (предпочтительны расширения / встроенные функции компилятора для основных компиляторов).
Как функции. Я бы не стал использовать макросы вроде #define MIN (X, Y) (((X) <(Y))? (X): (Y))
, особенно если вы планируете развернуть свой код. Либо напишите свой, используйте что-то вроде стандартного fmax
или fmin
, либо исправьте макрос, используя GCC typeof (вы также получите бонус за безопасность типов) в Выражение оператора GCC :
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
Все говорят: «О, я знаю о двойном вычислении, это не проблема», и через несколько месяцев вы будете часами отлаживать самые глупые проблемы.
Обратите внимание на использование __ typeof __
вместо typeof
:
Если вы пишете файл заголовка, должен работать при включении в ISO C программ, напишите
__ typeof __
вместотип
.
@David Titarenco закрепил его здесь , но позвольте мне, по крайней мере, очистить его немного, чтобы заставить его выглядеть хорошим, и показать и min()
и max()
вместе для создания копирования и вставки отсюда легче.:)
Эта техника является наиболее часто используемой, хорошо уважается теми, кто знает, как использовать ее правильно, "фактический" способ сделать вещи, и прекрасный для использования, если используется правильно, но багги (думайте: побочный эффект двойной оценки ), если Вы когда-нибудь передаете выражения включая переменное присвоение в выдержать сравнение:
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
Эта техника избегает вышеупомянутых побочных эффектов "двойной оценки" и ошибок, и поэтому считается начальником, более в безопасности, и "более современным" способ GCC C сделать это:
, НО: ДЕЙСТВИТЕЛЬНО не упустите" переменное затенение " эффекты все еще, поскольку выражения оператора, по-видимому, встраиваются и поэтому НЕ имеют своего собственного объема локальной переменной!
#define max(a,b) \
({ \
__typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; \
})
#define min(a,b) \
({ \
__typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; \
})
Примечание, что в gcc выражениях оператора, последнее выражение в блоке кода - то, что "возвращается" из выражения, как будто это было возвращено из функции. в документации GCC говорится это этот путь:
последней вещью в составном операторе должно быть выражение, сопровождаемое точкой с запятой; значение этого подвыражения служит значением всей конструкции. (При использовании некоторого другого вида оператора в последний раз в фигурных скобках конструкция имеет тип пусто и таким образом эффективно никакое значение.)
Примечание C++: при использовании C++ шаблоны, вероятно, рекомендуются для этого типа конструкции вместо этого.
В C ++ есть std :: min
и std :: max
, но, AFAIK, эквивалента в стандартной библиотеке C нет. Вы можете определить их самостоятельно с помощью макросов типа
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
, но это вызовет проблемы, если вы напишете что-то вроде MAX (++ a, ++ b)
.
Он также содержится в версиях sys/param.h в GNU libc (Linux) и FreeBSD, и имеет определение, предоставленное dreamlax.
На Debian:
$ uname -sr
Linux 2.6.11
$ cat /etc/debian_version
5.0.2
$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
$ head -n 2 /usr/include/sys/param.h | grep GNU
This file is part of the GNU C Library.
На FreeBSD:
$ uname -sr
FreeBSD 5.5-STABLE
$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
Репозитории исходников находятся здесь:
Я не думаю, что это стандартизированные макросы. Для плавающей точки уже есть стандартизированные функции, fmax
и fmin
(и fmaxf
для плавающих чисел, и fmaxl
для длинных двоек).
Вы можете реализовать их как макросы, если вы знаете о побочных эффектах/оценке двойников.
#define MAX(a,b) ((a) > (b) ? a : b)
#define MIN(a,b) ((a) < (b) ? a : b)
В большинстве случаев вы можете оставить компилятору право определить, что вы пытаетесь сделать, и оптимизировать это как можно лучше. Хотя это вызывает проблемы при использовании типа MAX(i++, j++)
, я сомневаюсь, что есть большая необходимость в проверке максимального из увеличиваемых значений за один раз. Сначала инкрементируйте, затем проверяйте.