Вы используете неправильный шаблон. Я бы рекомендовал хранить список этих делегатов и перебирать их по списку, вместо того, чтобы использовать множественные имена для вызова нескольких целей.
Вы можете сделать эту работу (если нужно), изменив подпись, чтобы включить переменная «состояние», передаваемая по ссылке на каждого вызывающего абонента:
private Action<Employee, Shift, QualCheckState> qualificationCheckCallback;
public class QualCheckState { public bool Passed { get; set; } }
// Call it thus:
var state = new QualCheckState { Passed = true }; // Hope for the best
qualificationCheckCallback(someEmployee, someShift, state);
if (state.Passed) {
// Assume everyone passed
}
Имейте в виду, для этого требуется, чтобы вызываемые лица соблюдали подпись и не перезаписывали чье-либо несостоявшееся состояние:
public void SomeCallee(Employee e, Shift s, State state) {
// If some other check failed, don't bother doing our check.
if (!state.Passed) return;
// Do some check here
if (checkFailed) state.Passed = false;
}
Конечно, вы можете также расширить этот шаблон, чтобы сделать его более безопасным:
public class QualCheckState {
private List<bool> _results = new List<bool>();
public bool Passed { get { return _results.All(s => s); }
public void RecordResult(bool result) {
_results.Add(result);
}
}
Решение MSVC:
#include <io.h>
#include <fcntl.h>
...
_setmode(1,_O_BINARY)
Другие временные ряды могут предоставить решение C99 или альтернативный путь. EDIT: Я считаю, что setmode([file number],O_BINARY)
возникла на Borland Turbo C, а другие компиляторы для MS-DOS и Windows имитировали его. Префикс _ делается для того, чтобы пространство имен было чистым и могло отсутствовать на некоторых компиляторах.
Текстовый файл преобразует символ C '\n'
в родную строку, заканчивающуюся на выходе, и преобразует собственную строку, заканчивающуюся на входе, в один '\n'
.
Чтобы получить требуемый результат, вам нужно будет изменить stdout
в поток двоичных файлов.
Частичный ответ найден здесь здесь . Если у вас есть библиотека, совместимая с C99, использование:
if (freopen(0, "wb", stdout) == 0)
...oops...operation failed...
попытается изменить стандартный вывод на двоичный поток. Однако в Windows может возникнуть проблема с библиотекой, совместимой с C99. Номинально это переносимый (поскольку стандартный) ответ. Вероятно, для выполнения одной и той же работы существует функция, специфичная для Windows.
freopen()
находится в <stdio.h>
с версии 7 Unix, но поведение с нулевым указателем имени файла является новым на C99. В стандарте C89 ничего не говорится о нулевом указателе.
– Jonathan Leffler
28 April 2011 в 05:10
#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif
#ifdef __BORLANDC__
#define _setmode setmode
#endif
#include <stdio.h>
static void binary_stdout(void) {
#ifdef _WIN32
_setmode(_fileno(stdout), _O_BINARY);
#endif
}
int main(void) {
binary_stdout();
printf("\n");
return 0;
}
Просто введите символ LF
, например: putc('\x0A', stdout)
'\x0A'
; нотация '\0x0A'
- это многосимвольная константа, содержащая, по сути, 4 символа - NUL, x, 0, A. В результате реализована определенная реализация (поэтому вы можете определить, что она надежно, но она может варьироваться от платформы к платформе , или между компиляторами на одной платформе).
– Jonathan Leffler
28 April 2011 в 05:27
NULL
в качестве имени файла, а начальная строка, с которой вы начинаете, не обязательно имеет i> имя файла. – Random832 28 April 2011 в 05:01DISABLE_NEWLINE_AUTO_RETURN
. (Константа определена в Windows 10 SDK, но не в Windows 8 SDK) – AnT 24 January 2018 в 10:15