Я играю с Q #, который использует C # в качестве драйвера. Я хотел бы передать объект Qubit в код Q #, но он не работает должным образом.
C # Драйвер
using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;
namespace Quantum.QSharpApplication1 {
class Driver {
static void Main(string[] args) {
using (var sim = new QuantumSimulator()) {
var x = new Microsoft.Quantum.Simulation.Common.QubitManager(10);
Qubit q1 = x.Allocate();
Solve.Run(sim, q1, 1);
}
System.Console.WriteLine("Press any key to continue...");
System.Console.ReadKey();
}
}
}
Q #
namespace Quantum.QSharpApplication1
{
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (q : Qubit, sign : Int) : ()
{
body
{
let qp = M(q);
if (qp != Zero)
{
X(q);
}
H(q);
}
}
}
Когда я запускаю это, он работает без ошибок, пока не достигнет строк System.Console. *, И в этот момент он выдает следующее исключение в коде Q #
System.AccessViolationException
HResult=0x80004003
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=<Cannot evaluate the exception source>
StackTrace:
<Cannot evaluate the exception stack trace>
Отладчик связывает это с «let qp = M (q);» строка в Q #.
Обратите внимание, что это происходит в вызове Solve.Run, в реальном коде есть несколько вызовов Solve, и результат отображается правильно. Похоже, это происходит только после того, как область применения QuantumSimulator оставлена. Я помню, что читал, что Qubit должен быть сброшен на ноль, прежде чем он будет выпущен. Я не уверен, в этом ли проблема, но я не вижу способа сделать это в C #. Интересно, я удалил строки консоли, программа будет работать без ошибок (время?).