for m := 0 to 300 do
if Pos(certain_String, string(arrayitem(m)) <> 0 then
begin
randomize;
x := random(100);
begin
case x of
0..69 : function(m); // 70 percent
70..79 : function(m+1); // 10 percent
80..84 : function(m+2); // 5 percent
85..88 : function(m+3); // 5 percent
89..91 : function(m+4); // 2 percent
92..94 : function(m+5); // 3 percent
95..97 : function(m+6); // 3 percent
98..98 : function(m+7); // 1 percent
99..99 : function(m+8); // 1 percent
end;
m := 300;
end;
Пытаясь заставить эту штуку проходить через довольно большой массив, но если она находит в нем определенную строку, полностью останавливается и переходит к следующему, пришлось извлечь некоторые проприетарные имена функций, но m: = 300; кажется, проблема, мне не нравится, когда я присваиваю m значение в середине цикла for. Извините за недостаток знаний, мне на колени упал наполовину готовый паскальский проект, и я даже не видел его раньше.





Должен быть эквивалент break языка C в Object Pascal. Это более чистый способ выйти из петли.
break завершает цикл, continue переходит к следующему циклу цикла, exit оставляет функцию или метод.
Немного изменил код:
randomize;
for m := 0 to 300 do begin
if Pos(certain_String, string(arrayitem(m)) <> 0 then begin
x := random(100);
case x of
0..69 : function(m); // 70 percent
70..79 : function(m+1); // 10 percent
80..84 : function(m+2); // 5 percent
85..88 : function(m+3); // 5 percent
89..91 : function(m+4); // 2 percent
92..94 : function(m+5); // 3 percent
95..97 : function(m+6); // 3 percent
98 : function(m+7); // 1 percent
99 : function(m+8); // 1 percent
end;
break;
end;
end;
Сделаем свое дело.
Randomize не следует вызывать в каждом цикле.
А зачем струнный заброс?
Я предполагаю, что вы знаете, что функция - это зарезервированное слово, которое нельзя использовать в качестве идентификатора функции.
"не нужно называть каждый" -> "не называть каждый"
Ваш английский в порядке; просто указывая, что ваше предложение на самом деле требование.
Пример с циклом while:
m := 0;
while m<=300 do begin
if condition do begin
// Do something
m := 300; // Will be 301 at end of loop.
end;
Inc(m);
end;
Помимо других проблем, способ завершить цикл for - это Перерыв. Просто замените m: = 300; на Перерыв;, и он будет делать то, что вы хотите.
Кроме того, вызов randomize более одного раза - плохая идея, но вы знаете это теперь, поскольку это было упомянуто в ответ, который вы приняли вчера для этой проблемы.
Вы не можете ничего присвоить переменной цикла for. Если вы хотите сделать это, используйте вместо этого цикл while.