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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 15:15   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию переделать прогу под Linux

Добрый день, дана программа:
Код:
/*
				программа поиска номера столбца в котором сумма элементов минимальна
*/

#include "stdafx.h"
#include "iostream"
#include "windows.h"


/*=============================================================================================================
													описание данных
==============================================================================================================*/
	const int m=5, n=5;	//размерность массива m-строки, n-столбцы
	float mtx[m][n];	//матрица
	float colSum[n];	//массив хранящий суммы стобцов
	int colNum[n];	//массив хранящий номера столбцов
	int i,j;
	int min;


void printMtx(float matrix[m][n])	//процедура печати матрицы (матрица)
{
	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}


DWORD WINAPI sum_col(void* data)	//функция подсчета суммы элементов столбца
{
	int *pcol_num = (int*)data;
	int col_num=*pcol_num;
	colSum[col_num]=0;
	for (i=0; i<m; i++)
		colSum[col_num]+=mtx[i][col_num];
	return 0;
}


void main()
{
/*=============================================================================================================
													ввод значений
==============================================================================================================*/
	srand(17);
	for (i=0; i<m; i++)
		for (j=0; j<n; j++)
			mtx[i][j]=(float)(rand());
	printMtx(mtx);

/*=============================================================================================================
													инициализация colSum,colNum
==============================================================================================================*/
	for (i=0;i<n;i++)
	{
		colSum[i]=0;
		colNum[i]=i;
	}

/*=============================================================================================================
													поиск суммы
==============================================================================================================*/
	DWORD id[n];	//массив идентификаторов потоков
	HANDLE hThread[n];	//массив указателей потоков 
	for (j=0;j<n;j++)
	{
		hThread[j]=CreateThread(NULL,0,sum_col,&colNum[j],0,&id[j]);
		if (hThread[j]==NULL)
		{	
			std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
		}
	} 

	WaitForMultipleObjects(n,hThread,true,INFINITE);	//ожидание завершения всех потоков

/*=============================================================================================================
													вывод массива хранящего суммы столбцов
==============================================================================================================*/
	std::cout<<"\n"; 
	for (i=0;i<n;i++)
		std::cout<<colSum[i]<<" ";
	std::cout<<"\n"; 

/*=============================================================================================================
													поиск минимума
==============================================================================================================*/
	min=0;
	for (i=1;i<n;i++)
	{
		if (colSum[i]<colSum[min]) min=i;
	}

/*=============================================================================================================
													закрытие всех потоков
==============================================================================================================*/	
	for(i=0; i<n; i++)
		CloseHandle(hThread[i]);
	
	std::cout<<min<<" ";
	getchar();
}
Необходимо переписать ее под Linux используя его API
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 26.05.2010, 15:45   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот пока написала вот это:
Код:
// project created on 26.05.2010 at 15:27
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>

using namespace std;
//============================================================================================
//		описание данных
//============================================================================================

	const int m=5, n=5;	
	float mtx[m][n];	//ЛЮРПХЖЮ
	float colSum[n];	//ЛЮЯЯХБ УПЮМЪЫХИ ЯСЛЛШ ЯРНАЖНБ
	int colNum[n];	//ЛЮЯЯХБ УПЮМЪЫХИ МНЛЕПЮ ЯРНКАЖНБ
	int i,j;
	int min;


//============================================================================================
//		функции
//============================================================================================
void printMtx(float matrix[m][n])	//ОПНЖЕДСПЮ ОЕВЮРХ ЛЮРПХЖШ (ЛЮРПХЖЮ)
{
	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}


void * thread_func(void* data)	//ТСМЙЖХЪ ОНДЯВЕРЮ ЯСЛЛШ ЩКЕЛЕМРНБ ЯРНКАЖЮ
{
	int *pcol_num = (int*)data;
	int col_num=*pcol_num;
	colSum[col_num]=0;
	for (i=0; i<m; i++)
		colSum[col_num]+=mtx[i][col_num];
	return 0;
}



int main (int argc, char *argv[])
{
//===========================================================================================
//			заполнение матрицы и массивов
//===========================================================================================
	srand(17);
	for (i=0; i<m; i++)
		for (j=0; j<n; j++)
			mtx[i][j]=(float)(rand()%10);
	printMtx(mtx);
	
	for (i=0;i<n;i++)
	{
		colSum[i]=0;
		colNum[i]=i;
	}
	
	return 0;
}
Как создавать потоки, помогите пожалуйста
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 26.05.2010, 15:52   #3
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Загуглите pthreads, там полно примеров, даже в вкикипедии
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 26.05.2010, 20:31   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот написала, но ошибка, помогите исправить:
Код:
// project created on 26.05.2010 at 15:27
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>

using namespace std;
//============================================================================================
//		описание данных
//============================================================================================

	const int m=5, n=5;	
	float mtx[m][n];	//ЛЮРПХЖЮ
	float colSum[n];	//ЛЮЯЯХБ УПЮМЪЫХИ ЯСЛЛШ ЯРНАЖНБ
	int colNum[n];	//ЛЮЯЯХБ УПЮМЪЫХИ МНЛЕПЮ ЯРНКАЖНБ
	int i,j;



//============================================================================================
//		функции
//============================================================================================
void printMtx(float matrix[m][n])	//ОПНЖЕДСПЮ ОЕВЮРХ ЛЮРПХЖШ (ЛЮРПХЖЮ)
{
	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}


void * thread_func(void* data)	//ТСМЙЖХЪ ОНДЯВЕРЮ ЯСЛЛШ ЩКЕЛЕМРНБ ЯРНКАЖЮ
{
	int col_num=* (int *) data;
	colSum[col_num]=0;
	for (i=0; i<m; i++)
		colSum[col_num]+=mtx[i][col_num];
	return 0;
}



int main (int argc, char *argv[])
{
//===========================================================================================
//			заполнение матрицы и массивов
//===========================================================================================
	int min;
	srand(17);
	for (i=0; i<m; i++)
		for (j=0; j<n; j++)
			mtx[i][j]=(float)(rand()%10);
	printMtx(mtx);
	
	for (i=0;i<n;i++)
	{
		colSum[i]=0;
		colNum[i]=i;
	}
	
	int id[n];	//ЛЮЯЯХБ ХДЕМРХТХЙЮРНПНБ ОНРНЙНБ
	pthread_t Thread[n];	//ЛЮЯЯХБ СЙЮГЮРЕКЕИ ОНРНЙНБ 
	
	for (j=0;j<n;j++)
	{
		int result = pthread_create(&Thread[j], &colNum[j], thread_func, &id[j]);
   		if (result != 0) 
   		{
     		perror("Creating the first thread");
     		return EXIT_FAILURE;
   		}
	} 
	
	std::cout<<"\n"; 
	for (i=0;i<n;i++)
		std::cout<<colSum[i]<<" ";
	std::cout<<"\n"; 

/*=============================================================================================================
													ОНХЯЙ ЛХМХЛСЛЮ
==============================================================================================================*/
	min=0;
	for (i=1;i<n;i++)
	{
		if (colSum[i]<colSum[min]) min=i;
	}

	
	std::cout<<min<<" ";
	getchar();
	return 0;
}
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 26.05.2010, 23:54   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Я не особо знаю Linux API, но в принципе почти всё правильно, только параметры передаются чуть по-другому
Код:
int result = pthread_create(&Thread[j], NULL, thread_func, &colNum[j]);
Массив
Код:
int id[n];	//ЛЮЯЯХБ ХДЕМРХТХЙЮРНПНБ ОНРНЙНБ
лишний, а после вызова надо дождаться завершения потоков, иначе они могут не успеть отработать, а данные будут выведены
Код:
	for (j=0;j<n;j++)
        pthread_join(Thread[j], NULL);
Итого, получились такие изменения
Код:
	//int id[n];	//ЛЮЯЯХБ ХДЕМРХТХЙЮРНПНБ ОНРНЙНБ
	pthread_t Thread[n];	//ЛЮЯЯХБ СЙЮГЮРЕКЕИ ОНРНЙНБ

	for (j=0;j<n;j++)
	{
		//int result = pthread_create(&Thread[j], &colNum[j], thread_func, &id[j]);
		int result = pthread_create(&Thread[j], NULL, thread_func, &colNum[j]);
   		if (result != 0)
   		{
     		perror("Creating the first thread");
     		return EXIT_FAILURE;
   		}
	}
	for (j=0;j<n;j++)
        pthread_join(Thread[j], NULL);

	std::cout<<"\n";
	for (i=0;i<n;i++)
		std::cout<<colSum[i]<<" ";
	std::cout<<"\n";
Плюс придётся добавить к линковщику опцию -L/usr/lib/nptl -lpthread
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переделать под windows al072 C/C++ Сетевое программирование 13 16.02.2010 20:57
Помогите переделать прогу (С++) Olya90 Помощь студентам 13 25.04.2009 19:35
переделать прогу daur3n Помощь студентам 2 10.03.2009 13:34