Задать вопрос
  • Почему программа не может внести изменения в файл hosts.sys?

    @kalapanga
    alinaparamonova1, убедитесь, что в программе ничего не перепутали. Из других возможных причин, ещё у антивирусников вроде такая опция бывает - защищать hosts от изменений. Сторонний антивирус не установлен?
  • Компьютер зависает при просмотре видео, фото. Как исправить?

    @kalapanga
    advancesss, думаю, Вы прекрасно поняли, что я имею ввиду. Одно дело производство комплектующих в Китае известными фирмами. Другое дело покупка неизвестно чего неизвестно у кого. С какой помойки Вам этот процессор продали? И у материнки небось качество как у всего китайского ширпотреба. Какое получится.
    Я же написал - лотерея. Вы сэкономили, сыграли в лотерею, проиграли. Кому-то везёт больше.
  • Оболочка под PowerPoint?

    @kalapanga
    Вам бы с такими вопросами на фриланс куда-нибудь... Вы на учениках деньги зарабатываете, а за советами на бесплатный ресурс пришли - ловко!
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Нюанс этот с интерфейсом я заметил и даже вроде написать об этом хотел, но мы на него (интерфейс) особо внимания не обращали - так и забыл.
    Нужно как следует подумать, что Вы хотите достигнуть. По-моему, "клик в секунду" тут совсем ни при чём.
    Мне кажется, здесь нужно сделать, чтобы если запущен расчёт, то новый запускать нельзя и всё. А реализуется просто изменением Enabled нужных контролов. Грубо говоря, в процедуре обработки нажатия кнопки "Начать расчёт" первое действие должно быть установка у этой самой кнопки Enabled := False. А в True оно возвращается в обработчике нажатия кнопки "Стоп". Я примерно пишу, уже не помню точно весь Ваш интерфейс. Я бы что-то такое сделал.
  • Почему система требует большой размер файла подкачки?

    @kalapanga
    nApoBo3, c hiberfil.sys не путаете?
    Антон, сами по себе 32 GB оперативы ни к чему систему не обязывают. У меня тоже 32, при этом вот сейчас файл подкачки всего 5 гигов. Значит у Вас кому-то надо было больше.
  • Если в трансформаторе просверлить отверстие в сердечнике, получится соленоид?

    @kalapanga
    aspirantes, Я же написал - считать надо!
    А Ваш подход похож на следующее. Нужно решить сложное уравнение. Но я не буду. Пусть решением будет число 5! Вдруг подходит! Вероятность не нулевая! :)
    Но хотя бы уж тогда Бобби Шифер послушайте - вместо сверления выкинте сердечник совсем.
  • Если в трансформаторе просверлить отверстие в сердечнике, получится соленоид?

    @kalapanga
    aspirantes, если Вам нужен соленоид "чтобы был", то сверлите на здоровье, раз так хочется!
    Но обычно соленоид нужен, чтобы выполнять определённую работу, допустим, с какой-то силой воздействовать на сердечник. Так вот чтобы обеспечить эту силу соленоид должен быть определённой формы, с определённым количеством витков, по которым течёт определённый ток, не превышающий допустимый для данного провода. Всё это рассчитывается, а не берётся от балды случайная хреновина с проводом.
    Так что с практической точки зрения у Вас будет не соленоид, а трансформатор с дыркой.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Привет! Да собственно с точки зрения именно алгоритма - ни в чём. Это только удобство написания кода. У Вас же был пример с полностью "самодельным" стеком. Сколько там всякого геммороя с указателями накручено было. И не уверен, что всё это без переработки подойдёт в другой задаче для другого типа данных. Если бы стояла задача самому реализовать работу со структурой типа стек - так бы и пришлось писать. А в используемом классе System.Generics.Collections.TStack уже всё написано за нас, нужно только сказать - работаем с типом Integer. В этом собственно и плюс дженериков, что одинаково работаем с данными практически любых типов. Ещё один класс, реализующий стек System.Contnrs.TStack - это скорее всего нечто более старое, а по функционалу - промежуточное. Работает с указателями, а уж на что они указывают - надо самому заботиться.
  • Компонент для изменения мета данных в JPG для Delphi 7?

    @kalapanga
    Олег М, Вот именно для программирования для себя, для обучения очень рекомендую перейти на Delphi Community Edition. Семёрке почти двадцать лет уже - это слишком много.
  • Какими способами можно провод присоединить к нескольким контактам?

    @kalapanga
    А проблема-то в чём? Есть провод, есть ножка светодиода - зачистили, залудили, припаяли. Или Вы что имеете ввиду? Вы бы хоть какой-то контекст вопроса давали. А то непонятно, что рассказывать.
    Или подходит ответ к Вашему прошлому вопросу - присоединять можно любым способом. Главное, чтобы был контакт где нужно и не было где не нужно.
  • Почему не запускается программа, служба?

    @kalapanga
    Может вирусяка? Не просто же так Вам Malwarebytes потребовался? :)
  • Почему не работают usb порты на Windows, в то время, как на Linux всё исправно?

    @kalapanga
    Что с usb портами в диспетчере устройств?
    Установлены ли драйвера от производителя материнской платы?
    Всё-таки, не работает только эта мышь или ни одна мышь, ни одна флешка, ни что-то ещё ни в одном порту (ни в выносных на передней панели ни сзади на материнской плате)?
  • Как правильно сделать панель приборов автомобиля на arduino (или другой платформе)?

    @kalapanga
    Сразу говорю, что я не автомобилист, поэтому ничего конкретного не подскажу. Но Вы бы добавили в вопрос, о каком автомобиле идёт речь! Ответ вон уже есть и формально правильный, но он подразумевает наличие в автомобиле всех необходимых цифровых датчиков общающихся по стандартной шине по стандартным протоколам, показания от которых нужно только поймать и отобразить. А оно у Вас точно есть? Просто желание сделать свою панель, наводит на мысли о какой-то старой или нестандартной технике.
    И ещё, фраза
    Сейчас эти данные отображаются на аналоговых датчиках
    некорректна. Датчики только измеряют/контролируют что-то, отображают индикаторы.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, С буквами прикол в том, что у меня они нормально, сглаженными рисуются. Я рисую буквы в TfrmMain.grdChessBoardDrawCell вот так:
    grdChessBoard.Font.Size:= 20+trunc(grdChessBoard.DefaultRowHeight/QueensCount)-1;
      grdChessBoard.Font.Style:=[fsBold];
      grdChessBoard.Font.Name:='Times New Roman';
    
      if ACol = 0 then
        grdChessBoard.Canvas.TextRect(grdChessBoard.CellRect(ACol, ARow), grdChessBoard.CellRect(ACol, ARow).Left, grdChessBoard.CellRect(ACol, ARow).Top, IntToStr(QueensCount - ARow))
      else if ARow = QueensCount then
        grdChessBoard.Canvas.TextRect(grdChessBoard.CellRect(ACol, ARow), grdChessBoard.CellRect(ACol, ARow).Left, grdChessBoard.CellRect(ACol, ARow).Top, char(96+ACol))
      else
       // а тут уже отрисовка клеточек собственно доски

    У меня фиксированные колонки убраны, просто сетка на 1 больше в обе стороны. Цифры слева, буквы снизу. Ну и соответственно в DrawSolution коэффициенты настроены.
    И красивые буковки. Я поэтому никаких "фокусов" и не пробовал.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, чего-то мы проигнорировали, что рекурсивный вызов внутри цикла for осуществляется, и после возврата цикл продолжаться должен. Ну значит сложнее будет! Надо тщательнее представить алгоритм на бумажке, пройтись пошагово отладчиком, тогда будет понятно, что ещё добавить нужно.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Саму процедуру Solve я примерно так и представлял. А вот этот кусочек совсем странный получился, скорее всего в нём и дело. В самой процедуре RecursiveSolution вот это совсем не так:
    if RestoreLastSolution then
      begin
        For i := 1 to QueensCount do
          x[i] := TmpArr[i];
          a[Cout1] := True;
          b[Cout2 + Cout1] := True;
          c[Cout2 - Cout1] := True;
          i:=Cout2;
          Solve(i);
      end;

    Массивы a, b, c должны заполняться так же, как мы это делали для прошлого случая. Сначала все значения True (это есть), а потом нужные элементы в False. А здесь сейчас что-то странное написано. В каждом массиве какому-то одному элементу присваивается опять же True. Тут не надо ничего придумывать - всё как для другого метода делали - здесь так же.
    Эти две строчки просто выкинуть.
    i:=Cout2;
    Solve(i);
    И получится вроде как я и имел ввиду.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, А что массивы? С ними-то всё правильно. А остальное всё не так. Перечитайте, что я писал ещё раз.
    Во-первых, прошлый раз не стал писать, но сильно уж глаза режет - два IF подряд:
    if not RestoreLastSolution then...
    if RestoreLastSolution then...
    надо:
    if RestoreLastSolution then
    begin ... end
    else
    begin...end;
    Во-вторых, никакой процедуры Solve1 не должно быть. Процедура RecursiveSolution делает по-разному инициализацию, а в конце в любом случае вызывает Solve(1).
    В-третьих, нужно модифицировать саму процедуру Solve. В начале она должна проверять - это восстановление или нет? Ну а дальше прошлое моё сообщение перечитайте.
  • Почему не получается сохранить запись?

    @kalapanga
    Влад Гапанович, Вы пытаетесь в таблицу с именем Const.USER_TABLE в колонку с именем Const.USER_USERNAME записать значение username.
    Но в этой таблице нет колонки с таким именем. А уж что это за таблица и какие колонки в ней должны быть тоже только Вы знаете! Сопоставьте структуру этой самой таблицы, в которую данные пытаетесь добавить, и получившееся значение переменной insert. Думаю сами увидите несоответствие.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Так проверили бы и убедились, что не работает так.
    Я ошибся, когда где-то выше писал, что если решение найдено, то нет вложенных рекурсивных вызовов - это не так! Решение находится в момент когда процедура вызвана восьмой раз, т.е. Solve(8)
    Логично - ищется и находится положение последнего 8 ферзя.
    Как правильно запустить - думать надо!
    1) Инициализация вспомогательных массивов нужна. Только там скорее всего вот здесь
    For i := 1 to QueensCount-1 do
    без -1 должно быть.
    2) Решение нужно положить в рабочий массив x.
    3) Нужно вызвать процедуру так же как есть Solve(1); а она (процедура) должна понимать, если идёт восстановление решения, то нужно ничего не делая вызывать себя ещё раз с увеличением параметра Solve(i + 1), но если параметр i уже = 8 (точнее QueensCount), то нужно забыть, что идёт восстановление (сбросить флаг) и просто выйти из процедуры (Exit;).
    В результате программа вернётся на предыдущий шаг уже как бы в состоянии обычного расчёта.
    Пробуйте!
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso,
    procedure StackSolution(RestoreLastSolution: boolean = false);
    var
      i, j, Y, X: integer;
      a: array [1..MaxQueensCount] of boolean;
      b: array [2..2*MaxQueensCount] of boolean;
      c: array [1-MaxQueensCount..MaxQueensCount-1] of boolean;
      Stack: TStack<integer>;
    
      Function Uspeh: Boolean;
      Var
        usp: Boolean;
      Begin
        usp := false;
        While (Y < QueensCount) And Not usp do
        Begin
          Y := Y + 1;
          usp := a[Y] and b[X + Y] and c[Y - X];
        End;
        Result := usp;
      End;
    
    begin
      Stack := TStack<integer>.Create;
      try
        // Сначала в любом случае заполняем массив True - все горизонтали и диагонали свободны
        For i := 1 to QueensCount do
          a[i] := True;
        For i := 2 to 2*QueensCount do
          b[i] := True;
        For i := 1-QueensCount to QueensCount-1 do
          c[i] := True;
        if RestoreLastSolution then
        begin
          // Если восстанавливаем решение
          // Отмечаем занятыми линии соответственно последнему решению (без последнего ферзя)
          For i := 1 to QueensCount-1 do
          begin
            a[TmpArr[i]] := False;
            b[i + TmpArr[i]] := False;
            c[TmpArr[i] - i] := False;
          end;
          // В X и Y положение последнего ферзя в решении
          X := QueensCount;
          Y := TmpArr[QueensCount];
          // Решение запихиваем в стек (без последнего ферзя)
          For i := 1 to QueensCount-1 do
            Stack.Push(TmpArr[i]);
        end
        else
        begin
          X := 1;
          Y := 0;
        end;
        // Далее не меняется ничего
        Repeat
          if StopPressed then
            Exit;
          If Uspeh Then
          Begin
            Stack.Push(Y);
            If X < QueensCount Then
            Begin
              a[Y] := False;
              b[X + Y] := False;
              c[Y - X] := False;
              X := X + 1;
              Y := 0;
            End
            Else
            begin
              frmMain.DrawSolution(Stack);
              Stack.Pop;
            end;
          End
          Else
          Begin
            X := X - 1;
            If X > 0 Then
            Begin
              Y := Stack.Pop;
              a[Y] := True;
              b[X + Y] := True;
              c[Y - X] := True;
            End;
          End;
        Until X = 0;
      finally
        Stack.Free;
      end;
    end;


    Вот процедура и она вроде работает - проверяйте! Здесь TmpArr - это последнее найденное решение, QueensCount целых чисел. Его Вы должны при необходимости получить из файла.
    Как я и говорил, в процедуре изменилась только инициализация, а сам цикл с собственно расчётом не меняется. У Вас уже есть запись решений в файл. Вот и проверьте, чтобы что без паузы, что с паузой их было нужное количество.
    Но если какого-то не хватает - ищите куда оно делось сами! :))