PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Консоли-консолечки


Консоли-консолечки

Сообщений 1 страница 14 из 14

1

Всем привет. В PB я относительно недавно, но примерно что к чему разобрался. Однако, есть и вопросы. Я создаю консольное подобие игры, и по ходу разработки столкнулся с такими вопросами:
- как проверить введёное число? Есть ли способы заставить компьютер распознавать введёное не как строку, а как переменную (и пресекать возможность ввести другие символы помимо цифр)?
- как правильно выводить определённую пользователем строку, содержащую русские буквы? Для правильного ввода русских букв я применил следующую конструкцию:

Procedure.s CharToOem(String.s)
  CharToOem_(@String, @String)
  ProcedureReturn String
EndProcedure

Procedure.s OemToChar(String.s)
  OemToChar_(@String, @String)
  ProcedureReturn String
EndProcedure

Таким образом, когда мне необходимо вывести русскую надпись в консоль, хватает только:
Print(CharToOem("текст"))

Режим консоли графический.

Заранее спасибо.

Отредактировано BizSob_ (01.09.2013 19:49:35)

0

2

BizSob_ написал(а):

как проверить введёное число?

Строку можно проверить этой процедурой на наличие только цифр в ней.

Код:
Procedure.b TestNumber(String.s) ; Проверяет чтобы в строке были только цифры.
  Protected Result.b, Len, Char.s, i
  Result = #True
  Len = Len(String)

  For i=1 To Len
    Char = Mid(String, i, 1)
    If Char<"0" Or Char>"9"
      Result = #False ; Недопустимый символ.
      Break
    EndIf
  Next i
  
  ProcedureReturn Result
EndProcedure

Если будут обнаружены недопустимые символы, то можно сообщить об этом и попросить заново ввести число.

BizSob_ написал(а):

как правильно выводить определённую пользователем строку, содержащую русские буквы?

Ниже ведь вы написали ответ.

0

3

Пётр написал(а):

Ниже ведь вы написали ответ.

Такой метод даёт только возможность выводить правильно обычный текст через Print/PrintN, на строки это почему-то не распространяется. А за процедуру спасибо, опробую.

0

4

BizSob_ написал(а):

на строки это почему-то не распространяется.

Разве текст хранится не в строковых переменных?

Код:
Procedure.s CharToOem(String.s) 
  CharToOem_(@String, @String) 
  ProcedureReturn String 
EndProcedure

OpenConsole()
String.s="текст"
PrintN(CharToOem(String))
Input()

0

5

BizSob_, чтобы вы лучше понимали, вот пример. В консоль выводится русский текст, и принимается кириллица отлично.

Код:
Procedure.s CharToOem(String.s) 
  CharToOem_(@String, @String) 
  ProcedureReturn String 
EndProcedure 

Procedure.s OemToChar(String.s) 
  OemToChar_(@String, @String) 
  ProcedureReturn String 
EndProcedure 

OpenConsole() 
  PrintN(CharToOem("Привет!")) 
  Print(CharToOem("Ваше слово?: ")) 
  S$ = Input() 
CloseConsole() 

MessageRequester("","Вы напечатали: "+OemToChar(S$),0)

0

6

Да, я уже находил этот код, да что там, это он и есть.
Но я о следующей проблеме:

Procedure.s CharToOem(String.s)
  CharToOem_(@String, @String)
  ProcedureReturn String
EndProcedure

Procedure.s OemToChar(String.s)
  OemToChar_(@String, @String)
  ProcedureReturn String
EndProcedure

OpenConsole()
   Repeat
    Print(CharToOem("Ваше слово?: "))
  S.s = Input()
  PrintN(CharToOem(S))
  If S = "2"
    CloseConsole()
  EndIf
  Until S = "2"

Воот.

0

7

Код:
Procedure.s CharToOem(String.s) 
  CharToOem_(@String, @String) 
  ProcedureReturn String 
EndProcedure 

Procedure.s OemToChar(String.s) 
  OemToChar_(@String, @String) 
  ProcedureReturn String 
EndProcedure 

OpenConsole() 
Repeat 
  Print(CharToOem("Ваше слово?: ")) 
  S.s = OemToChar(Input())
  PrintN(CharToOem(S))
  If S = "2"
    CloseConsole()
  EndIf
Until S = "2"

0

8

Так вот оно в чём дело. Спасибо.

0

9

Код можно упростить, отказавшись от преобразований кодировки, если включить поддержку юникода.

Код:
OpenConsole() 
Repeat 
  Print("Ваше слово?: ") 
  S.s = Input()
  PrintN(S)
  If S = "2"
    CloseConsole()
  EndIf
Until S = "2"

0

10

Добрый день. Совсем запутался. Записываю информацию в текстовый файл с помощью найденого на форуме примера. Отображается всё корректно

Код:
Procedure.s GetProgramResult(File.s,Parameters.s)
  Shared GetProgramResultExitCode.l
  Protected Buff.s{1000} 
  Pid=RunProgram(File,Parameters,"",#PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)
  If Pid
    While ProgramRunning(Pid)
      If AvailableProgramOutput(Pid)
        *s=Ascii(ReadProgramString(Pid, #PB_Ascii))
        If *s
          OemToChar_(*s, @Buff)
          FreeMemory(*s)
          Output.s+Buff+Chr(10)
        EndIf
      EndIf
    Wend
    GetProgramResultExitCode=ProgramExitCode(Pid)
    CloseProgram(Pid)
    ProcedureReturn Output
  EndIf 
EndProcedure
CreateFile(#ip_config, "ip_config.txt")
WriteStringN(#ip_config, GetProgramResult("netsh","interface ip show config"))
CloseFile(#ip_config)

После из этого файла при необходимости достаю нужные параметры ,записываю строку в батник и запускаю  от имени администратора.
где lan(1)="Беспроводная сеть"

WriteStringN(1,"netsh interface ip set address name="+Chr(34)+lan(1)+Chr(34)+" static 192.168.1.2 255.255.255.0 192.168.1.1")

Естественно результат иероглифы.

Не пойму в каком месте его надо перекодировать.Текстовый документ в кодировке UTF-8. Если я просто копирую текст из сохраненого файла и вставляю  в запущеную командную строку
в виндовс,то всё выполняется. Попытки добавить команды в батник типа chcp с различными кодировками не дали результатов. Я понимаю что нужно перекодировать "Беспроводная сеть"
из UTF-8 в ОЕМ 866.Если в виндовс в региональных стандартах поставить галочку в дополнительных настройках языка,то всё работает. Но это не выход,так как ломаются
другие программы,в том чиле и Purebasic. Т.е. его нужно перкодировать внутри кода,но хоть убейте не пойму как)))

0

11

alexandr2222
Запишите в батник перед строкой с netsh строку «chcp 1251»
В CreateFile и WriteStringN используйте флаг #PB_Ascii

П.С.
Если не поможет, придётся строки в 866 перекодировать

Отредактировано Smitis (07.01.2024 18:13:34)

0

12

Smitis, спасибо большое. Помог флаг после WriteStringN  #PB_Ascii . А я дурак делал   с точность наоборот   chcp  65001 и #PB_UTF8.

0

13

alexandr2222

alexandr2222 написал(а):

А я дурак делал   с точность наоборот   chcp  65001 и #PB_UTF8

В принципе, командные файлы прекрасно работают и в UTF-8. Только в начало надо добавить CHCP 65001. Не обязательно в самое начало, главное до использования команд, на которые влияет кодировка. И файл должен быть сохранён без BOM! А вот как будут работать утилиты, запущенные из командного файла, надо смотреть конкретно.

0

14

нет. в моём случае с utf 8 это не сработало. ну по крайней мере теперь понял сам процесс. Ещё раз спасибо за помощь.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Консоли-консолечки