void TestSafeArray()
{
	// 创建COM对象实例
	IMarshalSafeArrayPtr comObj(__uuidof(MarshalSafeArrayObj));
	if (comObj)
	{
		// 创建SafeArray
		SAFEARRAY* pIntArray;
		SAFEARRAYBOUND saBnd[1];
		saBnd[0].lLbound = 0;
		saBnd[0].cElements = 5;
		pIntArray = SafeArrayCreate(VT_I4, 1, saBnd);

		// 初始化SafeArray
		int* pArray;
		SafeArrayAccessData(pIntArray, (void HUGEP**)&pArray);
		pArray[0] = 0;
		pArray[1] = 1;
		pArray[2] = 2;
		pArray[3] = 3;
		pArray[4] = 4;
		SafeArrayUnaccessData(pIntArray);

		wprintf(L"(0) 初始化数组\n");
		PrintIntArray(pIntArray);

		int result = 0;
		result = comObj->IntArrayUpdateByVal(pIntArray);
		wprintf(L"元素和:%d\n\n", result);
		wprintf(L"(1) 调用方法 IntArrayUpdateByVal\n");
		PrintIntArray(pIntArray);

		result = comObj->IntArrayUpdateByValInOut(pIntArray);
		wprintf(L"元素和:%d\n\n", result);
		wprintf(L"(2) 调用方法 IntArrayUpdateByValInOut\n");
		PrintIntArray(pIntArray);

		result = comObj->IntArrayUpdateByRef(&pIntArray);
		wprintf(L"元素和:%d\n\n", result);
		wprintf(L"(3) 调用方法 IntArrayUpdateByRef\n");
		PrintIntArray(pIntArray);

		result = comObj->IntArrayUpdateByRefInOnly(&pIntArray);
		wprintf(L"元素和:%d\n\n", result);
		wprintf(L"(4) 调用方法 IntArrayUpdateByRefInOnly\n");
		PrintIntArray(pIntArray);

		// 释放SafeArray
		SafeArrayDestroy(pIntArray);

		SAFEARRAY* pNewArray = comObj->IntArrayReturn(5);
		wprintf(L"\n(5) 调用方法 IntArrayReturn:\n");
		PrintIntArray(pNewArray);

		// 释放SafeArray
		SafeArrayDestroy(pNewArray);

		comObj.Release();
	}
}
Exemple #2
0
//Sort an array of integers of a given size and print the
//array each time an element is moved
void insertionSort(int ar_size, int *  ar)
{
    int i;
    int j;

    for(i=0;i<ar_size;i++)
    {
        j=i;
        while((j > 0) && ar[j-1] > ar[j])
        {
            int tempvar;
            tempvar = ar[j];
            ar[j] = ar[j-1];
            ar[j-1] = tempvar;
            j--;
        }

        if(i) PrintIntArray(ar_size, ar);
    }
}
int main()
{
    uint32_t PrimeCeiling;
    printf("                  ---Instructions---\n\n");
    printf("The Sieve of a Eratosthenes is an algorithm for finding\nprime numbers that is over 2,000 years old. Enter an\ninteger greater than 2 and press enter to return\na list of prime numbers smaller than the one you typed.\n\n");
    printf("Give me a number: ");
    scanf("%u", &PrimeCeiling);

    while(1)
    {
        if(PrimeCeiling < 3)
        {
            printf("Number must be 2 greater than 2!\n");
            printf("Give me a number: ");
            scanf("%u", &PrimeCeiling);
        }
        else
        {
            uint32_t *PrimesList = malloc(PrimeCeiling * sizeof(uint32_t));

            if(PrimesList == NULL)
            {
                printf("Memory error!\n");
                break;
            }

            uint32_t PrimeCount = Sieve(PrimeCeiling, PrimesList, PrimeCeiling * sizeof(uint32_t));

            PrintIntArray(PrimesList, PrimeCount);
            printf("\nNumber of primes found was %u.\n", PrimeCount);
            float PercentPrimes = ((float)PrimeCount / (float)PrimeCeiling) * 100;
            printf("%.2f%% of numbers between 0 and %u are prime.\n", PercentPrimes, PrimeCeiling);
            break;
        }
    }

    return 0;
}