konto usunięte

Temat: Ciekawa zagadka

Zagadka może niezbyt praktyczna, bo wymaga pewnego haka w debuggerze, ale zmusza do myślenia. Oto kod:
using System;
using System.Threading.Tasks;
static class Program {
static void Main(string[] args) {
if(0==DateTime.Now.Second%2) {
int n = Environment.ProcessorCount;
Parallel.For(0,n,i => Console.WriteLine("Watek {0:d} z {1:d}",1+i,n));
}
}
}

I graficzna instrukcja co należy zrobić: chodzi o to, że zakładamy breakpointa w punkcie 1, odpalamy F5 i po trafieniu w breakpointa przeciągamy aktualne wywołanie - ta strzałka po lewej - do punktu 2 (to jest ten nietypowy hack) i dalej robimy F5/continue. Treść zagadki: skąd się tutaj jakiś NULL bierze? Jedyna zmienna to int który jest value type no i jako zmienna lokalna siedzi nie na stercie ale na stosie gdzie nulli nie ma.

Obrazek

Aha, jedyną nagrodą za rozwiązanie to wyłącznie satysfakcja.

konto usunięte

Temat: Ciekawa zagadka

Odpowiedź kompletnie z czapki:

Boksowanie - Int niejawnie w metodzie zostanie zboksowany do typu ref oraz w efekcie dostanie nulla?

W momencie w którym wywołanie jest przeciąganie operacja odpalania jest na kilku wątkach, więc typ wyliczalny który jest value type zostaje konwertowany do wartości ref aby dało się jego referencję używać w kilku wątkach, gdy wszystko się skończy albo GC albo sam framework zajmuje się nullowaniem tej zmiennej.

Nie sprawdzałem tego, tak mówi mi intuicja :-)

edit: Czy mogę tu umieścić też swoją zagadkę, z którą walczyłem jakiś czas temu? :-)Bartosz Adamczewski edytował(a) ten post dnia 22.04.11 o godzinie 09:16

konto usunięte

Temat: Ciekawa zagadka

Zmienne opakowywane są w automatycznie generowane klasy w przypadku gdy przekazywane i używane są w Action czy Func.

Tu n jest wykorzystywane w środku Parallel.For tak więc będzie opakowane w dynamicznie utworzoną klasę, która posiada pole typu int.

Zmieniając aktualnie wykonywaną instrukcję omijamy kod, który tworzy ten obiekt i dlatego pojawia nam się null reference.

Edit: Bartosz...wrzucaj :)Paweł Łukasik edytował(a) ten post dnia 22.04.11 o godzinie 09:26

konto usunięte

Temat: Ciekawa zagadka

Proszę się powstrzymać od poszukiwania odp w internecie :-).

Ciężko powiedzieć że jest to zagadka ale problem jest ciekawy a rozwiązanie jeszcze ciekawsze, może komuś się to przyda.

Problem pojawił się w momencie gdy tworzyłem framework do testów który wykorzystuje delegaty.


public class CSpecTestRunnerSpec : CSpecFacade<CSpecTestRunner>
{
public CSpecTestRunnerSpec()
: base(new CSpecTestRunner())
{
CreateOperations();
}

private MyClassSpec myClassSpec;
private DescribeAll run_on_type;

protected override void BeforeOperation()
{
myClassSpec = new MyClassSpec();
}

private void CreateOperations()
{
run_on_type =
(@it, @do) =>
{
@it("Runs all of the operations contained in a type");
@do.RunTestOnType(myClassSpec.GetType());
};
}
}


Najważniejszy w tym wypadku jest delegat DescibeAll, który dany jest następującym interfejsem oraz pochodzi z klasy bazowej:

public delegate void DescribeAll(Action<string> description, TClass objSpec);


Gdy kompilujemy kod dostajemy wyjątek: "Delegate Action does not take 1 arguments" ale jak widać z kodu taki delegat istnieje i istotnie przyjmuje dokładnie 1 argument.

Co jest problemem? i jak rozwiązać ten problem? :-)

konto usunięte

Temat: Ciekawa zagadka

Coś chyba jest na rzeczy w kodzie, którego nie pokazałeś. Przekljenie tego do VS i uzupełnienie z automatu R# powoduje, że kod się kompiluje :)

konto usunięte

Temat: Ciekawa zagadka

Paweł Łukasik:
Coś chyba jest na rzeczy w kodzie, którego nie pokazałeś. Przekljenie tego do VS i uzupełnienie z automatu R# powoduje, że kod się kompiluje :)

Raczej wszystko jest ok, właśnie sprawdziłem ten kod i u mnie się on nie kompiluje :-).

Problem opisany jest tutaj.

konto usunięte

Temat: Ciekawa zagadka

A u mnie się kompiluje bez zająknięcia. Przekleiłem to co dałeś + wygenerowałem brakujące rzeczy za pomocą R#.

Jeśli masz gdzieś podeślij pełny projekt, który się nie buduje. Jestem ciekaw co jest inaczej w stosunku do tego co mam.

konto usunięte

Temat: Ciekawa zagadka

Kod jest Tutaj

Więcej informacji jest w sekcji Atention :-)

Oto gdzie szukać problemu: \src\CSpec.CSpecTest\Test.Spec\CSpecTestRunnerSpec.cs

Podobne tematy


Następna dyskusja:

Zagadka




Wyślij zaproszenie do