Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок
  • Загляните на рынок

    Там вы можете продать или купить
    Всё что касается игровых серверов

Вопрос

Что такое массивы и тп я в целом знаю, но поскольку на c++ и подобном никогда не писал (только в Дейзе столкнулся), то есть некоторое непонимание некоторых принципов работы с массивами в данном случае

 

Продположим

 

обявили массив внутри функции

 

array<string> stringParam;

// определяем массив текстового типа который живет до завершения работы функции

 

или

 

static array<string> stringParam;

// определяем массив текстового типа который сохраняет в себе данные и после завершения работы функции и при следующем

вызове функции содержимое массива останется и может быть использовано внутри функции (повторного обьявления массива не произойдет)

 

string text = "text";

 

//записываем содержимое переменной text в элемент массива 0

stringParam.Insert(text);

//записываем содержимое переменной text  в элемент массива 1, если переменная text пуста в элемент запишется текст NULL

stringParam.Insert(text, "NULL");

 

читаем в переменную text элемент массива 1

string text = stringParam.Get(1);

 

А вот теперь вопрос

Как мне изменить эелемент 1 массива?

stringParam[1] = "блаблабла";

 

так?

в теории должно быть так

 

Это вообще возможно?

 

И еще про функцию возвращающую результат в качестве массива

 

 array<string> FileRead(string FileName)
 {
  array<string> stringParam;
  string line_content;
   

.....


  CloseFile(File);
  return stringParam;
 }
 

Все верно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

Забронировать это рекламное место


  • 0

123new 

Мне более важно понять, каким образом изменять конкретный элемент массива

Динамических массивов судя по всему тут нет как в c++

типа array<string> m_Ingredients = new array<string>[100];

и потом можно писать сразу в любой элемент

 

array<string> m_Ingredients;

заполнили массив скажем 10 элементами

и нам надо изменить 5й

m_Ingredients[5] = "5th element";

 

вроде нашел в RecipeBase.c пример по теме

ref array<string> m_Ingredients[MAX_NUMBER_OF_INGREDIENTS];

 

и там же ниже в цикле

m_Ingredients[i] = new array<string>; 

 

array<string> tempArray = m_Ingredients[i]; 

  

только вот не совсем понятно

выходит  элемент массива так же становится массивом

 

и ниже ситуация меня совсем запутала

то же в цикле

 

...

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK удалить старый и добавить новый элемент в массив. Ну если он одномерный.

Если он в 2 колонки, название элемента и значение, то по названию можно менять.

 

Ну или да, как и сказал ты выше, вот так

array<string> m_Ingredients; 
  
  m_Ingredients.Insert("00");
  m_Ingredients.Insert("11");
  m_Ingredients.Insert("22");
  
  m_Ingredients.[2] = "00";

что-то типа такого должно работать по идее

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
54 минуты назад, BorizzK сказал:

Динамических массивов судя по всему тут нет как в c++

типа array<string> m_Ingredients = new array<string>[100];

Во 1. Это статический массив. т.к. указана размерность.

Во 2. Если ты и далее будешь имена так давать "

3 часа назад, BorizzK сказал:

stringParam

то далеко не уедешь, как и с ini

В 3.

 

56 минут назад, BorizzK сказал:

 

array<string> m_Ingredients;

заполнили массив скажем 10 элементами

и нам надо изменить 5й

m_Ingredients[5] = "5th element";

А создавать перед добавлением не надо?

array<string> m_Ingredients = new array<string>;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima 
Вот тут разжуй про обьявлять и создавать

array<string> m_Ingredients;

Обьявили массив

Он разве е создан?

Я логику хочу понять

 

Про имена переменных

stringParam - этор входная переменная функции

string  FindSection(string StringParam)

мне так привычней и удобней

 

про динамический массив

 

 float *ptrarray = new float [10];  - это создание какого массива в C++ ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Только что, BorizzK сказал:

Я логику хочу понять

Какую?

Если ты переменную создаешь - ОБЪЯВЛЯЕШЬ, как в любом нормальном языке программирования - дельфи\си

var

MyVar: String;

 

или

 

string MyVar;

 

Ты что сразу можешь получить ее значение?

Ну попробуй...

 

Есть объявление.

И есть - ИНИЦИАЛИЗАЦИЯ.

string MyVar;//Объявление

MyVar = "...";//Инициализация

В С допустимо сразу инициализировать

string MyVar = "...";

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

 

4 минуты назад, BorizzK сказал:

new float [10];  - это создание какого массива в C++ ?

Как и в любом другом языке - СТАТИЧНОГО. - имеющего статичные 10 элементов.

 

*Технически и в С и в Дельфи(хз как там в других языках), при объявлении переменной, она может быть и инициализирована(т.е.какое то значение может и быть), а может там будет "МУСОР".

т.е. при таком написании

string MyVar;

Print(MyVar);

ты можешь получить и ошибку т.к. NULL а можешь вообще хз что, т.к. в памяти которую заняла MyVar мог остаться "мусор".

 

И последнее

Param - имя которое используется в движке энфорса. А ты опять со своими задвигами.

 

По негласному стандарту, твоя переменная именуется так -

array<string> strings;

Ну или если тебе надо как тип ее создать typedef, то TStrings

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

да

и про именование переменных

поскольку я пишу функцию применимую не только для поиска секций в ini, но и вообще для поиска какого-то текста в файле и последующего

чтения остального текста после найденного, до другого определенного текста (нашли секцию, читаем все строки после нее, как дошли до другой секции прерываем операции), то и название переменной не привязываю к задаче

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima 

про динамический массив

А почему тогда в книгах

 

float *ptrarray = new float [10]; // создание динамического массива вещественных чисел на десять элементов

 

или

 

int a;

a = 7;

int *mas = new int[a];

 

???

 

 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 минуты назад, BorizzK сказал:

А почему тогда в книгах

У тебя книга бракованная. сделай скрин с нее, чтобы мы аффтара знали.

Динамика и есть динамика - когда размер не определен заранее, и может быть любым.

А это статика. - Фиксированная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK 

"Строго говоря, такой массив не реализован в языке C++. Есть некоторая его замена, обладающая рядом функций динамического массива."

 

"Благодаря такой конструкции можно инициализировать массив любого размера, но изменять размер выделенной на него памяти в ходе работы невозможно. Можно только полностью освободить занимаемое массивом место. Это делается с помощью функции delete. Для нашего примера это выглядит так"

 

Выкинь это. Нет там никакой динамики. Статика это. т.к. размерность задана.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
7 минут назад, BorizzK сказал:

Где читать?

http://www.realcoding.net/article/view/142

Тут можешь прочесть. Для энфорса подойдет. Синтаксис только поменяешь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima 

и в то же время

http://sitev.ru/post/151

 

вобщем я с тобой согласен более чем поностью

 

чего только не напишут  в интернетах )))

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
12 минуты назад, BorizzK сказал:

float *ptrarray = new float [10];

Тут весь косяк заключен в том, что ты как БЭ можешь управлять размерностью, НО только один раз))))) А это уже статика)

А если надо потом изменить размерность, то - удаляйте батенька массив)

 

Так что, там написано по сути и верно и не верно. Как яйца не крути - статика.

 

А динамика, это когда в ходе работы, ты можешь изменять размерность.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima 

1 минуту назад, NoNameUltima сказал:

http://www.realcoding.net/article/view/142

Тут можешь прочесть. Для энфорса подойдет. Синтаксис только поменяешь.

так там вообще массив массивов можно создать, где каждый элемент массива будет так же массива, в sqf такое было

в энфорсе такого нет вроде

 

мне вот это интересно очень

 

в RecipeBase.c

ref array<string> m_Ingredients[MAX_NUMBER_OF_INGREDIENTS];

 

и там же ниже в цикле

m_Ingredients[i] = new array<string>;

 

и в другом ниже

array<string> tempArray = m_Ingredients[i];

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ну и как бы

 

array<Object> typed_objects = new array<Object>;
  

затем в цикле отбираем обьекты

и в нем нужные

 

typed_objects[i] = object;

и это сразу кладет сервер

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
7 минут назад, BorizzK сказал:

array<Object> typed_objects = new array<Object>;

Ну а ниже попробуй

type_object.Insert(player);

 

а то что ты делаешь неправильно

8 минут назад, BorizzK сказал:

typed_objects = object;

Это ж динамика. Кол-во элементов не задано, и память под какой то мифический i элемент не выделена.

 

Команда Insert добавляет элемент в массив, предварительно выделяя под него память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ну и player в Object прокасть...

Или попробуй на простых данных...

 

array<string> strings = new array<string>;

strings.Insert("Привет");

strings.Insert("Пока");

Print(string.Format("Длина массива strings: %1. Элемент 0 имеет значение: %2", strings.Count(), strings[0]));

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima Это все понятно

Мне нужно изменять элементы заполненного массива

вот в чем дело

сильно бы упростило жизнь

те есть массив со 100 элементами типа object - и это не игроки вовсе

мне надо на место елемента 10 поместить элемент 55 предварительно грухнув обьект из 10го эелемента

те сделать так

 

GetGame().ObjectDelete(typed_objects.Get(10));

typed_objects[10] = typed_objects.Get(55);

 

Вот о чем речь

Вот что мне нужно

 

но походу не судьба

сервер крашится

 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK А ты уверен чтодлина массива уже 55 элементов?

Выведи принтом - сколько элементов в массиве, и что в элементе 55.

А затем уже

typed_objects[10] = typed_objects[55];

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima Уверен
В массиве на тот момент их уже 64

Мне надо его пересортировать

Именно обьекты в нем

да и если я заменяю эелемент другим обьектом

typed_objects[10] = m_object; - m_object это обьект найденный на карте, то так же краш

 

кроме того делается это в цикле по счетчику typed_objects.Count() и выйти за размер ну никак не получится

 

кажись доперло

имхо - это потому как в каждом данном случае (тип то Object) мы не с элементом массива работаем, а с обьектом - те каждый эелемент ссылка на обьект

и пытаясь присвоить значение эелементу, мы на самом деле с обьектом работаем, что и вызывает краш сервера

ща доеду до дома попробую другой вариант

типа как делали в sqf

обект в текст

затем в массив текстовый

и потом уже с ним как с текстом раюботать...

 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить на вопрос...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: fedotovyasha
      в messages есть такая возможность
      <messages> <!-- This is example message for automatic server termination --> <message> <!-- no delay --> <delay>0</delay> <!-- if the value is larger than 0, then flag Repeat is enabled --> <repeat>0</repeat> <!-- if the value is larger than 0, then flag Countdown is enabled, countdown reaches zero in 10 hours --> <deadline>600</deadline> <!-- disable On connect flag --> <onConnect>0</onConnect> <!-- enable Shutdown flag --> <shutdown>1</shutdown> <!-- message itself with placeholders --> <text>Hello, #name will shutdown in #tmin minutes.</text> </message> </messages> Что лучше и эффективнее будет. Писать свой рестартер с помощью Rcon или будет достаточно messages.xml?
    • Автор: BorizzK
      Есть класс
       
      class LogClass { private FileHandle File; void LogClass() { Print("::: [LogClass] ::: Init :::"); } void ~LogClass() { Print("::: [LogClass] ::: UnInit :::"); } void Save(string FileName, string String) { private int year, month, day, hour, minute, second; Print("::: [LogClass]: Save: " + FileName); if (!FileExist(FileName)) { File = OpenFile(FileName,FileMode.WRITE); } else { File = OpenFile(FileName, FileMode.APPEND); } if ( File == 0 ) { Print("::: [LogClass]: Can not write FileName: " + FileName); Print("::: [LogClass]: May be disk error, file write protected, file busy or FileMode.WRITE disabled (need to specify option -scrAllowFileWrite in server run parameters for enable FileMode.WRITE."); return; } FPrintln(File, DataBase_GetDate() + "," + DataBase_GetTime() + " : " + String); CloseFile(File); } void Rotate(string FileName, int FileNum) { Print("::: [LogClass]: Rotate: " + FileName); if (!FileExist(FileName)) { Print("::: [LogClass]: Rotate: FileName not exists: " + FileName); return; } else { for ( int i = FileNum; i > 0; i-- ) { Print("::: [LogClass]: Rotate: FileName: " + FileName + "." + i); if (FileExist(FileName + "." + i)) { Print("::: [LogClass]: Rotate: DeleteFile: " + FileName + "." + i); DeleteFile(FileName + "." + i); } if (FileExist(FileName + "." + (i - 1))) { Print("::: [LogClass]: Rotate: CopyFile: " + FileName + "." + (i - 1) + " => " + FileName + "." + i); CopyFile(FileName + "." + (i - 1), FileName + "." + i); } } CopyFile(FileName, FileName + ".0"); DeleteFile(FileName); } } static string DataBase_GetDate() { int year, month, day; GetYearMonthDay(year, month, day); string date = day.ToStringLen(2) + "." + month.ToStringLen(2) + "." + year.ToStringLen(2); return date; } static string DataBase_GetTime() { int hour, minute, second; GetHourMinuteSecond(hour, minute, second); string time = hour.ToStringLen(2) + ":" + minute.ToStringLen(2) + ":" + second.ToStringLen(2); return time; } } Мне нужно им пользоваться функциями из него в нескольких местах
      в PlayerBase.c в функциях в классе PlayerBase
      в init.c в функция в классе миссии
      Вопрос как?
       
      В PlayerBase.c
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\LogClass\\LogClass.c"
      Далее в классе
      ref LogClass Log = new LogClass();
      ну и в функциях
      Log.Save{"путь-имя", данные);
       
      Но после последнего обновления 0.63.149.525
      В init.c
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\LogClass\\LogClass.c"
      приводит к ошибке - Multiple declaration of class "LogClass"
       
      Can't compile mission init script'!
      $CurrentDir://mpmissions//dayzOffline.chernarusplus//_MOD//LogClass//LogClass.c(1): Multiple declaration of class 'LogClass'
       
      До этого обновления все было норм
      Как быть?
       
       
×
×
  • Создать...