Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Нужна помощь?

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

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

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

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

Нужна помощь по массивам.

Что такое массивы и тп я в целом знаю, но поскольку на 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;
 }
 

Все верно?

 

Share this post


Link to post
Share on other sites

Recommended Posts

  • 0

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

Share this post


Link to post
Share on other sites



  • 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]; 

  

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

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

 

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

то же в цикле

 

...

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

 

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

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

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 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>;

Share this post


Link to post
Share on other sites
  • 0

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

array<string> m_Ingredients;

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

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

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

 

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

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

string  FindSection(string StringParam)

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites
  • 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

 

 

Share this post


Link to post
Share on other sites
  • 0

да

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

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

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

 

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima 

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

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

 

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

 

или

 

int a;

a = 7;

int *mas = new int[a];

 

???

 

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0
4 часа назад, BorizzK сказал:

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

Читай про OUT

Share this post


Link to post
Share on other sites
  • 0
2 минуты назад, BorizzK сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

BorizzK 

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

 

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

 

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

Share this post


Link to post
Share on other sites
  • 0
12 минуты назад, BorizzK сказал:

float *ptrarray = new float [10];

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

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

 

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

 

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

 

Share this post


Link to post
Share on other sites
  • 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];

 

Share this post


Link to post
Share on other sites
  • 0

Ну и как бы

 

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

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

и в нем нужные

 

typed_objects[i] = object;

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

 

Share this post


Link to post
Share on other sites
  • 0
7 минут назад, BorizzK сказал:

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

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

type_object.Insert(player);

 

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

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

typed_objects = object;

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

 

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

Share this post


Link to post
Share on other sites
  • 0

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

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

 

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

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

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

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

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

вот в чем дело

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

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

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

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

 

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

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

 

Вот о чем речь

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

 

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

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

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

А затем уже

typed_objects[10] = typed_objects[55];

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

 

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

 

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

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

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

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

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

обект в текст

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

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

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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?
    • By 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'
       
      До этого обновления все было норм
      Как быть?
       
       
×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.