c++ 다중 if문 질문 드립니다.

조회수 2919회

안녕하세요. 매번 이렇게 질문드리네요; 이번에도 좀 이상한 부분이 있어서 질문 드립니다.

typedef struct {
    LookupFn      Lookup;
    NumEntriesFn  NumEntries; 
} commonDataFuncs;

static const commonDataFuncs CmnDFuncs = {offsetTOCLookupFn,  offsetTOCEntryCount};
static const commonDataFuncs ToCPFuncs = {pointerTOCLookupFn, pointerTOCEntryCount};

U_CFUNC uint16_t
udata_getHeaderSize(const DataHeader *udh) {
    if(udh==NULL) {
        return 0;
    } else if(udh->info.isBigEndian==U_IS_BIG_ENDIAN) {
        /* same endianness */
        return udh->dataHeader.headerSize;
    } else {
        /* opposite endianness */
        uint16_t x=udh->dataHeader.headerSize;
        return (uint16_t)((x<<8)|(x>>8));
    }
}

U_CFUNC void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) {
    if (U_FAILURE(*err)) {
        return;
    }

    if(udm==NULL || udm->pHeader==NULL) {
      *err=U_INVALID_FORMAT_ERROR;
    } else if(!(udm->pHeader->dataHeader.magic1==0xda &&
        udm->pHeader->dataHeader.magic2==0x27 &&
        udm->pHeader->info.isBigEndian==U_IS_BIG_ENDIAN &&
        udm->pHeader->info.charsetFamily==U_CHARSET_FAMILY)
        ) {
        /* header not valid */
        *err=U_INVALID_FORMAT_ERROR;
    }
    else if (udm->pHeader->info.dataFormat[0]==0x43 &&
        udm->pHeader->info.dataFormat[1]==0x6d &&
        udm->pHeader->info.dataFormat[2]==0x6e &&
        udm->pHeader->info.dataFormat[3]==0x44 &&
        udm->pHeader->info.formatVersion[0]==1
        ) {
        /* dataFormat="CmnD" */
        udm->vFuncs = &CmnDFuncs;
        udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader);
    }
    else if(udm->pHeader->info.dataFormat[0]==0x54 &&
        udm->pHeader->info.dataFormat[1]==0x6f &&
        udm->pHeader->info.dataFormat[2]==0x43 &&
        udm->pHeader->info.dataFormat[3]==0x50 &&
        udm->pHeader->info.formatVersion[0]==1
        ) {
        /* dataFormat="ToCP" */
        udm->vFuncs = &ToCPFuncs;
        udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader);
    }
    else {
        /* dataFormat not recognized */
        *err=U_INVALID_FORMAT_ERROR;
    }

    if (U_FAILURE(*err)) {
        /* If the data is no good and we memory-mapped it ourselves,
         *  close the memory mapping so it doesn't leak.  Note that this has
         *  no effect on non-memory mapped data, other than clearing fields in udm.
         */
        udata_close(udm);
    }
}

이 부분입니다. 제가 알기로는 다중 if문에서 위쪽 elseif 조건을 만족하면 해당 부분을 실행하고, 다음 elseif는 상관없이 조건문을 종료 하는거 아니었나요?

일단 udm과 udm->pHeader는 NULL이 아니라 첫번째 if문은 넘어가게 되구요. 다음 elseif 조건은 다 충족하지만 앞에 NOT이 붙어 다음 elseif 로 넘어가게 됩니다.

info.dataFormat과 info.FormatVersion 값이 일치하여 udm->vFuncs 에 함수를 설정 합니다. 그런데 LookupFn에는 정상적으로 offsetTOCLookupFn 함수가 들어가지만, NumEntriesFn 에는 pointerTOCEntryCount이 들어가구요. 다음 문장인 toc에 값을 넣는 부분은 타지않고 그냥 넘어 갑니다. 해당 값도 0x00000000 이렇게 되어있구요.

그뒤로 이상한건 이게 루프 문이 아닌데 다음 elseif문을 탑니다. udm의 값을 보면 변함 없이

udm->pHeader->info.dataFormat[0]==0x43 
udm->pHeader->info.dataFormat[1]==0x6d 
udm->pHeader->info.dataFormat[2]==0x6e 
udm->pHeader->info.dataFormat[3]==0x44 
udm->pHeader->info.formatVersion[0]==1

이 값인데 충족하지 않는 다음 elseif 문을 타고 있구요. 희안한건 vFuncs부분은 넘어가고 toc 부분만 실행하고 아래 if (U_FAILURE(*err)) {} 쪽으로 빠집니다.

toc 값은 0x0308c0a0 이렇게 변해있구요. 왜 그런지 알려주시면 감사하겠습니다. elseif에 대해 제가 잘못 알고 있는건가요? @_@

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)