Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли использовать указатели в структуре? 
:(
    Опции темы
ausar
Дата 12.4.2010, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Привет всем. Никак не могу справиться с проблемой

Изучаю процессы и нити на простых задачах.К примеру создал 2 матрицы заполнил их и хочу сложить одну с другой. А[][]+B[][]=C[][] Сделал функцию которая это все делает. Все вроде бы работает как надо. Теперь пытаюсь сделать так чтобы работали нити. К примеру одна нить заполняла четные элементы вторая нечетные или одна заполняла ни другая верх - в принципе не столь важно главное чтоб было параллельно ( собираюсь использовать наработки в небольшом проекте). 
Без использования нитей в мою функцию я передаю 2 исходные матрицы и матрицу в которую сохраняется результат. Примерно так
myFunc(int a[][],int b[][], int c[][], mode) - mode это чтобы указать функции как именно заполнять матрицу
 Но оказалось что нить разрешает использовать только один параметр для передачи. Поэтому решил использовать структуру в которую и запихнул все параметры. Насколько я понимаю нужно использовать указатели на переменные в структуре которые потом через нить передаеются функции. Но я не знаю как это сделать. 

К примеру я сделал так

struct paramet{
int a[N][N],b[N][N],c[N][N];
int mode;
}

Но я не хочу использовать массивы в структуре я хочу использовать внешние массивы. Помогите пожалуйста. Что нужно. Как сделать?
PM MAIL   Вверх
586
Дата 12.4.2010, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
#include <stdio.h>

int arr[2][4] = {
    {111, 222, 333, 444},
    {555, 666, 777, 888}
};

int main()
{
    int (*p)[2][4];   // указатель
    p = &arr;

    printf("%d\n", (*p)[0][1]);
}

PM   Вверх
ausar
Дата 12.4.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Нет чтото не дошло. К примеру вот такой вариант

Код


//структура для передачи параметров
struct FPar
{
int a[N][N];
int b[N][N];
int c[N][N];
int start;
int stop;
};

//функция
void calc (FPar *p)
{
int i,j;
 for (i=p->start; i<=p->stop; i++){
   for (j=0; j< N; j++){
   p->c[i][j]=p->a[i][j]+p->b[i][j];
}
}
}

//так создается нить
CreateThread (0, 0, (LPTHREAD_START_ROUTINE) calc, (LPVOID) p, 0, 0)


Получается что нужно сделать так например на кажды массив делаем указатель:

например

int a[N][N], b[N][N], c[N][N];

int (*a)[N][N]; a = &a;
int (*b)[N][N]; b = &b;
int (*c)[N][N]; c = &c;

А как со структурой быть?



PM MAIL   Вверх
586
Дата 12.4.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
//структура для передачи параметров
struct FPar
{
int (*a)[N][N];
int (*b)[N][N];
int (*c)[N][N];
int start;
int stop;
};
//функция
DWORD CALLBACK calc (FPar *p)
{
    int i,j;
    for (i=p->start; i<=p->stop; i++){
        for (j=0; j< N; j++){
            (*p->c)[i][j]=(*p->a)[i][j]+(*p->b)[i][j];
        }
    }
     return 0;
}
//так создается нить
CreateThread (0, 0, (LPTHREAD_START_ROUTINE) calc, (LPVOID) p, 0, 0);

PM   Вверх
xvr
Дата 12.4.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(ausar @  12.4.2010,  02:39 Найти цитируемый пост)
К примеру одна нить заполняла четные элементы вторая нечетные
На многокоровых процессорах получите ЖУТКИЕ тормоза. Почитайте что нибудь про кэши в процессорах и вообще статьи о параллельном програмировании - там очень много подводных камней  smile 

PM MAIL   Вверх
ausar
Дата 12.4.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Получилось вот так

Код

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>


const N=10;

struct FPar
{
int (*a)[N][N];
int (*b)[N][N];
int (*c)[N][N];
int start;
int stop;
};

void fill (int  array[N][N]){
 int i,j;
 for (i=0; i<N; i++){
   for (j=0; j< N; j++){
     array[i][j]=rand() % 10 + 1;
}
}
}

DWORD CALLBACK calc (FPar *p)
{
    int i,j;
    for (i=p->start; i<=p->stop; i++){
        for (j=0; j< N; j++){
            (*p->c)[i][j]=(*p->a)[i][j]+(*p->b)[i][j];
        }
    }
return 0;
}



void main()
{
int a[N][N];
int b[N][N];
int c[N][N];
int n,i,j,min;
fill(a);
fill(b);
FPar *p;
p= new FPar;
p->start=0;
p->stop=4;
CreateThread (0, 0, (LPTHREAD_START_ROUTINE) calc, (LPVOID) p, 0, 0);
p= new FPar;
p->start=5;
p->stop=9;
CreateThread (0, 0, (LPTHREAD_START_ROUTINE) calc, (LPVOID) p, 0, 0);
for (i=0; i<N; i++){
  for (j=0; j<N; j++)
  cout<< c[i][j]<<"  ";
  cout<<"\n";
}
getch();
}




Компиллируется вроде бы без проблем но не работает. Результативный массив на выходе получается пустой. Я случайно не забыл создать указатели на массивы?
PM MAIL   Вверх
xvr
Дата 12.4.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(ausar @  12.4.2010,  13:11 Найти цитируемый пост)
Я случайно не забыл создать указатели на массивы? 

Забыл, и не только это.
  •  FPar, передпнные в нити, должны быть разные
  •  Указатели действительно забыл скопировать в FPar
  •  Перед печатью результатов (в строке 57) надо дождаться окончания запущенных нитей
  •  Заказывать FPar на стеке совершенно не обязательно - достаточно локальных переменных


PM MAIL   Вверх
ausar
Дата 13.4.2010, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Не так?
Код

p->(*a)[N][N]=&a;
p->(*b)[N][N]=&b;
p->(*c)[N][N]=&c;


Говорит что identifier expected. А как тогда?
PM MAIL   Вверх
586
Дата 13.4.2010, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Код
p->a=&a;
p->b=&b;
p->c=&c;

PM   Вверх
t_gran
Дата 13.4.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: нет
Всего: 37





--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.