2013-05-08 1 views
1

포인터를 증가시키려는 중 오류가 발생합니다.고정 된 블록 안의 포인터를 증가시키지 않으면 작동하는 것 같습니다.

그것이 fixed 블록에서 선언

unsafe void organize_data() 
{ 
    fixed(byte* ptr = &database[0]) 
    { 
     fixed(byte* ptruc = &dtbaseuc[0]) 
     { 
      strcnt=1; 
      linestrts[0]=0; 
      for(int i=0;i<filelen;i++) 
      { 
       if(*ptr > 96 && *ptr < 123)*ptruc=(byte)((int)*ptr-(int)32); 
        if(*ptr ==13) 
        { 
         linestrts[strcnt]=i+1; 
         strcnt++; 
        } 
       ptr++; 
       ptruc++; 
      } 
     } 
    } 
    textBox2.Text=strcnt.ToString(); 
} 
+1

심각하게도 왜 '안전하지 않은'이유를 사용해야합니까? – leppie

+0

& database [0]은 배열의 0 요소 주소입니다. 대신 & 데이터베이스를 사용하지 마십시오. –

+1

@KamilKrasinski : 그럴 가치가 없습니다. 그는'데이터베이스'만을 사용해야합니다. – leppie

답변

6

변수는 읽기 전용이며 할당 할 수 없습니다 다른 포인터 ptruc에 대한 고정 변수 CS1656에게 또한 동일한 오류 때문에 ptr에 할당 할 수 없습니다. 대신 포인터를 복사 한 다음 사본을 증가시켜야합니다.

fixed (byte* ptr = &database[0]) { 
    byte* dbPtr = ptr; 

    ptr++; // CS1656, ptr is read-only. 
    dbPtr++; // Valid. 
} 
+0

굉장합니다. C 백그라운드에서 C#으로 고생하는 것을 볼 수 있듯이. 감사합니다 –

+1

@KelseyBowman 문제는 없습니다. 순수한 C# 방식으로 작성하고 안전하지 않은 코드는 피하는 것이 좋습니다. 여기 인덱스 된 배열 액세스로는 할 수없는 것이 없습니다. – cdhowie

+1

@KelseyBowman : cdhowie가 맞습니다; 우수 사례를 사용하여 코드를 작성하면 지터가 충분히 빠른 코드를 생성해야합니다. 그리고 이것은 프로그램에서 가장 느린 일이 될 것 같지 않습니다. –

관련 문제