none
static array<String^>^ RRS feed

  • Вопрос

  • Мне нужна функция получающая стринг и запоминающая его в своем массиве стрингов, причем статических так чтобы при новом вызове этой функции старый массив стрингов был сохранен. Желательно чтобы размер этого статического массива стрингов обновлялся динамически.

    Подскажите пожалуйста как это сделать?

    Попытка объявления статического стринга всегда дает ошибку

    static array<String^>^ str[] = gcnew array<String^>(1);


    • Изменено tur91 29 января 2013 г. 12:32
    29 января 2013 г. 12:30

Ответы

  • Не скажете почему следует избегать?

    Хотя бы потому что с точки зрения семантики, это то же самое, что статическая переменная класса. Поэтому лучше если о ней будет известно при просмотре определения класса. 

    Остается теоретический вопрос: неужели невозможен статический стринг? Странно, инт возможен, а стринг нет.


    Ну Вам же компилятор выдал ошибку "global or static variable may not have managed type". int возможен потому что это не управляемый тип.

    • Помечено в качестве ответа tur91 31 января 2013 г. 7:45
    31 января 2013 г. 6:29

Все ответы

  • Желательно чтобы размер этого статического массива стрингов обновлялся динамически.

    Если нужна коллекция изменяющегося размера, то лучше взять List.

    • Предложено в качестве ответа YatajgaEditor 29 января 2013 г. 15:12
    29 января 2013 г. 14:09
  • static bool oldwindows(String^ img_Name)
    {
       List<String^>^ allwin = gcnew List<String^>();
       allwin->Add(img_Name);
       return true;
    }
    эта функция метод класса, при повторном ее вызове старое значение в allwin не сохраняется. Что я сделал не так?

    • Изменено tur91 29 января 2013 г. 15:22
    29 января 2013 г. 15:22
  • allwin объявлен локально в пределах функции, а должен быть объявлен в классе.

    То, что функция является членом класса вовсе не значит, что объекты, создаваемые в этой функции тоже будут членами класса.

    В итоге должно получиться нечто подобное в методе:

    static bool oldwindows(String^ img_Name)
    {
       allwin->Add(img_Name);
       return true;
    }

    Создание allwin перенесено например в конструктор:

    SomeClass()

    {

    allwin = gcnew List<String^>();

    }

    А определение поля в класс:

    SomeClass

    {

    private:

    List<String^>^ allwin;

    }


    • Предложено в качестве ответа Abolmasov Dmitry 30 января 2013 г. 11:20
    30 января 2013 г. 6:48
  • allwin объявлен локально в пределах функции, а должен быть объявлен в классе.

    А в пределах функции нельзя? Понятно, что если объявить глобальным, то будет глобальным. Вот смотрите

    static void oldwindows(String^ img_Name)
    {
      static int i;
      int j = ++i;
      List<String^>^ allwin = gcnew List<String^>();
      allwin->Add(img_Name);
      String^ temp = allwin[i-1];
    }

    При повторном вызове этой функции в i будет 1, что можно видеть по значению в j, а allwin обновится и будет пустым и temp-у ничего не присвоится, будет ошибка.

    Значит можно только int объявить static, а string нельзя?

    30 января 2013 г. 14:44
  • static внутри функции лучше вообще избегать, перенесите поле в класс, как я Вам советовал ранее.

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

    30 января 2013 г. 14:55
  • static внутри функции лучше вообще избегать

    Не скажете почему следует избегать?

    ОК, сделаю как Вы советуете. Спасибо. А бызы мне действительно очень не хватает, но нужда заставляет программу писать. Без форума сдох бы.

    Остается теоретический вопрос: неужели невозможен статический стринг? Странно, инт возможен, а стринг нет.


    • Изменено tur91 30 января 2013 г. 15:23
    30 января 2013 г. 15:22
  • Не скажете почему следует избегать?

    Хотя бы потому что с точки зрения семантики, это то же самое, что статическая переменная класса. Поэтому лучше если о ней будет известно при просмотре определения класса. 

    Остается теоретический вопрос: неужели невозможен статический стринг? Странно, инт возможен, а стринг нет.


    Ну Вам же компилятор выдал ошибку "global or static variable may not have managed type". int возможен потому что это не управляемый тип.

    • Помечено в качестве ответа tur91 31 января 2013 г. 7:45
    31 января 2013 г. 6:29
  • String^ str = "AAA";
    List<String^>^ mystr = gcnew List<String^>();
    mystr->Add(str);
    str = "BBB";
    mystr->Add(str);
    String^ temp = mystr->Item[0];

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

    String^ temp = mystr[0]; - так работает
    • Изменено tur91 4 февраля 2013 г. 16:17
    4 февраля 2013 г. 16:06
  • Пожалуйста еще вопрос: мне нужно заполнить контур на картинке

    public ref struct onecon
    {
    	List<int>^ rows;
    	List<int>^ cols;
    	onecon(): rows(gcnew List<int>()), cols(gcnew List<int>())
    	{
    	}
    };
    
    public ref class conturclass
    {
    public:
    
      static void conturfunc(void)
      {
        List<onecon^> con = gcnew List<onecon^>();
        //con->Add( как здесь положить значение в rows и cols?
      }
    };

    Т.е. вопрос как обратиться к структуре из двух листов и положить в каждый число?

    Можно и так сделать List<onecon^>^ con = gcnew List<onecon^>(); т.е. добавил ^

    4 февраля 2013 г. 20:39
  • Проблему решил так:

    public ref struct onecon { List<int>^ rows; List<int>^ cols; onecon(): rows(gcnew List<int>()), cols(gcnew List<int>()){} }; public ref class conturclass { public: static void fillcontur(onecon^ oc, int n) { for(int i=0; i<n; i++) { oc->rows->Add(i+1); oc->cols->Add(2*i); } } static void conturfunc(void) { List<onecon^>^ cons = gcnew List<onecon^>(); cons->Add(gcnew onecon()); fillcontur(cons[0], 3); cons->Add(gcnew onecon()); fillcontur(cons[1], 5); }

    }

    Может быть будут другие предложения?
    5 февраля 2013 г. 12:01