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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2009, 13:06   #11
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

m0nax

Я видел ты setlocale(LC_ALL, ".1251"); добавил, это для того чтобы отображались шрифты русские?

Я делаю так:
Добавляется строка SetConsoleOutputCP(1251);
Потом когда запускается программа, она выдаст "абрукадабру", захожу в свойства окна консоли, вкладка шрифт, и там выбираю шрифт Lucida Cousole, нажимаю ок. И оно показывает русские буквы.

Спасибо тебе!! Теперь я хоть могу понять что-то!! Спасибо большое!!

Мне тут посоветовали книгу Джеффри РИХТЕР - "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows". Там "ГЛАВА 6 Базовые сведения о потоках", я просмотрел, вроде полезная информация, сейчас читать буду.

Последний раз редактировалось MaxDDT; 12.12.2009 в 14:12.
MaxDDT вне форума Ответить с цитированием
Старый 17.12.2009, 21:52   #12
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

Задание усложнилось:
Нужно сделать перемещение нескольких столбцов.
Например
1 - 4
2 - 3
5 - 8
6 - 7
9 - 0

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

1_поток меняет 1 столбец с 4 столбцом
2_поток меняет 2 столбец с 3 столбцом
3_поток меняет 8 столбец с 5 столбцом
4_поток меняет 6 столбец с 7 столбцом
5_поток меняет 9 столбец с 0 столбцом

У меня такая идея:
Создать массив на 2 столбца и 5 строк, куда вносим данные о столбцах которые будем перемещать.

То есть:

a11 = 1 a12 = 4
a21 = 2 a22 = 3
a31 = 8 a32 = 5
a41 = 6 a42 = 7
a51 = 9 a52 = 0

Получается мы имеем номер потока (i=1,2,3,4,5), и номер столбца который этот поток должен обрабатывать (значения элементов массива).

Вот не могу придумать как дальше организовать это дело.


Вот такую функцию хочу поместить в поток:

potoc[2][5] - массив для сохранения номеров перемещаемых столбцов.
mas[10][10] - основной массив элементов

Код:
int stolbec_a, stolbec_b ;

stolbec_a = potoc[1][1] // присваиваем переменной номер столбца который мы хотим поменять местом с другим
stolbec_b = potoc[1][2]// присваиваем переменной номер столбца который мы хотим поменять местом с другим

for (i=0; i<10; i++)
{
buf = mas[i][stolbec_a];
mas[i][stolbec_a] = mas[i][stolbec_b];
mas[i][stolbec_b] = buf;
}
Можно так сделать?
И вообще, как работает память? Получиться ли одновременно обратиться из 5-ти потоков в массиву 10*10? Или такое невозможно?
MaxDDT вне форума Ответить с цитированием
Старый 18.12.2009, 02:32   #13
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

Вот что-то накодил ) Но как-то не так считает. Не могу понять в чём ошибка. Не так перемещает

Код:
#include <iostream>
#include <windows.h>
#include "Process.h"
using namespace std;


int mas[10][10], potoki[2][10];
int i,j,n=10,stolbec_a,stolbec_b,buf;


void print () // функция вывода массива на экран
{
for (i=0; i<n; i++) //строки
	{
	for (j=0; j<n; j++) //столбцы
	{cout << "a[" << i <<j << "]= " << mas[i][j] << "\t";}	
	cout << endl;
	}
}
void printline ()// функция вывода линии "---" на экран
{
cout << endl;
cout << "----------------------------------------" << endl;
cout << endl;
}

unsigned __stdcall proc(void* pParam) // функция для перемещения элементов
{	

stolbec_a = potoki[i=(int)pParam][1]; // присваиваем переменной номер столбца который мы хотим поменять местом с другим
stolbec_b = potoki[i=(int)pParam][2];// присваиваем переменной номер столбца который мы хотим поменять местом с другим

	for (i=0; i<10; i++)
	{
	buf = mas[i][stolbec_a];
	mas[i][stolbec_a] = mas[i][stolbec_b];
	mas[i][stolbec_b] = buf;
	}

	return 0;
}

int main()
{
SetConsoleOutputCP (1251);
cout << "Массив случайных чисел 10*10\n";
cout << endl;


/*-----------------------------Ввод массива------------------------------------*/
	for (i=0; i<n; i++) //строки
	for (j=0; j<n; j++) //столбцы  
	{mas[i][j]=rand()%50;}

	print (); //Вывод массива на экран

/*------------------------Выбор столбцов для перемещения------------------------*/
for (i=0; i<5; i++) //строки
{
	for (j=0; j<2; j++) //столбцы  
	{
	cout << "\nВведите номер столбца для перемещения ";
	cin >> potoki[i][j];
	}
}
printline();

/*------------------------Вывод результата выбора столбцов------------------------*/
cout << "Вы хотите поменять местами такие столбцы: " << endl << endl;

for (i=0; i<5; i++) //строки
{
	for (j=0; j<2; j++) //столбцы  
	{cout << " -> " << potoki[i][j];}
	cout << endl;
}
printline();
/*------------------------Создание потоков, и запуск функций------------------------*/

HANDLE ArrayThreads[5]; // Создаём массив HANDLE, для потоков
		
		for (int i=0, k=0; i < 5; i++, ++k )// i - перебирает значения k - номер потока
		{
				ArrayThreads[k] = (HANDLE)_beginthreadex(0,0,proc, (void*)i, 0,0) ; //передаём в функцию proc значение переменной i
		}

		WaitForMultipleObjects(5, ArrayThreads, TRUE, INFINITE); // Ожидание освобождения всех потоков
		
		for (i=0; i<5; ++i) // Цыкл для закрытия потоков
			CloseHandle(ArrayThreads[i]); // Функция закрытия потока

print ();// Вывод массива на экран

cin.get();
cin.get();
}

Последний раз редактировалось MaxDDT; 18.12.2009 в 02:41.
MaxDDT вне форума Ответить с цитированием
Старый 18.12.2009, 03:17   #14
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

Всё! нашел ошибку:
Была ошибка в блоке "Выбор столбцов для перемещения" Из за того, что j=0, сбилась адресация, и в функцию для перемещения элементов вводились не верные номера столбцов, которые нужно между собой перемещать.

Вот кому интересно, рабочий код:

Код:
#include <iostream>
#include <windows.h>
#include "Process.h"
using namespace std;


int mas[10][10], potoki[2][10];
int i,j,n=10,stolbec_a,stolbec_b,buf;


void print () // функция вывода массива на экран
{
for (i=0; i<n; i++) //строки
	{
	for (j=0; j<n; j++) //столбцы
	{cout << "a[" << i <<j << "]= " << mas[i][j] << "\t";}	
	cout << endl;
	}
}
void printline ()// функция вывода линии "---" на экран
{
cout << endl;
cout << "----------------------------------------" << endl;
cout << endl;
}

unsigned __stdcall proc(void* pParam) // функция для перемещения элементов
{	

stolbec_a = potoki[(int)pParam][1]; // присваиваем переменной номер столбца который мы хотим поменять местом с другим
stolbec_b = potoki[(int)pParam][2];// присваиваем переменной номер столбца который мы хотим поменять местом с другим

	for (i=0; i<10; i++)
	{
	buf = mas[i][stolbec_a];
	mas[i][stolbec_a] = mas[i][stolbec_b];
	mas[i][stolbec_b] = buf;
	}

	return 0;
}

int main()
{
SetConsoleOutputCP (1251);
cout << "Массив случайных чисел 10*10\n";
cout << endl;


/*-----------------------------Ввод массива------------------------------------*/
	for (i=0; i<n; i++) //строки
	for (j=0; j<n; j++) //столбцы  
	{mas[i][j]=rand()%50;}

	print (); //Вывод массива на экран

/*------------------------Выбор столбцов для перемещения------------------------*/
for (i=0; i<5; i++) //строки
{
	for (j=1; j<3; j++) //столбцы  
	{
	cout << "\nВведите номер столбца для перемещения ";
	cin >> potoki[i][j];
	}
}
printline();

/*------------------------Вывод результата выбора столбцов------------------------*/
cout << "Вы хотите поменять местами такие столбцы: " << endl << endl;

for (i=0; i<5; i++) //строки
{
	for (j=1; j<3; j++) //столбцы  
	{cout << " p[" << i << j << "]= " << potoki[i][j];}
	cout << endl;
}
printline();
/*------------------------Создание потоков, и запуск функций------------------------*/

HANDLE ArrayThreads[5]; // Создаём массив HANDLE, для потоков
		
		for (int i=0, k=0; i < 5; i++, ++k )// i - перебирает значения k - номер потока
		{
				ArrayThreads[k] = (HANDLE)_beginthreadex(0,0,proc, (void*)i, 0,0) ; //передаём в функцию proc значение переменной i
		}

		WaitForMultipleObjects(5, ArrayThreads, TRUE, INFINITE); // Ожидание освобождения всех потоков
		
		for (i=0; i<5; ++i) // Цыкл для закрытия потоков
			CloseHandle(ArrayThreads[i]); // Функция закрытия потока



/*------------------------Перемещиние столбцов------------------------*/
print ();

cin.get();
cin.get();
}
MaxDDT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написал программу, помогите натянуть Шейдеры или как нибудь модифицировать программу WMLite Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2009 13:57
Оцените программу cheef Софт 11 30.04.2009 09:28
Защитить программу. С.М.С Безопасность, Шифрование 10 23.02.2009 00:35
Разобрать программу DarkDeivel Общие вопросы Delphi 13 21.09.2008 14:17
Написать программу. project.one Фриланс 3 17.06.2008 16:11