Работа со списком в WinAPI.

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):П.С. Подскажыте плиз де в нете мона прочитать про создание меню с помощью файла ресурсов, а то с помощью WinAPI уже знаком а вот про способ с помощью файла ресурсов нечего незнаю.
Если используешь Visual Studio, то там и читать нечего. Достаточно добавить в проект пустой ресурс файл (rc), затем открыть его двойным кликом в списке файлов проекта. После этого откроется редактор ресурсов. В нём можно создавать любой ресурс (в том числе меню) визуально и редактор сам позаботится о создании необходимых идентификаторов, которые поместит в файл resourses.h. Тебе будет достаточно заинклюдить этот файл в том месте, где потребуются идентификаторы и использовать их. Для загрузки меню из ресурсов используй API функцию LoadMenu.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Apokal
Сообщения: 81
Зарегистрирован: 14 янв 2008, 19:02

Пасиб. Буду разбератса. А с меню реально прочехлил...
Apokal
Сообщения: 81
Зарегистрирован: 14 янв 2008, 19:02

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


Код

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define N 50

void main()
{																				
	//Defining variables
	int mas[N],i=0,k,j=0,x;
        [B]LARGE_INTEGER LargInt1,LargInt2,WorkTime;
	clock_t start,end;[/B]
	double WorkTime1;
	
	//Filling and showing unsorted array
	printf("\nUnsorted mas[i]:\n");
	while(i!=N)																			
	{
		k=rand();
		if(k>0&&k<100)
		{
			mas[i]=k;
			printf("%-5.2d",mas[i]);
			i++;
		}
	}

        //BubbleSort Method;Showing sorted array;Showing working time;
	printf("\n\nBubbleSort Method:");
	printf("\nSorted mas[i]:\n");
	i=0;j=0;x=0;
        [B]QueryPerformanceCounter(&LargInt1);
	start=clock();[/B]
	for(i=0;i<N;i++) 
	{            
		for(j=N-1;j>i;j--) 
		{     
			if (mas[j-1]>mas[j]) 
			{
				x=mas[j-1]; 
				mas[j-1]=mas[j]; 
				mas[j]=x;
			}
		}
	}
	[B]end=clock();[/B]
        [B]QueryPerformanceCounter(&LargInt2);
        WorkTime=LargInt2-LargInt1;
	WorkTime1=(double)(end-start);[/B]
	for(i=0;i<N;i++)
		printf("%-5.2d",mas1[i]);
	[B]printf("\nWorking Time is:%d",WorkTime);
        printf("\nWorking Time is:%f",WorkTime1);[/B]
Первая проблема заключаетса в том, что с типом LARGE_INTEGER нельзя производить арифметические операции.
Вторая проблема заключаетса в том, что время работы полученое с помощью
clock() равняетса нулю, тобиш WorkTime1=0. Жирным шрифтом выделил все что связяно с подсчитыванием времени роботы.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

На будущее. Пожалуйста, заводи в подобном случае новую тему. Ведь твоя новая проблема никак не касается списков и WinApi.

Теперь по теме. Используй значение, возвращаемое QueryPerformanceFrequency для перевода HRT значений в секунды.

По поводу clock. Зачем используешь два разных подхода? Используй либо clock, либо HRT. Смешивать не надо.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Apokal, для такого короткого цикла (N=50) просто не хватит точности системного таймера, чтобы определить длительность. И QueryPerformanceCounter() не поможет, если в системе нет высокоточного таймера (на обычных компах нет) - она в этом случае внутри пользуется все тем же стандартным с частотой 18.2 Hz:
The high-resolution timer functions QueryPerformanceCounter and QueryPerformanceFrequency allow independent software vendors (ISVs) to use the high-resolution timers available on your target device.

These high-resolution timers enable more accurate timings than the one-millisecond granularity available through the GetTickCount function. For more information, see High-Performance Counter Support.

The OAL sample code provides default implementations of the performance querying functions.

If you do not provide high-resolution timers on your hardware platform, the default capabilities of the performance querying functions are implemented using GetTickCount.

In the default code, a call to QueryPerformanceCounter returns the value represented by GetTickCount, while QueryPerformanceFrequency returns 1000.

To support high-resolution timers

Provide your own implementations of the OEMQueryPerformanceCounter and OEMQueryPerformanceFrequency functions.
Add code to OEMInit to set the variables pQueryPerformanceCounter and pQueryPerformanceFrequency to point to your implementations of the OEMQueryPerformanceCounter and OEMQueryPerformanceFrequency functions.
Make any further calls to the QueryPerformance functions through their respective pointers.
Насчет арифметических операций с данными типа LARGE_INTEGER: у них есть поле QuadPart, которое на современных компиляторах отображается в тип __int64, а с ним работают все операции, например:

Код: Выделить всё

__int64 ticks = LargInt2.QuadPart-LargInt1.QuadPart;
Apokal
Сообщения: 81
Зарегистрирован: 14 янв 2008, 19:02

Пасиб за ответы все заработало, а тему я незаводил новую потомушо нехочу захломлять форум -- он и так забит. В коде я специально обьеденил два способа через clock() и QueryPerformanceCounter() чтобы не писать два кода которые лиш отличаютса парой строчек, ибо тогда у меня б пост большой вышел.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):тему я незаводил новую потомушо нехочу захломлять форум
Ты не волнуйся о том, что форум бедет захламлен. Лучше подумай и читателях, которые будут в шоке листая многочисленные закладки одной темы, в которой обсуждается подряд несколько независимых вопросов и границу между этими вопросами определить достаточно сложно с первого взягляда. Захламление одной темы значительно хуже, чем захламление форума.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить