У меня есть ряд объектов, из которых я могу собрать данные. Точное число неизвестно и может измениться во время выполнения. На объекты ссылаются по имени, и хотя имена также неизвестны, они следуют соглашению об именах, поэтому их можно вычислить. Для аппроксимации я ввел пять переменных, соответствующих шаблону именования, и присвоил им значения. Затем я использовал цикл 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, разбросанного здесь и там.
[Редактировать]
Я не знаю, что сайт имеет в виду, когда говорит, что тема требует большей ясности. Я думал, что это довольно просто: я пишу сценарий для игры, но застрял на работе и не могу опробовать код, поэтому я попытался написать приближение того, что я хочу в игре, но приближение не работает, не запускается и не возвращает ошибку (или, по крайней мере, интерпретатор, который я использовал, этого не сделал). Но если потребуется более подробная информация, я дам все, что смогу.
Ниже приведен весь фрагмент кода, написанный для игры и который можно напрямую скопировать/вставить из этого самого поста, который я пытаюсь аппроксимировать. В игре используется ограниченная копия C# версии 6 (в целях безопасности ограничено количество доступных функций).
Код: Выделить всё
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;
cnt = cnt + 1;
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"));
}
Кто-то предложил мне использовать массивы. Как мне сделать недействительными ключи массива? Типа, приближение, которое я выложил? Как массив может иметь действительные индексы 1-3 и 5 и 6, в то время как индекс 4 сам по себе не является допустимым индексом? Это очень важно из-за того, как работает игра (если вы вставляете батарею, игра считает ее дополнительной батареей. Если вы удалите ее, она все равно будет учитываться, и новая батарея будет учитываться как добавление, а не замена, поэтому внутренний счетчик игры может легко сбиться с толку, если вы будете много переставлять).
Как кто-то другой предложил, я думаю, я мог бы использовать словарный подход и определить, я не знаю, 15 разных имен для проверки? Позже я захочу изменить сценарий, чтобы получить доступ к чему-то, что, как я знаю, будет много (места для хранения).
Подробнее здесь: https://stackoverflow.com/questions/797 ... generation
Мобильная версия