Задать вопрос
@fjaerj12

Из-за чего может быть access violation при решении этой задачи?

Пытаюсь решить задачу 1258. Pool. Возникает ошибка сегментации, хотя такой же код на C++ проходит.
Вот код на C#:
using System;
using System.Threading;


namespace _1258шарп
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
            long W, H, x, y, xf, yf;
            string str;
            String[] N = Console.ReadLine().Split();
            W = long.Parse(N[0].Trim()); H = long.Parse(N[1].Trim());
            N = Console.ReadLine().Split();
            x = long.Parse(N[0].Trim()); y = long.Parse(N[1].Trim());
            N = Console.ReadLine().Split();
            xf = long.Parse(N[0].Trim()); yf = long.Parse(N[1].Trim());
            str = Console.ReadLine();
            long xd = 0, yd = 0;
            foreach (char c in str)
            {
                switch (c)
                {
                    case 'F':
                        yd += y;
                        y = 0;
                        break;
                    case 'B':
                        yd += H - y;
                        y = H;
                        break;
                    case 'R':
                        xd += W - x;
                        x = W;
                        break;
                    case 'L':
                        xd += x;
                        x = 0;
                        break;
                }
            }
            xd += Math.Abs(x - xf); yd += Math.Abs(y - yf);

            Console.Write("{0:F4}", Math.Sqrt((double)(xd * xd + yd * yd)));
        }
    }
}

Вот код на C++:
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
	long long W, H, x, y, xf, yf;
	string str;
	cin >> W >> H >> x >> y >> xf >> yf >> str;
	long long xd = 0, yd = 0;

	for (auto c : str)
	{
		switch (c)
		{
		case 'F':
			yd += y;
			y = 0;
			break;
		case 'B':
			yd += H - y;
			y = H;
			break;
		case 'R':
			xd += W - x;
			x = W;
			break;
		case 'L':
			xd += x;
			x = 0;
			break;
		}
	}
	xd += abs(x - xf), yd += abs(y - yf);
	cout << fixed << setprecision(4) << sqrt(double(xd * xd + yd * yd));
}


UPD: я добавил Trim() при перевода значений в long, но это не помогло.
  • Вопрос задан
  • 161 просмотр
Подписаться 2 Средний 5 комментариев
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
access violation явно говорит о проблеме работы с памятью.

Единственное спорное место - это ввод. Может в файле есть лишние переводы строк или кривые тесты (пропущено какое-то число). Ваша программа, похоже, в этом случае попытается обратиться к N[1] и упадет, потому что в строке только 1 или вообще 0 чисел.

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

Ну или читайте тупо функциями чтения чисел. В этой задаче входной файл маленький - можно спокойно читать по одному числу, даже если это будет медленнее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы