2015-10-22 2 views
3

Я новичок в c++ ..so, пожалуйста, помогите мне получить это право.читать данные из пользовательской коллекции (struct Array)

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

в код выглядит следующим образом

DataCollection.h

typedef struct _DataC 
{ 
    char* buffer; 
    UINT Id; 
} DataC; 

void GetDataC(int ArrSize, DataC** DArr); 

DataCollection.cpp

#include "DataCollection.h" 

void GetDataC(int ArrSize, DataC** DArr) 
{ 

    int count = 0; 
    int strSize = 10; 
    *DArr = (DataC*)CoTaskMemAlloc(ArrSize * sizeof(DataC)); 
    DataC* CurData = *DArr; 
    char TestS[] = "SomeText00"; 
    for (int count = 0; count < ArrSize; count++,CurData++) 
    { 
     TestS[strSize-1] = count + '0'; 
     CurData->Id = count; 
     CurData->buffer = (char*)malloc(sizeof(char)*strSize); 
     strcpy(CurData->buffer, TestS); 
    } 
} 

тест коллекция:

int main(void) 
{ 

    StpWatch Stw;long ResSw; 

    DataC* TestDataArr;// maybe use DataC TestDataArr[] instead... 

    GetDataC(100000, &TestDataArr); 
} 

, как я могу читать коллекцию в цикле?

для ...

std::cout<<TestDataArr[count].buffer<<std::endl; 

или?

std::cout<<TestDataArr->buffer<<std::endl; 

Что такое правильная реализация читать каждый элемент в цикле?

спасибо за ваше время.

+0

std :: cout << TestDataArr [count] -> buffer << std :: endl; – user2970916

+0

@ user2970916, пожалуйста, просмотрите 'GetDataC()', потому что это версия для копирования ... wait check. Я помещаю '.' вместо' -> ' –

+0

@ user2970916 оба способа, которые компилируют ..... bipping из vs console pc bips .. вы знаете их .. (ver 1)' for (int count = 0; condition; count ++, collection ++) с cout :: collection-> member' - (ver 2) 'for (int count = 0; condition; count ++) с cout :: collection [count] .member' код работает медленно и bips –

ответ

1

DataC* TestDataArr и DataC TestDataArr[] - это то же самое. Тем не менее, когда вы пытаетесь ссылаться TestDataArr вы можете сделать одну из двух вещей:

TestDataArr[index].buffer 

или

(TestDataArr + index)->buffer 

Поскольку TestDataArr указателя вы должны почтительный его, прежде чем вы можете использовать любого из ее членов, это то, что делает индекс. Используя первый метод, как индекс массива, указатель разыменован в index в массиве, и затем вы можете использовать . для доступа к членам объекта. Второй способ: index продвигает указатель на ячейку памяти, но не разыскивает указатель, поэтому вы должны использовать ->, чтобы затем получить доступ к своим членам.

Так напечатать буфер в цикле, вы можете использовать:

std::cout << TestDataArr[count].buffer << std::endl; 

или

std::cout << (TestDataArr + count)->buffer << std::endl; 

blipping вы упоминаете, вероятно, из-за TestS[strSize-1] = count + '0'; где count + '0' создает характер за пределами из ASCII. Некоторые из этих символов вызовут звуковые сигналы консоли.

+0

спасибо большое Гэри! действительно хорошее объяснение –

+0

читать комментарии @ Dmitry .. –

1

Проблема в TestS[strSize-1] = count + '0';. Когда вы проходите ArrSize == 100 0000, то в цикле for значение count + '0' в некоторый момент превышает диапазон char, и вы получаете значение char в диапазоне [0-31] (символы, не подлежащие печати). По крайней мере, использовать

TestS[strSize-1] = '0' + count % (126 - '0'); 

Последний символ из TestS будет изменяться в диапазоне [48-126] (ASCII печатаемые символы).

+0

спасибо, что обратили внимание на детали, это была причина greate, которая была тестом, сравнивая скорость 'char *' vs 'BSTR', хотя смешно, что я перехожу к выводам: C# маршалинг массива с' char * 'выполняется быстрее, также C++ ** debug ** BUT, наконец, режим выпуска, выигрывает BSTR. –

+0

хороший трюк с модулем, я бы не подумал об этом с помощью 'char' –

+0

. 'BSTR'' wchar_t * '' char * '... от медленного до самого быстрого, [char *] является самым быстрым –