Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2011, 22:51   #1
IceWind
Новичок
Джуниор
 
Регистрация: 22.04.2008
Сообщений: 2
По умолчанию Выделение памяти Win API

Всем привет.
Делаю программу с использованием функций Win API. Переделывал под себя чужой пример. Суть в том, что программа создает в файле подкачки отображение файла, в которое нужно записать массив из целых чисел. Прога выдает ошибку при выводе массива на экран. Может подскажет кто, как можно поправить? Сам я в этом не силен, по учебе задание дали. Код ниже.

Код:
#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <string.h>
#include <strsafe.h>

using namespace std;

#define BUF_SIZE 256*256 //Размер отображаемого файла
#define MAX_AR_LENGHT 20

HANDLE mapFileHandle; //дескриптор отображения файла
int intAr[MAX_AR_LENGHT];		//объявление массива
int *pintAr = intAr; //указатель на массив

void initialize(){

	mapFileHandle = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, TEXT("IntFile")); //создаем отображение файла
	if(mapFileHandle = NULL)	//проверяем успешность создания
	{	
		cout<<"ERROR: unable to create map of file"; 
		exit(0);
	}

	//отображение файла на pintAr
	pintAr =  (int*) MapViewOfFile(mapFileHandle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0 );

	if(pintAr = NULL)	//проверяем успешность отображения
	{	
		cout<<"ERROR: unable to create map of file"; 
		exit(0);
	}
}

void randomize() //заполнение массива случайными числами в диапазоне 1..100
{
	int * p = pintAr;//Временный указатель на массив
	for(int i = 0; i<=19; i++)
	{
		srand(100);
		p[i] = rand();
	}

	CopyMemory((PVOID)(p), p, MAX_AR_LENGHT);//Скопировать массив
}

void print() //вывод массива
{
	cout<<"Array: \n";
	int * p = pintAr;
	for(int i= 0; i<=19; i++)
	{
		cout<<p[i] + " ";
	}
}

void ExitNicely(){
	
	UnmapViewOfFile(pintAr); // Убираем отображение файла
    CloseHandle(mapFileHandle);//Закрываем дескриптор отображения
	exit(0);//Выход из процесса
}

int main(int argc, _TCHAR* argv[])
{
	
	
	int res = 1;
	while( res ){//Пока не ввели 0
		cout<<"\nChoose action:\n"
			<<"1: Initialize\n"
			<<"2: Show array\n"
			<<"\n"
			<<"0: Exit\n\naction: ";
		cin>>res;

		if( res == 1 ){

			initialize();
			cout<<" ----- End -------\n\n";
		    }
			
		else if(res == 2){
			print();
			}
	   else if(res == 3){//Проверка прочитанных сообщений, посланных от id
			
		}else if(res == 4){//Очистка сообщений
			
		}else if(res == 5){//Печать всех сообщений
			
		}
	}
	ExitNicely();//Выходм, закрыв все дескрипторы0
	return 0;
}
IceWind вне форума Ответить с цитированием
Старый 18.11.2011, 15:35   #2
IceWind
Новичок
Джуниор
 
Регистрация: 22.04.2008
Сообщений: 2
По умолчанию

Да я явно в запаре был. randomize вызвать забыл вот. Суть в том что со своей ошибкой я разобрался, она заключалась в неправильном использовании оператора вывода. Код теперь выглядит так:
Код:
#include <iostream>
#include <string>
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>
#include <time.h>

#define BUF_SIZE 256*256 //Размер отображаемого файла

using namespace std;

int iar[20]; //объявление массива
int * piar = iar; //указатель на начало массива
HANDLE mapFileHandle; //Дескриптор отображаемого файла

void randomize(){

	srand((int)time(NULL));
	int * p = piar;
	for(int i = 0; i <= 19; i++)
	{
		*p = rand()*100/RAND_MAX;
		p++;
	}
	p = piar; //возврат указателя в начало массива
}

void print(){
	int * p = piar;
	cout<<"\n Elements: \n";
	for(int i = 0; i <= 19; i++)
	{
		cout<<*(p + i)<<" ";
	}
	
}

void ErrorExit(LPTSTR lpszFunction) 
{ 
    // Получаем сообщение для кода последней ошибки

    LPTSTR lpMsgBuf;//Буфер сообщения ошибки
    LPTSTR lpDisplayBuf;//Буфер для всего сообщения аля "... failed with error: ..."
    DWORD dw = GetLastError();//Получаем код последней ошибки

    FormatMessage(//Получаем сообщение ошибки
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        lpMsgBuf,
        0, NULL );

   

    lpDisplayBuf = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, 
        (lstrlen(lpMsgBuf) + lstrlen(lpszFunction) + 40) * sizeof(TCHAR));  //Выделяем память под буфер

	// Форматируем сообщение
    StringCchPrintf(lpDisplayBuf, 
        LocalSize(lpDisplayBuf) / sizeof(TCHAR),
        TEXT("%s failed with error %d: %s"), 
        lpszFunction, dw, lpMsgBuf); 

	//Показываем диалоговое окошко с сообщением
    MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

    LocalFree(lpMsgBuf);//Освобождаем память
    LocalFree(lpDisplayBuf);
    ExitProcess(dw); //Завершаем процесс
}

void initialize(){

	mapFileHandle = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, TEXT("Mapping")); //создаем отображение файла в памяти (в файле подкачки)
	if (mapFileHandle == NULL){
		ErrorExit(TEXT("CreateFileMapping error"));
	}

	//Отображаем файл на piar
   piar = (int*) MapViewOfFile(mapFileHandle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0 );

   //Если ошибка, пишем сообщение и выходим
   if (piar == NULL){
	ErrorExit(TEXT("MapViewOfFile"));
   }
}

int main(int argc, char ** argv){
int res = 1;
	while( res ){//Пока не ввели 0
		cout<<"\nChoose action:\n"
			<<"1: Randomize\n"
			<<"2: Show unsorted array\n"
			<<"3: Send block\n"
			<<"4: Sort block\n"
			<<"5: Print sorted block\n"
			<<"\n"
			<<"0: Exit\n\naction: ";
		cin>>res;

		if( res == 1 ){//если выбрано действие 1
			initialize(); //инициализация файла в памяти
			randomize(); //заполнение массива в случайном порядке
			cout<<"\n \n Randomization complete \n";
		}else if(res == 2){
			print();
			cout<<"\n \n ----END---- \n";
		}else if(res == 3){
		}else if(res == 4){
			
		}else if(res == 5){
			
		}
	}
	//ExitNicely();//Выходм, закрыв все дескрипторы0
	return 0;
}
Массив заполняется и выводится на экран нормально. Ну мне так кажется во всяком случае. Нужно реализовать возможность блочной сортировки массива в другом процессе. Каждый новый процесс сортирует свою часть массива и отправляет главному процессу, который в свою очередь склеивает эти части обратно и сортирует уже весь массив. Есть идеи, как это сделать?
IceWind вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win Api Sanekk Visual C++ 6 17.11.2011 18:18
Win API ( CИ) ПроГрам Помощь студентам 0 29.04.2010 21:43
Win Api alexov Общие вопросы C/C++ 4 29.01.2009 13:33
Win API aleks_n Общие вопросы Delphi 0 15.09.2008 11:07