2015-07-30 2 views
5

Мне очень сложно понять, как пройти по ссылке в C#. В моем коде у меня есть функция, которая принимает два параметраУстранение неполадок передается по ссылке

private bool SerialUnEscape(byte serialData, ref byte serialResult) 
    { 
     if (((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_START) || 
        ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_END)) { 
      serialEscaped = false; 
      serialResult = 0; 
      return (true); 
      } 

     } else if (serialEscaped) { 

      if ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_ESCAPE_START) { 
       serialResult = (int)SerialProcessValue.SERIAL_PACKET_START; 
       serialEscaped = false; 
       return (true); 
      } 
     } else { 
      serialResult = serialData; 
      return (true); 
     } 

    } 

Я вызываю функцию со ссылкой как serialDataLsb & serialDataMsb.

Теперь моя путаница о, что бы значение serialDataLsb или serialDataMsb, это получить ли значение serialResult ??

for (i = 0; i < serialElements; i++) { 
    serialDataLsb = 0; 
    serialDataMsb = 0; 
    while (serialBufferWalk < serialIndex) { 
     if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataLsb)) { 
      break; 
       } 
       } 
    while (serialBufferWalk < serialIndex) { 
     if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataMsb)) { 
      break; 
      } 
     } 
serialElementData[i] = (UInt16)(serialDataLsb + (serialDataMsb << 8)); 
} 

и мне нужно перенести этот код на питон, 1), как я могу осуществить передачу по ссылке в питоне

Я попытался с помощью этого

while serialBufferWalk < serialIndex: 
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb): 
     break 
while serialBufferWalk < serialIndex: 
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb): 
     break 
+0

C! = C# .. Пожалуйста, отметьте вопрос правильно в следующий раз – Haris

+3

Если вам не нужно передавать значение в функцию, рассмотрите использование ключевого слова ['out'] (https://msdn.microsoft.com). /en-us/library/t3c3bfhx.aspx) вместо –

+1

Мне кажется, что этот код больше о Python, чем C#. Я предлагаю вам просто вернуть кортеж из Python ... –

ответ

0

Если вы действительно хотите, чтобы имитировать вместо ссылки на код, чтобы вернуть значение, вы можете обернуть примитив, который хотите изменить в объекте. Для простоты я использовал список:

def change_reference(byteContainer): 
    byteContainer[0] = 42 

b = 123 
print(b) # Prints 123 

# Copy the data into the container list. 
container = [b] 
# Pass a pointer to that list into the function. 
change_reference(container) 
# Take the value out of the container. 
b = container[0] 

print(b) # Prints 42 

Это делает вашу работу действительно запутанной. То, что вы действительно должны сделать, это включить измененные байты в возвращаемом значении:

def test_and_subtract(v): 
    if v == 1: 
     return (v - 1, True) 
    return (v - 2, False) 

v = 1 
v, b = test_and_subtract(v) 
print(v) # 0 
print(b) # True 

v = 5 
v, b = test_and_subtract(v) 
print(v) # 3 
print(b) # False 

Здесь return (v - 1, True) помещает оба результата в кортеж, и b, v удаляет их из этого кортежа.

Смежные вопросы