Проблема с C # List при компиляции в моно (домашнее задание) - PullRequest
10 голосов
/ 12 марта 2011

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

Теперь это не проблема алгоритма. Это больше техническая проблема. На моем компьютере я использую компилятор .NET (csc), в то время как оценочная машина профессора использует некоторую форму моно.

Работает хорошо, пока грейдер не сказал, что я получил 30/100. Мой друг предложил мне использовать «систему ручного ввода» грейдера, поэтому здесь я заставил ее создать списки массив-100000 для списка смежности.

Грейдер через несколько секунд сообщил, что моя программа потерпела крах.

Stacktrace:

at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke

Это немного странно и тревожно для меня, но я до сих пор не нашел ответа на этот вопрос. Опять же, эта программа отлично работала на моем ПК.

Это моя часть программы:

using System;
using System.Collections;
using System.Collections.Generic;

class topo{
public static void Main(){
    string[] ST = Console.ReadLine().Split(' ');
    int N=Convert.ToInt32(ST[0]), M=Convert.ToInt32(ST[1]);
    int[] ins = new int[N];  //node's total in-degrees
    List<int>[] E = new List<int>[N];

    for(int n=0;n<N;n++)    
        E[n] = new List<int>();

    for(int m=0;m<M;m++){
        ST = Console.ReadLine().Split(' ');
        int u = Convert.ToInt32(ST[0]);
        int v = Convert.ToInt32(ST[1]);
        E[u-1].Add(v-1);
        ins[v-1]++;
    }

    Queue S = new Queue();
    List<int> L = new List<int>(); //result list

    for(int n=0;n<N;n++){
        //add stranded nodes directly and don't process it
        if(ins[n]==0 && E[n].Count==0)
            L.Add(n);

        //put into queue
        else if(ins[n]==0)
            S.Enqueue(n);
    }

    while(S.Count>0){
        int n = (int) S.Dequeue();
        L.Add(n);
        foreach(int m in E[n])
            if(--ins[m]==0)
                S.Enqueue(m);
    }

    foreach(int n in L)
        Console.WriteLine(n+1);

}

}

Большое спасибо, и я ценю любой ответ.

Редактировать: Я еще раз посмотрел на вывод грейдера, чтобы увидеть, пропустил ли я что-нибудь, и действительно я это сделал. Там написано «syscal: 2», но все, что я знаю об этом, это то, что «программа не завершилась нормально».

Редактирование # 2: я пытался сделать попытку программы создать массив размеров списка в диапазоне от 5000, 10000 и т. Д., А после 40000 "система ручного ввода" сказала, что программа получила Систему .OutOfMemoryException. С дальнейшим изучением различных частей грейдера, в которые учащиеся допускаются, кажется, что проф неправильно настроил свои параметры оценки и дал нам меньше памяти, чем заявлено. (Он сказал «32MB», но программа падает примерно на 16MB)

Я сообщил ему об ошибке, и он (прямо сейчас) изучает ее.

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Следующий код не будет работать, если значение u или v меньше 1.

for(int m=0;m<M;m++){
    ST = Console.ReadLine().Split(' ');
    int u = Convert.ToInt32(ST[0]);
    int v = Convert.ToInt32(ST[1]);
    E[u-1].Add(v-1);
    ins[v-1]++;
}

Потому что u-1 или v-1 будет отрицательным, и это вызовет исключение.

0 голосов
/ 13 ноября 2014

Продолжение: Это анекдотичный, самоотвечающий, и очень поздно, потому что я только что понял, что это нормально, чтобы ответить сам. Позже мне сообщили, что я превысил ограничение памяти, установленное системой оценок. Однако, исключение было довольно загадочным в моем случае, и грейдер не сообщил об этой проблеме. (Он пометил меня только как неправильный.)

Я также был довольно небрежен, чтобы не понимать, что меньшие входные данные работали, и именно поэтому я получил 30/100, а не ноль баллов.

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

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