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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 17.04.2010, 20:31   #1
potap88
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию C# ошибка:"Индекс находился вне границ массива"

всем чудесного дня и чудесных размышлений! Народ, чушь какая то получается, написал многопоточную программу на С++ - все нормально, потом то же на языке С#, вычисление выражения - тот же, КОМПИЛИРУЮ - все ок, ЗАПУСКАЮ - выскакивает ошибка "Индекс побывал за границей массива". а ведь выполняется обыкновенная операция - умножение матрицы на матрицу! отчего это? Причем эта ошибка выскакивает даже при операции MT[i,j]=MR[i,j]. как индекс может попасть за границу масива? как такое возможно и какие меры надо принять? Спасибо тем кто откликнулся!
potap88 вне форума
Старый 17.04.2010, 21:04   #2
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Такое может быть только если массив объявлен на n элементов, а обрабатывается в цикле с m шагов. (n<m)
А вообще сделай трассировку и все поймешь
Skype: CODERua
[CODER] вне форума
Старый 17.04.2010, 21:04   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
как такое возможно и какие меры надо принять?
например:
массив от 0 до 10, а обращаетесь к 11.

Если матрицы не равны по размерам - будет такая ошибка.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума
Старый 17.04.2010, 22:19   #4
potap88
Пользователь
 
Регистрация: 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];
}
}
potap88 вне форума
Старый 17.04.2010, 22:48   #5
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
логически все правильно:
напиши объявления массивов, а потом посмотрим
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума
Старый 17.04.2010, 22:50   #6
Cpluser
Форумчанин
 
Аватар для Cpluser
 
Регистрация: 16.02.2009
Сообщений: 555
По умолчанию

покажы весь код.попробуй поставить try{} catch{} и потом проверь все ли перемножило.
Cpluser вне форума
Старый 18.04.2010, 00:27   #7
potap88
Пользователь
 
Регистрация: 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");
}

остальные потоки я не буду вписывать, т.к. они все похожие
potap88 вне форума
Старый 18.04.2010, 00:43   #8
potap88
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

ничего не понимаю. тот же код работал на С++, а для С# немного по другому, но умножения и циклы нет необходимости изменять и вот такая ошибка.

Последний раз редактировалось potap88; 18.04.2010 в 00:59.
potap88 вне форума
Старый 18.04.2010, 00:48   #9
potap88
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию


Последний раз редактировалось potap88; 18.04.2010 в 01:00.
potap88 вне форума
Старый 18.04.2010, 00:59   #10
potap88
Пользователь
 
Регистрация: 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");
}

остальные потоки я не буду вписывать, т.к. они все похожие
potap88 вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай 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