|
이건 여기 C++빌더 Q/A에서 질문해야 될게 아니라, C/C++ Q/A에서 질문해야 할듯합니다.
요컨데, CCD항목을 클릭하면 0번비트와 1번비트만 0-3사이로 순차적으로 증가시키는 방법을 말씀하시는군요. 다른 비트값은 보존하면서요.... 그렇다면 지금까지 질문과 해결이 전체 문제에서 차지하는 비중으로 봐선 99%문제가 해결된게 아니라 지금부터가 문제일겁니다.
비트필드연산은 주로 하드웨어장치의 레지스트리제어나, 게임프로그래밍등등에서 많이 사용하는데 제어하는 방법은 두가지가 있습니다. 하나는 구조체의 비트필드를 사용하는방법이 있고, 다른 하나는 비트연산자를 사용하는 방법이 있습니다. 관련서적을 참고하시기 바랍니다.
질문하신 비트 자리수를 지정하여 출력하는 것은 없습니다.
#define ALL_BIT (0xFF) // 11111111
#define CCD_BIT (0x03) // 00000011
#define CCD_MASK ( ALL_BIT & ~(CCD_BIT)) // 11111100
#define CCD_VALUE(ch) ((ch) & CCD_BIT)
#define SET_CCD(ch,val) ( (ch) = ((ch) & CCD_MASK) + ((val) & CCD_BIT))
이렇게 선언하시구요.
필요한 소스에 아래코드를 추가.
char cCCd = CCD_VALUE( TotalData[2] ); // TotalData[2] CCD비트의 값만 추출.
cCCd++; // 값증가 또는 여기에서 cCCd = 1등으로 값을 줄수 있음. 단 0-3까지만 유효.
SET_CCD(TotalData[2],cCCd); // TotalData[2]에 다른 비트는 보존하면서 CCD값 넣기.
이렇게 하면 0,1,2,3,0,1,2,3등으로 변할겁니다. 테스트 안해보고 그냥 쓰는거니까 괄호가 틀렸거나 할 수가 있고, 대충 이렇게 하면 됩니다. 구조체의 비트필드를 사용하면 이것보다 더 쉬울수 있습니다.
heartsim 님이 쓰신 글 :
: 아래와 같이 문제가 해결이 된 듯 하네요.
: 어제 마지막에 말씀해주신 IntToStr로 바꾸라고 하신 거 있죠?
: StrToInt로 바꾸니깐 char형으로 전환이 되더군요.( *(Edit5->Text.c_str())와는 달리 결과가 제대로 나옮)
: 제가 보기엔 어제 말씀 하실때 StrToInt를 IntToStr로 잘못 표기를 하신듯...^^ 감사합니다.
: 그래서 오늘 아침에 드디어 99% 정도 해결이 된 듯 한데요...
:
: 근데 딱 한가지 문제가 있는 듯....
:
: 뭐냐 하면 아래 구문에서요.........
: else if(Table1->FieldByName("Name")->AsString=="CCD")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<1);
: CCD항목을 한번씩 클릭을 하면 Edit5->Text값이 0부터 3까지 순차 증가하면서 바뀝니다.
: 그러므로 TotalData[2]에 저장되는 값은 0000 0000-> 0000 0010-> 0000 0100-> 0000 0110로 바뀌어야 하는데요.....두번째에서 세번째로 바뀔때 0000 0010->0000 0100으로 바뀌어야 하는데,
: 0000 0010->0000 0110로 바뀌더군요.
: 이유인 즉, 두번째 비트의 1값이 살아 있는상태에서 값이 바뀌는 거죠.(원래는 0이 되어야 하는데..)
: 그러니간 원래는 두번째 비트는 0으로 되어야 하는 거죠.
: 그래서 static char TotalData[3]를 char TotalData[3]으로 바꾸니 결과값이 제대로 나옵니다.
: 근데 이때의 문제점은 전의 결과 값이 누적이 되어야 하는데 누적이 안 된다는 거죠.
:
: 그래서 인데 혹 Edit나 함수중에서 여타 자리수를 지정해서 출력해주는 속성이 없나요?
: 가령 printf("%02d",i)와 같이 02로서 자리수를 지정해서 출력해 주는 속성이 있다면 될 것 같기도 한데요....^^
:
: 바쁘신데 수고스럽게 해서 죄송하구요....
: 좋은 하루 되세요...............그 동안 감사 했습니다........
:
:
:
:
:
:
:
:
:
: static char TotalData[3]={0,0,0};//,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
: // char cBaseData=Edit5->Text;
: Table1->Edit();
:
: if(Table1->TableName=="fix.db")
: {
: if(strchr(Table1->FieldByName("50")->AsString.c_str(),'&'))
: {
: if(UpDown1->Position >= ( pow(2,StrToInt(Table1->FieldByName("Bit")->AsString))))
: {
: //ShowMessage("This is FF more value. ^.^");
: Edit5->Text=0;
: UpDown1->Position=0;
: }
: else
: {
: Edit5->Text=AnsiString::IntToHex(UpDown1->Position,1);
: }
: Table1->FieldByName("50")->AsString="&H"+Edit5->Text;
: }
: else
: {
: if(UpDown1->Position >= ( pow(2,StrToInt(Table1->FieldByName("Bit")->AsString))))
: {
: Edit5->Text=0;//2^StrToInt(Table1->FieldByName("Bit")->AsString)-1;
: UpDown1->Position=0;
: if(Table1->FieldByName("Name")->AsString=="NTPAL")
: TotalData[2]=TotalData[2] & ~(1<<0);
: else if(Table1->FieldByName("Name")->AsString=="CCD")
: TotalData[2]=TotalData[2] & ~(0x03<<1);
: else if(Table1->FieldByName("Name")->AsString=="YDOUT")
: TotalData[2]=TotalData[2] & ~(1<<3);
: else if(Table1->FieldByName("Name")->AsString=="UVDOUT")
: TotalData[2]=TotalData[2] & ~(1<<4);
: else if(Table1->FieldByName("Name")->AsString=="REC601")
: TotalData[2]=TotalData[2] & ~(1<<5);
: else if(Table1->FieldByName("Name")->AsString=="DSYNC")
: TotalData[2]=TotalData[2] & ~(1<<6);
: else if(Table1->FieldByName("Name")->AsString=="SG135")
: TotalData[2]=TotalData[2] & ~(1<<7);
: }
: else
: {
: Edit5->Text=UpDown1->Position;
:
: if(Table1->FieldByName("Name")->AsString=="NTPAL")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<0);
: else if(Table1->FieldByName("Name")->AsString=="CCD")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<1)
: else if(Table1->FieldByName("Name")->AsString=="YDOUT")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<3);
: else if(Table1->FieldByName("Name")->AsString=="UVDOUT")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<4);
: else if(Table1->FieldByName("Name")->AsString=="REC601")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<5);
: else if(Table1->FieldByName("Name")->AsString=="DSYNC")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<6);
: else if(Table1->FieldByName("Name")->AsString=="SG135")
: TotalData[2]=TotalData[2] | ((char)StrToInt(Edit5->Text)<<7);
:
: }
: Table1->FieldByName("50")->AsString=Edit5->Text;
: }
:
:
:
:
:
:
:
:
:
|