in

mscommunity.net

Interactive mscommunity.net online activities

Zvonimir Vanjak

  • Visual Studio 2008 - bug u STL/CLR implementaciji

    Ccccc ...

    Microsoftu je trebalo nekoliko godina da napravi port STLa (Standard  Template Library) da se može koristiti i na .NET platformi i onda naprave ovako traljavi release !!!

     

    Za neupućene, kratka rekapitulacija. Dakle, STL http://en.wikipedia.org/wiki/Standard_Template_Library je biblioteka za programski jezik C++ u kojoj se nalaze implementacije mnooooogobrojnih izrazito korisnih struktura podataka (što bi rekli – „kolekcija“ iliti containera – vector, list, map, set, hash, queue, stack) i algoritama za operiranje nad njima.

     

    Prije nešto više od destak godina, kad sam se prvi put upoznao s STLom, to je bilo vauuuu :-))))). Dinamičke i strogo tipizirane strukture podataka, s ugrađenim efikasnim algoritmima – što je više mogao poželjeti C/C++ programer !?

     

    Klasični ArrayList iz .NET-a je u usporedbi s time bio čisti smijeh ...

     

    Nažalost (u stvari na sreću ;-), .NET je imao „poneku“ :-) drugu prednost pred native C++om tako da je danas broj developera na .NET razvojnom okruženju vjerojatno puno veći od broja developera koji koriste C++. Treba priznati i da se situacija značajno popravila s uvođenjem genericsa u C# 2.0 i ugrađivanjem tipiziranih kolekcija podataka pa je ArrayList (ne koristite ga više, je'l da ;-) zamijenjen s List<T> i onda se dalo nekako živjeti bez STL-a.

     

    Stoga, kad sam vidio da je STL/NET konačno postao dio Visual Studio 2008 okruženja, nisam mogao dočekati da ga malo okušam.


    Pa sam lijepo kreirao novi Visual C++ projekt (tab CLR pa CLR Console Application) i ukucao najtrivijalniji mogući primjer:

     

    #include "stdafx.h"
    #include
    <cliext/vector>

     

    using namespace System;

     

    int main(array<System::String ^> ^args)
    {
      cliext
    ::vector<wchar_t> c1;

     

      c1.push_back(L'a');
      c1.push_back(L'b');
      c1.push_back(L'c');

     

      for each (wchar_t elem in c1)
       
    System::Console::Write(" {0}", elem);

     

     return 0;

    }

     

    Pravi C++ gurui će ovdje odmah graknuti da „kakav for each“, da nema toga u STLu i gdje su const_iterator, begin i end ? OK, može i tako, ali for each je idiom koji je u .NET svijetu bread-and-butter i ruku na srce, ima puno manje kucati :-)))) I mislim da je sasvim zgodno da su implementatori STL/CLRa omogućili korištenje tog idioma sa STL/NET kolekcijama. Uostalom, to je ionako syntactic sugar ...

     

    Ostalo je manje više jasno. Treba uključiti header cliext/vector da bi kompajler imao potrebne deklaracije (nešto ala „Add reference“ za C# programere), push_back je „klasičan“ način za dodavanje elementa na kraj kolekcije (Add za C#ovce) i tu bi sve trebalo biti jasno.

     

    F7 i ...

     

    1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\cliext/xutility(9) : fatal error C1107: could not find assembly 'Microsoft.VisualC.STLCLR.dll': please specify the assembly search path using /AI or by setting the LIBPATH environment variable

     

    Neba ti nebeskog ... ???

     

    Što je sad ?

     

    Otvaranjem xutility headera (.h nastavak za headere standardnih biblioteka je „izgubljen“ u zadnjoj inkarnaciji C++ standarda) i odlaskom na liniju 9 se nađe „uzrok“ pogreške i tamo piše:

     

    #using <Microsoft.VisualC.STLCLR.dll>

     

    U redu, jer TO JE TOČNO NO ŠTO BI TREBALO PISATI !!!???

     

    Dotični dll-u je library u kojem je duša STL/CLR i #using direktiva je nužna kao pointer kompajleru. Taj dll se fizički nalazi u C:\Program Files\Microsoft Visual Studio 9.0\VC\lib direktoriju, gdje se nalaze i mnogobrojne druge biblioteke za Visual C++ kompajler, i referenciran je kroz Libraries setting.

     

    Dakle, kompajler bi ga morao vidjeti !!!

     

    A on kaže da ga nema ?

     

    Pokušao sam nekoliko trikova (npr. staviti ga ručno u referencirane biblioteke za projekt) ali nije mi baš išlo :-(. Ipak, na kraju sam našao spasonosno rješenje.

     

    U xutility headeru sam dotičnu liniju promijenio u:

     

    #using "C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\Microsoft.VisualC.STLCLR.dll"

     

    I sve je proradilo kako treba ... Prijavio sam bug Microsoftu, i sad se na miru mogu (možete) poigrati sa STL/CLRom ...

  • Pozdrav svima :-)

    Hello everybody. And, as they say, better late than never ;-)

    My name is Zvonimir Vanjak and I work as an assistant at Faculty of Electrical Engineering and Computing in Zagreb, teaching courses Programming, Algorithms and Data Structures, Object-Oriented Programming and Operational Research (yeah, that's a lot of stuff, I know ;-). I like to think of myself as a "C++ guy" (15 years of experience is hard to "wear off") but, alas, in last few years most of the money has been coming from C# Department ;-). Which is JUST FINE, since .NET is absolutely fantastic development platform (and there is always C++/CLI ;-).

    I'm primarily interested in development of desktop-based (client-server) solutions and keywords that make me tick are: domain-driven design, test-driven development and agile development. I'm very excited about ADO vNext Entity Framework and it's promise to bridge object-relational divide. And if recent efforts in implementing Model-View-Controller framework on top of ASP.NET succeed (as they undoubtfully will ;-), I will consider some serious web development also ...

    I think this is enough for introduction.

    Živili :-))

    Zvone 

Powered by Community Server (Commercial Edition), by Telligent Systems