'dim': идентификатор не найден - PullRequest
1 голос
/ 26 июля 2011

Я получаю это сообщение об ошибке:

ошибка C3861: 'dim': идентификатор не найден

Вот мои включения:

#include "stdafx.h"
#include "HSMBTPrintX.h"
#include "HSMBTPrintXCtrl.h"
#include "HSMBTPrintXPropPage.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

Вот моя функция:

#define MSS_PORTS_BASE _T("Software\\Microsoft\\Bluetooth\\Serial\\Ports")
bool FindBluetoothPort(TCHAR name[16]) {
    HKEY hKey, hRoot;
    TCHAR szPort[20] = _T(""), szPortString[20];
    DWORD len, dwIndex=0;
    bool bFound=false;
    INT i = 0, rc;
    DWORD dwNSize;
    DWORD dwCSize;
    TCHAR szClass[256];
    TCHAR szName[MAX_PATH];
    FILETIME ft;
    hRoot = HKEY_LOCAL_MACHINE;
    if (RegOpenKeyEx (hRoot, MSS_PORTS_BASE, 0, 0, &hKey) != ERROR_SUCCESS) {
        rc = GetLastError();
        return 0;
    }
    dwNSize = dim(szName);    <---- ~~ !! HERE IS THE LINE THAT ERRORS
    dwCSize = dim(szClass);     <---- HERE IS THE LINE THAT ERRORS  !! 
    rc = RegEnumKeyEx (hKey, i, szName, &dwNSize, NULL, szClass, &dwCSize, &ft);
    while (rc == ERROR_SUCCESS)
    {
        // how many children
        TCHAR szCurrentKey[MAX_PATH];
        wcscpy(szCurrentKey, MSS_PORTS_BASE);
        wcscat(szCurrentKey, TEXT("\\"));
        wcscat(szCurrentKey, szName);
        wcscat(szCurrentKey, TEXT("\\"));
        len = sizeof(szPort);
        if(RegGetValue(hRoot, szCurrentKey, _T("Port"), NULL, (LPBYTE)szPort, &len)) {
            wsprintf(szPortString, _T("%s:"), szPort);
            bFound = true;
            break;
        }
        dwNSize = dim(szName);
        rc = RegEnumKeyEx(hKey, ++i, szName, &dwNSize, NULL, NULL, 0, &ft);
    }

    if(bFound)
        _tcscpy(name, szPortString);

    return bFound;
}

Как видите, две строки, которые используют это:

dwNSize = dim(szName);

dwCSize = dim(szClass);

Почему это ошибка?

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Похоже, вы хотите sizeof:

dwNSize = sizeof(szName);
dwCSize = sizeof(szClass);

sizeof возвращает количество байтов объекта / переменной. Тем не менее, я только что посмотрел документацию для API RegEnumKeyEx, и ему нужно количество символов. Поэтому я думаю, что на самом деле он должен делиться на размер TCHAR (который будет 1 или 2 в зависимости от того, строите ли вы для Unicode).

dwNSize = sizeof(szName) / sizeof(TCHAR);
dwCSize = sizeof(szClass) / sizeof(TCHAR);
1 голос
/ 26 июля 2011

Вы хотите sizeof.

Если вы изначально узнали dim, это, вероятно, макрос, который действительно вызывает sizeof за кадром.

0 голосов
/ 26 июля 2011

Я в прошлом использовал следующий макрос:

#define DIM(x) (sizeof(x)/sizeof((x)[0]))

Это не предусмотрено ни одним из стандартных включений, вы должны определить его для себя.

Вы также можете сделать более современную версию, используя функцию шаблона:

template<typename T, size_t N>
size_t dim(const T (& array)[N])
{
   return N;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...