• Почему при копировании файлов получаются битые файлы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Аккуратно выведите куда-нибудь параметры, которые вы передаете в функцию создания symlink.

    Похоже, проблема в том, что вы передаете относительные, а не абсолютные пути в качестве цели для линка.
    При использовании функции копирования это, возможно, и не будет проблемой.
    Ответ написан
    8 комментариев
  • Как можно модифицировать этот код до целых чисел?

    @C0COK
    program Project1;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils;
    
    function LenExpression(S: string): integer;
    var
      len: integer;
    begin
      if length(S) <= 0 then
        Result := 0
      else
        case S[length(S)] of
          ')':
            begin
              delete(S, length(S), 1);
              len := LenExpression(S);
              delete(S, length(S) - len + 1, len);
              Result := len + LenExpression(S) + 1;
            end;
          '(':
            Result := 1     else
          begin
            delete(S, length(S), 1);
            Result := 1 + LenExpression(S);
          end;
        end;
    end;
    
    function Expression(S: string): integer;
    var
      i: Integer;
      str_value: string;
      value: Integer;
      value2: Integer;
      exp: string;
    begin
      value := -1;
      value2 := -1;
      result := -1;
      if length(S) > 0 then
      begin
        for i := 1 to length(S) do
        begin
    
          if S[i] in ['0'..'9'] then
          begin
            str_value := str_value + S[i];
          end;
    
          if (S[i] in ['-', '+', '*']) then
          begin
            exp := S[i];
            value := str_value.ToInteger();
            str_value := '';
          end;
    
          if i = Length(S) then
          begin
            value2 := str_value.ToInteger();
            str_value := '';
          end;
    
        end;
    
        if exp = '-' then
          result := value - value2;
        if exp = '+' then
          result := value + value2;
        if exp = '*' then
          result := value * value2;
        if exp = '' then
        begin
          Writeln('!!error!!');
          Result := -1;
        end;
      end
      else
        Writeln('!!error!!');
    end;
    
    var
      S: string;
    
    begin
      while true do
      begin
        Write('Value s: ');
        Readln(S);
        Writeln('Exp: ' + s + ' = ' + Expression(S).ToString);
    
      end;
    end.
    Ответ написан
    Комментировать
  • Как исправить ошибку E2066?

    OCTAGRAM
    @OCTAGRAM
    TSet = (Sorted, Reversed, Random);

    Это объявление сделало Random константой с более высоким приоритетом видимости, чем System.Random.

    Варианты решения:

    В новых Delphi можно написать (в начале кода)

    {$SCOPEDENUMS ON}

    и заменить

    if ArrType = TSet.Sorted then
    // …
    else if ArrType = TSet.Reversed then


    Тогда TSet.Random не сможет пересекаться с System.Random

    Можно, наоборот, при использовании System.Random указывать полностью квалифицированный идентификатор:

    ArrI[i] := System.Random(Row);

    Либо можно просто переименовать TSet.Random во что-то, что не в точности Random
    Ответ написан
    Комментировать
  • Почему отнимается 4 и умножается на 4?

    longclaps
    @longclaps
    Procedure Bubble(var A: array of Integer; M: Integer);
    # var A: array of Integer - ссылка на A, передаётся в eax
    # M: Integer - размер массива, передаётся в ecx
    Asm
        pushad
        dec   ecx
        mov   esi, 1
    @1:
        mov   edi,  ecx
        mov   edx, [eax+edi*4] #  mov   edx, A[edi], 4-байтные int
    @2:
        mov   ebx, [eax+edi*4-4] # ebx, A[edi - 1]
        cmp   ebx, edx
        ja    @3
        mov   [eax+edi*4-4], edx #mov   A[edi - 1], edx
        mov   [eax+edi*4], ebx  # A[edi], ebx  # вот и поменялись местами
    ..............................

    Вроде всё понятно.
    Переделать можно, но зачем - есть quicksort, им пользуйся
    Ответ написан
    Комментировать
  • Как можно оптимизировать код?

    @kalapanga
    "Как оптимизировать код" - неверный вопрос. Код можно оптимизировать, если есть критерии оптимизации. А у Вас не только критериев нет, Вы даже не написали, что программа делать должна, с какими данными работать. Так что думаю, если программа делает то, что задумано, то не стоит ничего "оптимизировать". Лучше лишний раз на ошибки проверьте.
    Если уж Вам сильно хочется замечаний, то вот некоторые. Часть можете считать придирками, но есть и более важные.
    Сверху вниз.
    Глобальная переменная I. Потенциальный источник ошибок. В каких-то процедурах она перекрывается локальной переменной, в каких-то нет. Легко неуследить и использовать не ту, что нужно. (Глобальную переименовать)
    Нелогичное название процедуры MatrixInput. Да, там формируется матрица, но при этом она не вводится (Input), а наоборот выводится - write(...)! (Для лучшей читабельности кода назовите например FillMatrix)
    В этой же процедуре не контролируется выход индекса за границу в строке
    M[I,J]:=S[N*(i-1)+j];
    Раз уж выделили этот кусочек в отдельную процедуру, в её начале надо проверить корректность входных параметров.
    В процедуре CheckAndFixString вместо цикла
    while length(S)<NeedLength do S:=S+'#'
    лучше так
    S := S + StringOfChar('#', NeedLength - length(S));
    Здесь длина строки нужна только один раз, а не на каждом проходе цикла.
    Основная программа.
    Главная ошибка - "захардкоженные" имена файлов. Вы принесли кому-то Вашу программу. Откуда у него такие каталоги?
    Или используйте ini-файл с путями к файлам или хотябы оставьте в коде только имена файлов и ищите их в каталоге программы.
    Здесь же вторая ошибка - отсутствие обработки ошибок при работе с файлами. Если например нужного файла нет программа свалится с ошибкой вместо информативного сообщения пользователю.
    Ответ написан