Исключение типа System.IndexOutOfRangeException при получении из анонимного канала
Массиву str задаётся размер N. Затем массив по анонимному каналу передаётся в другой поток. И, когда из анон.канала происходит считывание элементов массива, происходит исключение IndexOutOfRange. Код передачи элементов из анон.канал массиву приведён ниже
for (int i = 0; i < N; i++)
{
numII[i] = Convert.ToInt32(sr.ReadLine());
}
UPDATE2 : Теперь привожу действительно полный код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.IO.Pipes;
namespace ParaProgBv2
{
class Program
{
static public Stream outStream;
static public Stream inStream;
public static AnonymousPipeServerStream pipeServer;
public static AnonymousPipeClientStream pipeClient;
static public string pipeHandle;
static int mode;
static bool stop = false;
static object thisLock = new object();
static int com;
static int N;
static string S;
static int k = 0;
static float[] num = new float[N];
static string[] str = new string[3];
static string[] strII = new string[3];
static float[] numII = new float[N];
public static void Second()
{
pipeClient = new AnonymousPipeClientStream(PipeDirection.In, pipeHandle);
StreamReader sr = new StreamReader(pipeClient);
while (!stop)
{
lock (thisLock)
{
//string buffer = "";
//buffer = sr.ReadLine();
int tmp = mode;
if (tmp == 1)
{
for (int i = 0; i < 3; i++)
{
strII[i] = Convert.ToString(sr.ReadLine());
}
Console.WriteLine($"Message read ({DateTime.Now}): {strII[0]} {strII[1]} {strII[2]}");
Console.WriteLine("Обработка строки");
int sim = Convert.ToInt32(strII[2]);
string tmpStr = strII[0].Substring(0, sim) + strII[1];
Console.WriteLine(tmpStr);
}
else if (tmp == 2)
{
Console.WriteLine("Обработка чисел");
for (int i = 0; i < N; i++)
{
numII[i] = Convert.ToInt32(sr.ReadLine()); //Здесь возникает исключение
}
for (int i = 0; i < N; i++)
{
Console.WriteLine($"Message read ({DateTime.Now}): {numII[i]}");
}
for (int i = 0; i < N; i++)
{
if ((i + 1) % 2 == 0 && numII[i] > 0)
{
k++;
}
}
Console.WriteLine($"В заданном массиве {k} положительных элементов с чётными индексами");
}
else if (tmp == 3)
{
Console.WriteLine("Завершение");
}
else
{
Console.WriteLine("Ага, такой команды точно нет");
}
}
Thread.Sleep(1);
}
sr.Close();
}
static void intCheck(out int N) //Проверка ввода целочисленной переменной
{
while (!int.TryParse(Console.ReadLine(), out N))
{
Console.WriteLine("Некорректный ввод");
}
}
static void floatCheck(out float N) //Проверка ввода численной переменной с плавающей точкой
{
while (!float.TryParse(Console.ReadLine(), out N))
{
Console.WriteLine("Некорректный ввод");
}
}
static void stringCheck(out string S) //Проверка ввода номера символа для объединения строк
{
while (!int.TryParse(Console.ReadLine(), out N))
{
Console.WriteLine("Некорректный ввод");
}
S = Convert.ToString(N);
}
public static void Main()
{
Thread th2 = new Thread(() => Second());
pipeServer = new AnonymousPipeServerStream(PipeDirection.Out);
outStream = pipeServer;
pipeHandle = pipeServer.GetClientHandleAsString();
StreamWriter sw = new StreamWriter(outStream);
sw.AutoFlush = true;
while (!stop)
{
Console.WriteLine("Введите цифру 1 для того что бы выполнить задание с обработкой строк");
Console.WriteLine("Введите цифру 2 для того что бы выполнить задание с обработкой массива");
Console.WriteLine("Введите цифру 3 для того, чтобы выйти");
if (!th2.IsAlive)
{
th2.Start();
}
lock (thisLock)
{
intCheck(out com);
if (com != 1 && com != 2 && com != 3) { com = 4; }
mode = com;
switch (com)
{
case 1:
Console.WriteLine("Введите буквенную строку 1");
str[0] = Console.ReadLine();
Console.WriteLine("Введите буквенную строку 2");
str[1] = Console.ReadLine();
/*Вставка одной строки в другую с заданного символа*/
Console.WriteLine("Введите номер символа, после которого будет замена");
stringCheck(out str[2]);
for (int i = 0; i < str.Length; i++)
{
sw.WriteLine(str[i]);
}
break;
case 2:
/*Подсчет числа положительных элементов с четными индексами*/
Console.Write("Введите размер массива = ");
intCheck(out N);
num = new float[N];
Console.WriteLine("Введите элементы массива:");
for (int i = 0; i < num.Length; i++)
{
Console.Write("{0} элемент = ", i + 1);
floatCheck(out num[i]);
sw.WriteLine(num[i]);
}
break;
case 3:
stop = true;
sw.WriteLine(com);
break;
case 4:
Console.WriteLine("Нет такой комманды");
break;
}
}
}
sw.Close();
th2.Join();
}
}
}
P.S заранее прошу прощения за внешний вид кода, изучаю шарп первый месяц и до форматирования кода пока не дошёл.
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Вы не создаете массив NumII заданной длины. Исключение возникает из-за того, что длина массива на момент выполнения той самой строки 0.
- Уберите инициализацию массивов в глобальной области, потому что на момент инициализации
Nравно0. Это по факту вас только сбило с толку.
static float[] num;
static float[] numII;
- Вот здесь вот так
Console.Write("Введите размер массива = ");
intCheck(out N);
num = new float[N];
numII = new float[N]; // добавьте эту строку