У меня есть ряд объектов, из которых я могу собрать данные. Точное число неизвестно и может измениться во время выполнения. На объекты ссылаются по имени, и хотя имена также неизвестны, они следуют соглашению об именах, поэтому их можно вычислить. Для аппроксимации я ввел пять переменных, соответствующих шаблону именования, и присвоил им значения. Затем я использовал цикл while для увеличения отдельной переменной и подсчета количества найденных переменных. Все, что мне нужно знать, это можно ли использовать цикл while, чтобы найти, где заканчиваются имена.
Код: Выделить всё
int i = 0;
// These represent external sources (objects). How many there are is unknown
// but they follow this naming convention.
int ex1 = 1;
int ex2 = 2;
int ex3 = 3;
int ex5 = 4; // This is to test the script’s limits; should fail and return ‘3’
int ex6 = 5; // Next test is rename this “ex4” and rerun the script. Should count all 5
// The purpose of this function is
// to count how many sources there are.
while("ex"+(i+1)){
i++;
}
Console.WriteLine(i);
Да, кроме того, большая часть моего опыта работы с C исходит от Arduino и PHP с небольшим количеством BASH, разбросанного здесь и там.
[Редактировать]
Думаю, я понял путаницу в сообщении. Переменные в коде («ex1» — «ex6») заменяют отдельные источники данных. Имена переменных заменяют имена источников. На первый взгляд использование массивов звучит хорошо, но проблема с массивами заключается в том, что они имеют определенный размер во время компиляции и выполнения, а ключи постоянно нумеруются, независимо от того, какие манипуляции с данными вы выполняете. Там, где идет этот код, количество источников данных может измениться в любой момент в любую сторону, и новые источники данных уже будут пронумерованы при подключении (количество всегда увеличивается с каждым новым вложением). Я собираюсь манипулировать переменными в скрипте таким образом, чтобы имитировать то, что происходит в игре. Моя общая идея состоит в том, что я могу разобраться с логикой, пока я вдали от дома, а затем вернуться и модифицировать ее в игре, когда буду дома. Версия игры, которая у меня сейчас есть, приведена ниже.
Код: Выделить всё
Runtime.UpdateFrequency = UpdateFrequency.Update10;
}
public void Main(){
IMyBatteryBlock battery;
float charge; // Current charge level
float totchrg = 0; // Total combined charge
float max; // Capacity
float totmax = 0; // Total capacity
float lvl; // Charge level (as a percentage)
float totlvl; // Overall charge level (as a percentage)
int cnt = 0;
while(GridTerminalSystem.GetBlockWithName(“Battery “+(cnt+1)) as ImyBatteryBlock){
battery = GridTerminalSystem.GetBlockWithName("Battery “+(cnt+1)) as ImyBatteryBlock;
charge = battery.CurrentStoredPower;
totchrg = totchrg + charge;
max = battery.MaxStoredPower;
totmax = totmax + max;
lvl = 100 * (charge / max);
Echo(lvl.ToString("0.00"));
}
totlvl = 100 * (totchrg/totmax);
Echo(cnt.ToString("0")+" batteries found with a charge of "+totlvl.ToString("0.00")+" percent.");
}
Я наконец-то вернулся домой после работы в двойную смену, в которую меня заставили, и наконец смог что-то делать в игре. Код не выполнен. После некоторого редактирования и попыток я сдался и начал исследовать что-то еще. Так я обнаружил, что в игре уже есть функция, которая делает то, что мне нужно (что-то похожее на то, что Понтус сказал в комментариях), так что все это в любом случае оказалось бесполезным экспериментом.
Подробнее здесь: https://stackoverflow.com/questions/797 ... p-existing
Мобильная версия