Czym zastąpić zmienną globalna typu String^ ?

0

Witam,

Problem jest następujący, piszę program (VS2008 CLR), który pobiera sobie parametry linii komend (program.exe test1 test2) no i mam te parametry w funkcji main w tablicy array<System::String > args i teraz moje studenckie pytanie do Was w jaki sposób "wyciągnąć" tą tablicę chociażby do procedury System:: Void Form1_Load(...) ? Najprościej byłoby stworzyć globalną tablicę String^ i tam wpisać te parametry ale jak wiadomo kompilator mi na to nie pozwoli. Jak zatem inaczej rozwiązać ten problem?

--
Z góry dzięki za pomoc :)
TB

0

Przekaż je do konstruktora głównej formy.
Konstruktor zapisze sobie to do składowych.
Load() wyciągnie ze składowych.

0
_13th_Dragon napisał(a)

Przekaż je do konstruktora głównej formy.
Konstruktor zapisze sobie to do składowych.
Load() wyciągnie ze składowych.

W którym miejscu ? Gdziekolwiek bym nie wpisał array<System::String > a; to w najlepszym układzie tablicę tą widzi Load() ale nie widzi int main (...).

0

rozwiązanie 1 ładne (tablica jako pole statyczne klasy (może być formy))

using namespace System;

ref struct Statyczna abstract sealed
{
  static array<String^> ^args;
};

void foobar()
{
  Console::WriteLine(Statyczna::args->Length);
  for each (String ^param in Statyczna::args)
    Console::WriteLine(param);
}

int main(array<String^> ^args)
{
  Statyczna::args = args;
  foobar();
}

rozwiązanie 2 brzydkie (tablica jako zmienna globalna przy wykorzystaniu gcroot)

#include <msclr\gcroot.h>

using namespace System;
using namespace msclr;

gcroot<array<String^>^> globalna;

void foobar()
{
  Console::WriteLine(globalna->Length);    // wiele operacji zadziała od razu...
  for each (String ^param in static_cast<array<String^>^>(globalna))     // ...ale foreach niestety wymaga rzutowania
    Console::WriteLine(param);
}

int main(array<String^> ^args)
{
  globalna = args;
  foobar();
}

rozwiązanie 3 ładne (metoda Main() na wzór C#, z funkcją main() będącą tylko przekierowaniem)

using namespace System;

ref class Program
{
  public: static int Main(array<String^> ^args)
  {
    Console::WriteLine(args->Length);
    for each (String ^param in args)
      Console::WriteLine(param);
    return 0;
  }
};

int main(array<String^> ^args)
{
  return Program::Main(args);
}

albo jak _13th_Dragon powiedział, parametr konstruktora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1