Ошибка чтения rutoken ошибка разбора dn сертификата индекс находился вне границ массива


Offline

klvking

 


#1
Оставлено
:

15 апреля 2011 г. 20:42:12(UTC)

klvking

Статус: Участник

Группы: Участники

Зарегистрирован: 15.04.2011(UTC)
Сообщений: 22
Мужчина
Откуда: СПб

При чтении сертификата из контейнера Рутокен-Магистра появляется ошибка «Неправильный параметр набора ключей» в последней строчке кода:

Цитата:

CspParameters csp = new CspParameters();
csp.ProviderType = 75;
csp.KeyContainerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
Gost3410CryptoServiceProvider gost = new Gost3410CryptoServiceProvider(csp);

Если вытаскивать сертификат с eToken’а, то все нормально. Отличие в сертификатах: на Магистре просроченный сертификат, на eToken’е действующий.
Пробовал вытаскивать действующий сертификат с Магистры — все в норме…
как можно решить эту проблему?

Отредактировано пользователем 15 апреля 2011 г. 20:42:52(UTC)
 | Причина: Не указана


Вверх

Offline

Челпанов А.

 


#2
Оставлено
:

22 апреля 2011 г. 15:25:58(UTC)

Челпанов А.

Статус: Активный участник

Группы: Участники

Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах

Извините за задержку с ответом, был в отпуске.
Проблема не в просроченности… Сроки действия ключа при извлечении из контейнера не проверяются
Скорее всего на Магистре ключ подписи, а на eToken ключ шифрования. По умолчанию открывается в контейнере ключ шифрования.

С уважением, Александр.


Вверх

WWW


Offline

klvking

 


#3
Оставлено
:

27 апреля 2011 г. 16:02:10(UTC)

klvking

Статус: Участник

Группы: Участники

Зарегистрирован: 15.04.2011(UTC)
Сообщений: 22
Мужчина
Откуда: СПб

Пробовал следующее:

Цитата:

CspParameters csp = new CspParameters();
csp.ProviderType = 75;
csp.KeyContainerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
csp.KeyNumber = (int)KeyNumber.Signature; //(int)KeyNumber.Exchange;
Gost3410CryptoServiceProvider gost = new Gost3410CryptoServiceProvider(csp);
return gost.ContainerCertificate;

Видимо причина не в этом. Попробовал на этом же ключе (Рутокен-Магистра) сгенерить тестовые ключи (http://www.cryptopro.ru/certsrv/) и записать сертификат — вышеуказанным кодом сертификат из контейнера считывается…
Поэтому причина, я думаю, в отличиях в сертификатах. Знать бы что именно не нравится… Пробовал просматривать сертификаты через интерфейс КриптоПро 3.0 — отличия в сертификатах нашел в следующем:
1. Количество точек распределения списка отзыва (CRL) (в несчитываемом 3, в считываемом 1)
2. Использование ключа:
— в несчитываемом — Проверка подлинности клиента (1.3.6.1.5.5.7.3.2) Защищенная электронная почта (1.3.6.1.5.5.7.3.4)Пользователь Центра Регистрации, HTTP, TLS клиент (1.2.643.2.2.34.6)
— в считываемом — Защищенная электронная почта (1.3.6.1.5.5.7.3.4)

Вроде все отличия…


Вверх

Offline

Челпанов А.

 


#4
Оставлено
:

27 апреля 2011 г. 18:17:33(UTC)

Челпанов А.

Статус: Активный участник

Группы: Участники

Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах

CSP сертификат да же не разбирает, .Net Framework разбирает, но не проверяет. Проблема не в содержимом сертификатов.
А Stack Trace на ошибку «Неправильный параметр набора ключей» можно увидеть?

С уважением, Александр.


Вверх

WWW


Offline

klvking

 


#5
Оставлено
:

27 апреля 2011 г. 19:22:28(UTC)

klvking

Статус: Участник

Группы: Участники

Зарегистрирован: 15.04.2011(UTC)
Сообщений: 22
Мужчина
Откуда: СПб

в CryptoPro.Sharpei.CPUtils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
в CryptoPro.Sharpei.CPUtils.GetKeyPairHelper(CPCspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandleCP& safeProvHandle, SafeKeyHandleCP& safeKeyHandle)
в CryptoPro.Sharpei.Gost3410CryptoServiceProvider.GetKeyPair()
в CryptoPro.Sharpei.Gost3410CryptoServiceProvider..ctor(CspParameters parameters)


Вверх

Offline

Челпанов А.

 


#6
Оставлено
:

28 апреля 2011 г. 13:11:36(UTC)

Челпанов А.

Статус: Активный участник

Группы: Участники

Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах

1. Эксперименты с Магистра и etoken проводите на одном компьютере?
2. Через контрольную панель CSP сертификаты на обоих контейнерах видны (Сервис/Просмотреть сертификаты в контейнере) и на обох контейнерах ключи exchange (Сервис/Протестировать)?
3. На обоих контейнерах есть пароли?
4. У Вас установлен CSP 3.6.1 или CSP/ФКН?

С уважением, Александр.


Вверх

WWW


Offline

klvking

 


#7
Оставлено
:

28 апреля 2011 г. 15:18:11(UTC)

klvking

Статус: Участник

Группы: Участники

Зарегистрирован: 15.04.2011(UTC)
Сообщений: 22
Мужчина
Откуда: СПб

1. тестировал ПО на 2-х ПК.
2. Сертификаты в обоих случаях видны. Используется Крипто Про 3.0.3300.3, поэтому Сервис/Протестировать отсутствует.
3. Пароли есть в обоих случаях.

Попробовать установить 3.6? Просто на АРМах, на которых надо будет использовать ПО, стоит Крипто Про 3.0 (лицензия), поэтому хотелось бы в рамках 3.0 добить…


Вверх

Offline

Челпанов А.

 


#8
Оставлено
:

28 апреля 2011 г. 15:41:57(UTC)

Челпанов А.

Статус: Активный участник

Группы: Участники

Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах

Цитата:

1. тестировал ПО на 2-х ПК.

Скорее всего проблема именно в различиях установки CSP или Sharpei.
Переустанавливать CSP пока не надо.
Киньте osinfo.xml (http://www.cryptopro.ru/forum2/Default.aspx?g=posts&t=2930) на support@cryptopro.ru с проблемной машины.

С уважением, Александр.


Вверх

WWW


Offline

klvking

 


#9
Оставлено
:

28 апреля 2011 г. 17:13:35(UTC)

klvking

Статус: Участник

Группы: Участники

Зарегистрирован: 15.04.2011(UTC)
Сообщений: 22
Мужчина
Откуда: СПб

osinfo.xml отправил.
Похоже криво sharpei встал.

Цитата:

CryptoPro.Sharpei.Start.dll not loaded. Error code:126 (0x7e):Не найден указанный модуль


Вверх

Offline

Челпанов А.

 


#10
Оставлено
:

28 апреля 2011 г. 17:41:04(UTC)

Челпанов А.

Статус: Активный участник

Группы: Участники

Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах

Цитата:

CryptoPro.Sharpei.Start.dll not loaded. Error code:126 (0x7e):Не найден указанный модуль

Это не ошибка, если есть одна из строчек

Цитата:

module name=»CryptoPro.Sharpei.Start20.dll»
module name=»CryptoPro.Sharpei.Start40.dll»

С уважением, Александр.


Вверх

WWW

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

вопросы

Из нашей статьи вы узнаете:

После установки драйверов и во время использования цифровой подписи потенциально могут возникнуть ошибки. Причины часто кроются в программных ошибках, неправильных действиях пользователя. На практике большинство проблем можно решить самостоятельно, без обращения за помощью в удостоверяющий центр или к специалистам по обслуживанию компьютерной техники. Рассмотрим основные ошибки, с которыми приходится сталкиваться пользователям и которые реально решить своими силами.

Ошибка: Сертификат ненадежен/Не удалось проверить статус отзыва

Ошибку можно заметить на вкладке «Сертификаты» непосредственно в панели управления Рутокен. Проблема возникает во время установки ЭЦП и связана с неполной настройкой. Речь про отсутствие специального корневого доверенного сертификата, который выдает удостоверяющий центр.

Первым шагом к устранению ошибки остается обновление комплекта драйверов. Если проблема не исчезла или последние у вас имеют актуальную версию, выполните действия по следующему алгоритму:

  • выберите ваш сертификат в панели управления;
  • нажмите кнопку «Свойства»;
  • выберите вкладку «Путь сертификации».

Если в открывшемся дереве вы видите лишь ваш личный сертификат, то надо установить еще один, который был выдан в удостоверяющем центре, и сделать доверенным.

Ошибка: Rutoken перестает определяться (Windows 10)

Потенциально могут возникать периодические ошибки из-за недоступности сертификатов, невозможности запустить панель управления. Одновременно светодиод на токене горит, а сам Рутокен имеется в Диспетчере устройств. Подобная ситуация может быть связана со спецификой работы материнской платы компьютера, когда при переходе из энергосберегающего режима в штатный не происходит «пробуждения» токена. Выходом здесь станет его отключение либо повторное подключение Рутокена (для этого достаточно достать USB-токен из разъема и подключить опять).

В случае если ошибка не исчезла, обратитесь за консультацией в удостоверяющий центр, где вы оформили ЭЦП и приобрели Рутокен.

Ошибка: Рутокен плагин недоступен

Если у вас появляется ошибка «Плагин недоступен» при входе в личный кабинет сервиса Честный Знак, то это значит, что на компьютере не установлены криптографический плагин Рутокен Плагин или КриптоПро ЭЦП Browser plug-in.

Чтобы исправить данную ошибку вы можете воспользоваться нашей инструкцией по установке плагина RuToken.

Ошибка: Панель управления не видит Рутокен ЭЦП 2.0

Для решения проблемы выполните следующие действия:

  • подключите токен к другому USB-разъему или компьютеру для оценки работоспособности;
  • определите наличие устройства через «Диспетчер устройств» в разделе «Контроллеры USB»;
  • проконтролируйте наличие доступа к веткам реестра
    • HKEY_LOCAL_MACHINESOFTWAREMicrosoftCryptographyCalais и
    • HKEY_LOCAL_MACHINESOFTWAREMicrosoftCryptographyCalaisReaders у текущего пользователя и Local Service (если необходимо, то добавьте), также убедитесь, что Служба «Смарт-карта» запущена от имени NT AUTHORITYLocalService («Пуск» — «Панель управления» — «Администрирование» — «Службы»).;
  • проверьте количество считывателей в настройках панели управления (должно быть значение 1);
  • переустановите комплект драйверов для исключения сбоя программного обеспечения.

Если ничего не помогло и ошибка осталась, обращайтесь в удостоверяющий центр «Астрал». Мы предлагаем услуги по генерации ЭЦП любых типов на выгодных условиях, а также комплексное техническое сопровождение. Для решения проблем мы готовы проконсультировать по телефону либо найти выход с помощью удаленного подключения к вашему компьютеру. Получить дополнительную информацию можно по телефону либо оставив заявку на сайте. Мы оперативно ответим и предоставим консультацию.

Я читаю файл PDF, используя iTextSharp.text.pdf.
Но, как вы можете видеть в приведенном ниже коде, когда я пытаюсь прочитать первую страницу PDF-файла, он дает мне сообщение об ошибке: «Индекс находился вне границ массива.»

Но когда я читаю вторую или третью страницу, он не выдает сообщения об ошибке.

Ниже приведен код, который я использую для чтения файла PDF.

StringBuilder pdfContent = new StringBuilder();
PdfReader pdfReader = new PdfReader(pdfFilePath);
int pageCount = pdfReader.NumberOfPages;
for (int i = 1; i <= pageCount; i++)
    {
       ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
        string text = PdfTextExtractor.GetTextFromPage(pdfReader, i, strategy);
        if (!string.IsNullOrWhiteSpace(text))
        {
            pdfContent.Append(Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text))));
        }

        if (parser != null)
        {
            parser.ProcessContent(i, imageRenderListener);
        }
    }
pdfReader.Close();

return pdfContent.ToString();

Может кто-нибудь мне помочь

Ошибка лежит в этих двух строчках(полный код представлен ниже)

exptab[i]:= (45 * exptab[i-1]) mod 257;  
logtab[exptab[i]]:= i;  

Я так понимаю, что pascalabc представляет как exptab[i] будет равен 256 и заранее выдает ошибку.Онлайн компиляторы ошибку не видят и программа работает правильно. Сами условия изменить не смогу, так как программа кодирует определенный шифр с определенными условиями. Объясните что может быть не так, потому что я не смогу показать работу программы без запуска pascalabc(если окажется, что это проблема компилятора, то попробую договориться с преподавателем).

program SAFERK64;   
VAR a1, a2, a3, a4, a5, a6, a7, a8, b1, b2, b3, b4, b5, b6, b7, b8, r: byte;  
k: ARRAY[1..21,1..8] OF byte; k1: ARRAY[1..8] OF byte;  
logtab, exptab: ARRAY[0..255] OF integer; i, j, flag: integer;  
PROCEDURE mat1(VAR a1, a2, b1, b2: byte);  
BEGIN b2:= a1 + a2; b1:= b2 + a1; END;  
PROCEDURE invmat1(VAR a1, a2, b1, b2: byte);  
BEGIN b1:= a1 - a2; b2:= -b1 + a2; END;  
BEGIN  
logtab[1]:= 0; exptab[0]:= 1;  
FOR i:= 1 TO 255 DO  
BEGIN  
exptab[i]:= (45 * exptab[i-1]) mod 257;  
logtab[exptab[i]]:= i;  
END;  
exptab[128]:= 0; logtab[0]:= 128; exptab[0]:= 1;  
flag:= 0; writeln;  
writeln('Введите число раундов r (max 10)'); readln(r);  
writeln; writeln('Введите исходный текст из 8 байт с пробелами между ними');  
REPEAT  
BEGIN  
writeln('(Значение байта от 0 до 255)');  
readln(a1, a2, a3, a4, a5, a6, a7, a8);  
writeln('Введите ключ из 8 байт');  
readln(k[1,1],k[1,2],k[1,3],k[1,4],k[1,5],k[1,6],k[1,7],k[1,8]);  
k1 [1]:= k[1,1]; k1[2]:= k[1,2]; k1[3]:= k[1,3]; k1[4]:= k[1,4];  
k1 [5]:= k[1,5]; k1[6]:= k[1,6]; k1[7]:= k[1,7]; k1[8]:= k[1,8];  
writeln('ИСХОДНЫЙ ТЕКСТ ', a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4);  
writeln('КЛЮЧ ', k[1,1]:8,k[1,2]:4,k[1,3]:4,k[1,4]:4,  
k[ 1,5]:4,k[ 1,6]:4,k[ 1,7] :4,k[ 1,8] :4);  
FOR i:= 2 TO 2*r + 1 DO  
FOR j:= 1 TO 8 DO  
BEGIN  
k1[j]:= (k1[j] shl 3) + (k1[j] shr 5);  
k[i,j]:= k1[j] + exptab[exptab[9*i+j]];  
END;  
FOR i:= 1 TO r DO  
BEGIN   
a1:= a1 xor k[2*i-1,1]; a2:= a2 + k[2*i-1,2];  
a3:= a3 + k[2*i-1,3]; a4:= a4 xor k[2*i-1,4];  
a5:= a5 xor k[2*i-1,5]; a6:= a6 + k[2*i-1,6];  
a7:= a7 + k[2*i-1,7]; a8:= a8 xor k[2*i-1,8];  
b1:= exptab[a1]; b2:= logtab[a2]; b3:= logtab[a3]; b4:= exptab[a4];  
b5:=exptab[a5]; b6:= logtab[a6]; b7:= logtab[a7]; b8:= exptab[a8];  
b1:= b1 + k[2*i,1]; b2:= b2 xor k[2*i,2];  
b3:= b3 xor k[2*i,3]; b4:= b4 + k[2*i,4];  
b5:= b5 + k[2*i,5]; b6:= b6 xor k[2*i,6];  
b7:= b7 xor k[2*i,7]; b8:= b8 + k[2*i,8];  
mat1(b1, b2, a1, a2); mat1(b3, b4, a3, a4);  
mat1(b5, b6, a5, a6); mat1(b7, b8, a7, a8);  
mat1(a1, a3, b1, b2); mat1(a5, a7, b3, b4);  
mat1(a2, a4, b5, b6); mat1(a6, a8, b7, b8);  
mat1(b1, b3, a1, a2); mat1(b5, b7, a3, a4);  
mat1(b2, b4, a5, a6); mat1(b6, b8, a7, a8);  
writeln('После раунда',i:2,a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4);  
END;  
a1:= a1 xor k[2*r+1,1]; a2:= a2 + k[2*r+1,2];  
a3:= a3 + k[2*r+1,3]; a4:= a4 xor k[2*r+1,4];  
a5:= a5 xor k[2*r+1,5]; a6:= a6 + k[2*r+1,6];  
a7:= a7 + k[2*r+1,7]; a8:= a8 xor k[2*r+1,8];  
writeln('КРИПТОГРАММА',a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4); writeln;  
writeln('Напечатайте 0 чтобы продолжить и -1 чтобы завершить'); read(flag);  
END  
UNTIL flag < 0;  
END.

Страницы 1

Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться

#1 2019-12-13 11:58:28

  • Father
  • Посетитель
  • Неактивен

Получение RSA ошибка Неверные границы массива. 0x800706c6

При попытке формирования RSA ключа через сайт ЕГАИС выходит такая ошибка
Ошибка в методе createCertificateRequest() error Неверные границы массива. 0x800706c6
Пробовали на разных пк, обновлял драйвер до версии Панель управления Рутокен 4.8.0.1. В настройках задана Поддержка криптопровайдера Microsoft Base Smart Card Crypto Provider на Рутокен ЭЦП 2.0. Пробовал менять и ставить заново.

#2 Ответ от Николай Киблицкий 2019-12-13 12:24:11

  • Николай Киблицкий
  • Техническая поддержка
  • Неактивен

Re: Получение RSA ошибка Неверные границы массива. 0x800706c6

Здравствуйте.
Можем ли мы подключиться к ПК удаленно? Если это возможно запустите TeamViewer QS и сообщите данные для подключения письмом на hotline@rutoken.ru или по телефону +7 (495) 925-77-90.

#3 Ответ от Father 2019-12-13 12:27:44

  • Father
  • Посетитель
  • Неактивен

Re: Получение RSA ошибка Неверные границы массива. 0x800706c6

Попробую организовать удаленку

#4 Ответ от Father 2019-12-17 08:59:23

  • Father
  • Посетитель
  • Неактивен

Re: Получение RSA ошибка Неверные границы массива. 0x800706c6

Получилось сформировать на другом пк с установленной версией ПУ рутокена 4.8.0.0 (которая заявлена у вас на сайте не для егаис). Не знаю, что помогло, фактор другого пк, или версия рутокена

#5 Ответ от Vintik 2019-12-17 13:05:49

  • Vintik
  • Посетитель
  • Неактивен

Re: Получение RSA ошибка Неверные границы массива. 0x800706c6

Однозначно другой ПК. Версия для ЕГАИС спокойно работает и не для него и обратно, но версия для ЕГАИС я так понимаю в основном полезна для работы с УТМ, предполагаю там может какие то задержи и т.п. чтоб ключ не помирал от кривого ПО УТМ и постоянного глупого обращения к нему.

#6 Ответ от Ксения Шаврова 2019-12-17 13:29:23

  • Ксения Шаврова
  • Администратор
  • Неактивен

Re: Получение RSA ошибка Неверные границы массива. 0x800706c6

Father пишет:

Получилось сформировать на другом пк с установленной версией ПУ рутокена 4.8.0.0 (которая заявлена у вас на сайте не для егаис). Не знаю, что помогло, фактор другого пк, или версия рутокена

Добрый день, раньше версии сильно отличались и мы решили их разделить.
Сейчас версия драйверов «для ЕГАИС» от обычных драйверов Рутокен почти не отличается. Но разделение в версиях Драйверов Рутокен мы оставили.
Единственное, в версии для ЕГАИС при установке в настройках всегда принудительно выставляется криптопровайдер Microsoft Base Smart Card Cryptoprovider, который используется для выписывания RSA.

Скорее всего, особенности конкретного компьютера могли повлиять. Более точно определить удалось бы только после подключения.

Страницы 1

Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться

Причины и способы устранения ошибки — индекс находится вне границ массива

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

Ошибка индекс находится за границами массива

Закажите настройку БД 1С в IT RUSH!

  • Стоимость работ программиста 1С – 2000 руб/час;
  • Абонемент на 50 часов/месяц, 1900 руб/час;
  • Абонемент на 100 часов/месяц, 1800 руб/час;

Что значат, почему возникают такие ошибки?

Получение системного сообщения о том, что индекс элемента находится за границами массива или system indexoutofrangeexception, обозначает возникновение следующей ситуации:

Во время программирования были упущены некоторые моменты для проверки на количество коллекций в 1С. За все время использования продукта коллекции могут закончиться для выполнения важных этапов создания документов или отчетов. При этом 1С Предприятие будет делать попытки поиска, уведомит пользователя о выявленной проблеме таким оповещением.

Основными причинами подобных неполадок становятся такие процессы:

  • отсутствие в таблице поля, к которому отправляется запрос;
  • недостаточное количество свободных полей;
  • неправильное изменение настроек, конфигурации всей программы;
  • неполный или некорректный перенос информации с одной версии программного обеспечения на другую.

Попытки внести правки в конфигурацию СУБД самостоятельно могут привести к потере данных и рабочего состояния всех компонентов программы. Проверить все эти моменты, сделать необходимые настройки сможет программист нашей компании.

Обратитесь к специалистам

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

Наши постоянные клиенты по 1С:

Корона Лифт

Гознак

Накфф

Рембаза

Rozara

Можно найти решение проблемы на различных форумах в интернете, но применить советы, указанные в сообщениях, не всегда возможно без профподготовки и грозит потерей всех данных.

Обращаться IT RUSH — это практичное и выгодное решение:

  • сотрудники разбираются во всех особенностях, тонкостях SQL server;
  • оперативное реагирование на сообщения о возникновении проблем в использовании 1С через мессенджеры или по телефону в любое время;
  • программисты досконально знают базы данных 1С, ответственно и правильно выставляют необходимые настройки и вносят изменения в них;
  • мы гарантируем быстрое и точное обслуживание 1С с подробным объяснением и консультациями по всем непонятным или сложным моментам.

Стоимость работ специалиста IT-Rush программиста 1С  по устранению ошибки «индекс находится за границами массива 1С»- от 1800 руб./час.

Нам доверяют:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Введите порядок матрицы");
        int N = Int32.Parse(Console.ReadLine());
        int M = Int32.Parse(Console.ReadLine());
        Console.WriteLine();
        int[,] a = new int[N, M];
        int[] b = new int[N];
        int max;
        Random rnd = new Random();

        max = 0;
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                a[i, j] = rnd.Next(0, 10);
                Console.Write(a[i, j] + "t");
            }

            Console.WriteLine();
        }

        Console.WriteLine();


        for (int i = 0; i < N; i++)
        {
            for (int j = 0; i < M; j++)
            {
                if (a[i, j] > max)
                {
                    max = a[i, j];
                }
            }
            b[i] = max;
            Console.Write(b[i] + "t");
        }
        Console.WriteLine();
    }
}

Ошибка происходит в строке if (a[i, j] > max)

PascalABC.NET как исправить ошибку?

    uses Arrays;
var 
  a: array of integer;
  N: integer;
  i1,i2:integer;
begin
  N := 50;
  a := CreateRandomIntegerArray(50);
  for var i:=1 to N do begin
    if a[i]>0 then
    i1+=1;
    if a[i]<0 then
    i2+=1;
   end;
write(i1);
write(i2);
end.

задан 6 дек 2017 в 6:19

Ярослав's user avatar

Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin должен выглядеть хотя бы так for var i:=0 to N-1 do begin

А вообще стоит оперировать такими функциями работы с массивами, как length, High и т.п.

ответ дан 6 дек 2017 в 6:27

Viktor Tomilov's user avatar

Viktor TomilovViktor Tomilov

8,0374 золотых знака24 серебряных знака62 бронзовых знака

LR16

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

1

Ошибка времени выполнения: Индекс находится вне границ массива

28.03.2015, 21:34. Показов 23963. Ответов 16

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте!
Столкнулся с ошибкой:
[Ошибка времени выполнения: Индекс находится вне границ массива]

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var f: textfile; n: longint;
    text: string; s: char;
begin
assignfile(f,'file.txt');
reset(f);
while (not eof(f)) do
  begin
    readln(f,s);
    inc(n);
    text[n] := s // ЭТУ строку подсвечивает
  end;
 n:=0;  
 while (not eof(f)) do
 begin
    inc(n);
    write(ord(text[n])+3);
  end;
  close(f);
end.

0

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 22:45

2

Проинициализируйте переменную «n» перед первым использованием.

1

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 22:50

 [ТС]

3

Это как проинициализировать ??
писал перед циклом n:=0 — не помогло

0

APALoff

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:00

4

Цитата
Сообщение от LR16
Посмотреть сообщение

писал перед циклом n:=0 — не помогло

И не поможет, инициализировать надо тоже с умом.

Можно поставить единицу, но у Вас скорее всего всплывет потом еще одна ошибка в строке 16.
Но дело даже не в ней. Вы изначально оперируете с символами строки не заданной изначально длины.

Добавлено через 2 минуты
Т.е., Pabc.NET за Вас инициализирует переменную «text» нулевым значением, т.е. text:=»;
А Вы пытаетесь изменить символы в позициях превышающих длину строки.
Надо не изменять, а суммировать:

text[n] := s // ЭТУ строку подсвечивает

а надо

Pascal
1
text:=text+s;

Добавлено через 1 минуту
Только учтите, что после накопления строки, Выше значение n будет превышать истинное значение на единицу.

1

Модератор

9625 / 4937 / 3261

Регистрация: 17.08.2012

Сообщений: 15,429

28.03.2015, 23:06

5

Лучший ответ Сообщение было отмечено LR16 как решение

Решение

Изначальная длина массива (а строка — это массив) text при инициализации — 0 символов. Вы пытаетесь присвоить прочитанный символ сразу за границы строки. Кроме того, f объявлен как textfile, то есть, является файлом с последовательным доступом, Вы же пытаетесь с ним работать не пойми как, с одной стороны, как с файлом с последовательным доступом (readln), с другой стороны — пытаетесь записывать что-то после конца файла (write), что возможно только для файлов с произвольным доступом, но с каким-то нелепым условием записи до конца файла (второе while). Естественно, после конца файла с последовательным доступом ничего записать Вам не удастся, во-первых, потому что он открыт для чтения, и, во-вторых, вообще не удастся, потому что открыть его для добавления информации (append) можно не во всех диалектах паскаля, в-третьих, ничего не запишется, так как конец файла уже достигнут в первом цикле while. В общем, не программа, а сплошная ошибка.

2

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:08

 [ТС]

6

OK, счас попробую

0

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:10

7

LR16, выше Cyborg Drone дополнил то, что я проглядел (textfile).

Добавлено через 1 минуту
Вообще да, какая то каша получается, а не код.

1

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:13

 [ТС]

8

Цитата
Сообщение от Cyborg Drone
Посмотреть сообщение

с другой стороны — пытаетесь записывать что-то после конца файла (write)

Может я написал не правильно, но имелся ввиду вывод на экран..
А, точно, файл закрыт.. извините, во втором цикле должен был написать длину строки..
За остальное спасибо!

0

Модератор

9625 / 4937 / 3261

Регистрация: 17.08.2012

Сообщений: 15,429

28.03.2015, 23:14

9

А что вообще Ваша программа должна делать? Так, навскидку, мне кажется, она с Цезарем воюет, но воюет неправильно.

1

APALoff

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:15

10

Цитата
Сообщение от LR16
Посмотреть сообщение

Может я написал не правильно, но имелся ввиду вывод на экран..

Если это вывод на экран, то не правильно — у Вас цикл привязан к файлу.
Напишите просто

Pascal
1
Writeln(text);

Добавлено через 40 секунд
А нет, не пойдёт. Сначала надо сделать кодирование.

1

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:16

 [ТС]

11

Спасибо..

0

APALoff

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:16

12

Pascal
1
For i:=1 to n-1 do text[i]:=Chr(ord(text[i])+3);

1

LR16

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:25

 [ТС]

13

Цитата
Сообщение от APALoff
Посмотреть сообщение

А нет, не пойдёт. Сначала надо сделать кодирование.

Да я понял, усложнил себе задачу просто..

Добавлено через 7 минут

Цитата
Сообщение от APALoff
Посмотреть сообщение

каша получается, а не код.

Да, че-то тупанул с самого начала.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var f: textfile; n, i: longint;
    text: string; s: char;
begin
  AssignFile(f,'file.txt');
  reset(f);
  while (not eof(f)) do
    begin
      readln(f,s);
      inc(n);
      text:=text+s
    end;
  close(f);
  
  for i:=1 to n-1 do text[i]:=Chr(ord(text[i])+3);
  write('RES: ',text);
end.

Опять где-то накосячил, только один символ выводит. P.S. там забыл вернуть номер символа опять в символ CHR, спасибо..

0

1646 / 1075 / 1081

Регистрация: 03.07.2013

Сообщений: 4,507

28.03.2015, 23:30

14

Лучший ответ Сообщение было отмечено LR16 как решение

Решение

Цитата
Сообщение от LR16
Посмотреть сообщение

for i:=1 to n-1

Тут уже можно изменить на просто n, без «-1»

Добавлено через 1 минуту
А еще Вам писали:

Цитата
Сообщение от Cyborg Drone
Посмотреть сообщение

Вы же пытаетесь с ним работать не пойми как, с одной стороны, как с файлом с последовательным доступом (readln),

Думаю надо READ, без LN

Добавлено через 1 минуту
Хотя я в Pabc.NET не сильно еще знаком с обработкой файлов…

1

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

28.03.2015, 23:32

 [ТС]

15

Цитата
Сообщение от APALoff
Посмотреть сообщение

Думаю надо READ, без LN

Ого, сработало, большое Спасибо !)
————
Да, это на Цезаре тренировался, в программе кодирования по XOR ошибка, не хотел захламлять лишним кодом.

0

Cyborg Drone

Модератор

9625 / 4937 / 3261

Регистрация: 17.08.2012

Сообщений: 15,429

28.03.2015, 23:41

16

Лучший ответ Сообщение было отмечено LR16 как решение

Решение

Ну не знаю… Во-первых, как правило, шифр Цезаря строится на ограниченном и закольцованном множестве символов, у Вас же — на всех символах. Как Вы думаете, каков будет результат преобразования для трёх последних символов кодовой таблицы? Правильно, весьма ошибочный. Скорее всего, программа вылетит с оговоркой, что нельзя привести какой-нибудь word или integer к типу char. Тем не менее, если из Вашей программы повытряхнуть всё лишнее, то будет так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var f: textfile;
    i: integer;
    text: string;
begin
  AssignFile(f, 'file.txt');
  reset(f);
  while not eof(f) do
    begin
      readln(f, text);
      for i := 1 to length(text) do text[i] := chr(ord(text[i]) + 3);
      writeln(text)
    end;
  close(f);
  readln
end.

1

LR16

0 / 0 / 2

Регистрация: 15.03.2015

Сообщений: 20

29.03.2015, 00:42

 [ТС]

17

Цитата
Сообщение от Cyborg Drone
Посмотреть сообщение

Ну не знаю

БОЛЬШОЕ СПАСИБО ВАМ )
Я ошибочно выразился, делал другую программу, там произошла затычка над которой ломал голову 2 часа.
Решил обратится к Вам, но чтобы не захламлять форум, сделал другую прогу(покороче) с той-же ошибкой.
———
Какраз теперь доделал основную.
2 процедуры, функция + основной код. Вот основа программы, функция:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function cry_xor(text,key:string):string;
var ln,lnk,i:longint; longkey, res: string;
    tx: char;
begin
ln := Length(text);
lnk := Length(key);
  
  For i := 0 to ln div lnk do
    longkey := longkey + key;
  
  For i := 1 to ln-2 do
    begin
      // XOR algorithm
      tx := chr((ord(text[i]) xor ord(longkey[i])));
      res := res + tx
    end;
    cryptxor := res
end;

===============
Ещё раз Спасибо Вам за помощь, когда буду программировать получше(да и теперь стараюсь), буду также помогать начинающим програмам на форуме. Пока-что сам фигею с задач в темах.

0

program p1;

type
  massive = array of integer;

function PolMos(a: massive; n: byte): char;
var
  c, i: byte;
begin
  c := 0;
  for i := low(a) to high(a) div 2 do
    if a[i] <> a[high(a) - i + 1] then c := 1;
  if c = 0 then writeln(chr(13), 'Массив является палиндромом')
  else writeln(chr(13), 'Массив не является палиндромом');
end;

function massiv(n: byte): char;
var
  i: byte;
  a: massive;
begin
  setlength(a, n);
  randomize;
  for i := low(a) to high(a) do        
  begin
    a[i] := random(n);        
    write(a[i]:4);
  end;
  PolMos(a, n);
end;

var
  n: byte;

begin
  write('Введите размер массива:   '); read(n);
  write('Массив: '); massiv(n);
  
end.

61aa9f2b2b50e828286684.jpeg


  • Вопрос задан

    более года назад

  • 781 просмотр

Индекс находился вне границ массива

Русским по белому же написано.

Представим, что у нас массив a[] размером 2
Тогда
low(a)=0
high(a)=1
На первой же итерации:
i=0
high(a) — i + 1 = 2
2 находится за пределами границ массива.

А ещё из твоей функции никакое значение не возвращается.

И в PascalABC можно точки останова расставлять и смотреть, какие значения переменных у тебя там получились перед ошибкой.

Пригласить эксперта


  • Показать ещё
    Загружается…

Сбер

Ростов-на-Дону

от 170 000 ₽

24 июн. 2023, в 23:21

5000 руб./за проект

24 июн. 2023, в 21:49

1000 руб./за проект

24 июн. 2023, в 18:21

30000 руб./за проект

Минуточку внимания

БЛОГ НА HUSL

  • Деловая переписка на английском языке: фразы и советы
  • Принцип цикады и почему он важен для веб-дизайнеров
  • В популярных антивирусах для ПК обнаружили лазейки в защите

Ошибка времени выполнения: Индекс находился вне границ массива

Автор вопроса: Ярослав

PascalABC.NET как исправить ошибку?

    uses Arrays;
var 
  a: array of integer;
  N: integer;
  i1,i2:integer;
begin
  N := 50;
  a := CreateRandomIntegerArray(50);
  for var i:=1 to N do begin
    if a[i]>0 then
    i1+=1;
    if a[i]<0 then
    i2+=1;
   end;
write(i1);
write(i2);
end.

Источник

Ответы (1 шт):

Автор решения: Viktor Tomilov

Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin должен выглядеть хотя бы так for var i:=0 to N-1 do begin

А вообще стоит оперировать такими функциями работы с массивами, как length, High и т.п.

→ Ссылка

licensed under cc by-sa 3.0 with attribution.

Попытка вывести массив не поэлементно, а целиком

const Sz = 100; 

var 
  a: array [1..Sz] of integer;
  i: integer;

begin
  read(a); // неверно: массив необходимо вводить поэлементно
end.

Использование записи a[i] вне цикла

const Sz = 10; 

var 
  a: array [1..Sz] of integer;
  i: integer;

begin
  var N := Sz;
  for i:=1 to N do 
    a[i] := Random(100);
  a[i] := 666; // Ошибка: переменной i нельзя пользоваться вне цикла for  
end.

Выход за границы диапазона изменения индекса

const Sz = 10; 

var a: array [1..Sz] of integer;

begin
  var N := Sz;
  for var i:=1 to N+1 do 
    a[i] := Random(100); // При i=N+1 происходит ошибка: индекс вне границ массива
end.

Затирание элементов при сдвиге

const Sz = 100; 

var a: array [1..Sz] of integer;

begin
  var N := 10;
  for var i:=1 to N do 
    a[i] := Random(100); 
  for var i:=1 to N do 
    write(a[i],' ');
  writeln;
  for var i:=1 to N-1 do // ошибка: алгоритм сдвига вправо надо начинать с конца
    a[i+1] := a[i];
  for var i:=1 to N do 
    write(a[i],' ');
end.

Ссылки

  • Программы для начинающих
  • Сайт PascalABC.NET: Программы и алгоритмы для начинающих

  • Ошибка чтения pcu файла pascal
  • Ошибка чтения nfc повтор попытки что это
  • Ошибка чтения nfc на sony что это такое
  • Ошибка чтения nfc метки что это такое
  • Ошибка чтения nfc метки что это значит