Небольшая помощь с циклом delphi

 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. Извините за недостаток знаний, мне на колени упал наполовину готовый паскальский проект, и я даже не видел его раньше.

Вы не можете ничего присвоить переменной цикла for. Если вы хотите сделать это, используйте вместо этого цикл while.

Toon Krijthe 17.12.2008 00:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
496
4

Ответы 4

Должен быть эквивалент break языка C в Object Pascal. Это более чистый способ выйти из петли.

break завершает цикл, continue переходит к следующему циклу цикла, exit оставляет функцию или метод.

Toon Krijthe 17.12.2008 00:49

Немного изменил код:

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 не следует вызывать в каждом цикле.

А зачем струнный заброс?

Я предполагаю, что вы знаете, что функция - это зарезервированное слово, которое нельзя использовать в качестве идентификатора функции.

Toon Krijthe 17.12.2008 00:44

"не нужно называть каждый" -> "не называть каждый"

Craig Stuntz 17.12.2008 00:44

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

Craig Stuntz 17.12.2008 01:25

Пример с циклом 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 более одного раза - плохая идея, но вы знаете это теперь, поскольку это было упомянуто в ответ, который вы приняли вчера для этой проблемы.

Другие вопросы по теме