![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
всем чудесного дня и чудесных размышлений! Народ, чушь какая то получается, написал многопоточную программу на С++ - все нормально, потом то же на языке С#, вычисление выражения - тот же, КОМПИЛИРУЮ - все ок, ЗАПУСКАЮ - выскакивает ошибка "Индекс побывал за границей массива". а ведь выполняется обыкновенная операция - умножение матрицы на матрицу! отчего это? Причем эта ошибка выскакивает даже при операции MT[i,j]=MR[i,j]. как индекс может попасть за границу масива? как такое возможно и какие меры надо принять? Спасибо тем кто откликнулся!
|
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 02.02.2010
Сообщений: 305
|
![]()
Такое может быть только если массив объявлен на n элементов, а обрабатывается в цикле с m шагов. (n<m)
А вообще сделай трассировку и все поймешь
Skype: CODERua
|
![]() |
![]() |
#3 | |
Trust no one.
Старожил
Регистрация: 07.04.2009
Сообщений: 6,526
|
![]() Цитата:
массив от 0 до 10, а обращаетесь к 11. Если матрицы не равны по размерам - будет такая ошибка.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ |
|
![]() |
![]() |
#4 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
логически все правильно:
for(i=0;i<H;i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ MQ[i,j]=MQ[i,j]+MT1[i,k]*MO[j,k]; } } } где H<N; а вопит на этом месте MQ[i,j]=MQ[i,j]+MT1[i,k]*MO[j,k]; если это убрать тогда будет вопить вот здесь: for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { MT1[i,j] = MT[i,j]; MR1[i,j] = MR[i,j]; } } |
![]() |
![]() |
#5 | |
Участник клуба
Регистрация: 29.12.2009
Сообщений: 1,166
|
![]() Цитата:
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть] |
|
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 16.02.2009
Сообщений: 555
|
![]()
покажы весь код.попробуй поставить try{} catch{} и потом проверь все ли перемножило.
|
![]() |
![]() |
#7 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
весь код ни к чему показывать он неинтересный -но сделать надо. обьявлял масив вот так: int[,] MT1 = new int[N, N]; где N =8. и вот весь код извините за это:
//задание: написать многопоточную программу, которая вычисляет выражение. using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.IO; namespace lab3_Pro { class lab3_Csharp { static int N=8; static int P=4; static int H=N/P; static int [,]MB=new int[N,N]; static int [,]MO=new int[N,N];//создаем глобальную матрицу static int [,]MT=new int[N,N]; static int [,]MR=new int[N,N]; static int B; static int a; static int [,]MA=new int[N,N]; static int i,j; static object CrSec=new object(); //CREATE OF CRITICAL SECTIONS static Semaphore SEM = new Semaphore(0,3);//CREATE OF SEMAFORS static Mutex MUT = new Mutex(false); //AND MUTEX static EventWaitHandle EV2 = new ManualResetEvent(false);//создание событий с ручным сбросом static EventWaitHandle EV3 = new ManualResetEvent(false); static EventWaitHandle EV4 = new ManualResetEvent(false); //поток первый public static void Thread_FIRST(){ Console.WriteLine("Thread 1 started\n"); int[,] MQ = new int[N, N]; int[,] MT1 = new int[N, N]; int[,] MR1 = new int[N, N]; ; int[,] MO = new int[N, N];//создание локальной матрицы int B1; int a1; EV2.WaitOne(); EV3.WaitOne(); EV4.WaitOne(); lock (CrSec) { // вхід в критичну секцію for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { MT1[i,j] = MT[i,j]; //здесь возникает ошибка MR1[i,j] = MR[i,j]; //потом здесь } } } // вихід з критичої секції //MOh*MT1 for(i=0;i<H;i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ MQ[i,j]=MQ[i,j]+MT1[i,k]*MO[j,k]; } } } //MA=(MR*MQh) for(i=0;i<H;i++){ for(j=0;j<N;j++){ MA[i,j]=0; for(int k=0;k<N;k++){ MA[i,j]+=MQ[i,k]*MR1[k,j]; //и здесь } //printf("%d",MA[i][j]); } //printf("\n"); } MUT.WaitOne(); //захоплення процессом мютекса B1=B; a1=a; MUT.ReleaseMutex(); //звільнення процессом мютекса //Bh*(MO*MT1*MR) for(i=0;i<H;i++){ for(j=0; j<N; j++){ MA[i,j]=(B1 * MA[i,j]); } } //a1*MBh for(i=0;i<H;i++){ for(j=0;j<N;j++){ MB[i,j]=a1*MB[i,j]; } } for(i=0;i<H;i++){ for(j=0;j<N;j++){ MA[i,j]=MA[i,j]+MB[i,j]; } } SEM.WaitOne(); SEM.WaitOne(); SEM.WaitOne(); //output data Console.Write("\nOutput:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++){ Console.WriteLine(" %3d ",MA[i,j]); } Console.WriteLine("\n"); } Console.Write("Thread 1 finished\n"); } остальные потоки я не буду вписывать, т.к. они все похожие |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
ничего не понимаю. тот же код работал на С++, а для С# немного по другому, но умножения и циклы нет необходимости изменять и вот такая ошибка.
Последний раз редактировалось potap88; 18.04.2010 в 00:59. |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]() ![]() Последний раз редактировалось potap88; 18.04.2010 в 01:00. |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
весь код ни к чему показывать он неинтересный -но сделать надо. обьявлял масив вот так: int[,] MT1 = new int[N, N]; где N =8. и вот весь код извините за это:
//задание: написать многопоточную программу, которая вычисляет выражение. using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.IO; namespace lab3_Pro { class lab3_Csharp { static int N=8; static int P=4; static int H=N/P; static int [,]MB=new int[N,N]; static int [,]MO=new int[N,N];//создаем глобальную матрицу static int [,]MT=new int[N,N]; static int [,]MR=new int[N,N]; static int B; static int a; static int [,]MA=new int[N,N]; static int i,j; static object CrSec=new object(); //CREATE OF CRITICAL SECTIONS static Semaphore SEM = new Semaphore(0,3);//CREATE OF SEMAFORS static Mutex MUT = new Mutex(false); //AND MUTEX static EventWaitHandle EV2 = new ManualResetEvent(false);//создание событий с ручным сбросом static EventWaitHandle EV3 = new ManualResetEvent(false); static EventWaitHandle EV4 = new ManualResetEvent(false); //поток первый public static void Thread_FIRST(){ Console.WriteLine("Thread 1 started\n"); int[,] MQ = new int[N, N]; int[,] MT1 = new int[N, N]; int[,] MR1 = new int[N, N]; ; int[,] MO = new int[N, N];//создание локальной матрицы int B1; int a1; EV2.WaitOne(); EV3.WaitOne(); EV4.WaitOne(); lock (CrSec) { // вхід в критичну секцію for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { MT1[i,j] = MT[i,j]; //здесь возникает ошибка MR1[i,j] = MR[i,j]; //потом здесь } } } // вихід з критичої секції //MOh*MT1 for(i=0;i<H;i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ MQ[i,j]=MQ[i,j]+MT1[i,k]*MO[j,k]; } } } //MA=(MR*MQh) for(i=0;i<H;i++){ for(j=0;j<N;j++){ MA[i,j]=0; for(int k=0;k<N;k++){ MA[i,j]+=MQ[i,k]*MR1[k,j]; //и здесь } //printf("%d",MA[i][j]); } //printf("\n"); } MUT.WaitOne(); //захоплення процессом мютекса B1=B; a1=a; MUT.ReleaseMutex(); //звільнення процессом мютекса //Bh*(MO*MT1*MR) for(i=0;i<H;i++){ for(j=0; j<N; j++){ MA[i,j]=(B1 * MA[i,j]); } } //a1*MBh for(i=0;i<H;i++){ for(j=0;j<N;j++){ MB[i,j]=a1*MB[i,j]; } } for(i=0;i<H;i++){ for(j=0;j<N;j++){ MA[i,j]=MA[i,j]+MB[i,j]; } } SEM.WaitOne(); SEM.WaitOne(); SEM.WaitOne(); //output data Console.Write("\nOutput:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++){ Console.WriteLine(" %3d ",MA[i,j]); } Console.WriteLine("\n"); } Console.Write("Thread 1 finished\n"); } остальные потоки я не буду вписывать, т.к. они все похожие |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. | Каравай | Microsoft Office Excel | 13 | 17.02.2010 09:53 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder | AleksP | C++ Builder | 7 | 11.04.2009 13:06 |
Сортировка массива способом Шелла "степени двойки" | xxxPascalxxx | Помощь студентам | 2 | 15.11.2008 21:58 |