purebasic.info

PureBasic forum
Текущее время: Чт авг 22, 2019 5:08 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Аналог printf
СообщениеДобавлено: Чт фев 11, 2016 8:23 pm 
Не в сети
ассистент

Зарегистрирован: Пт янв 29, 2016 3:02 pm
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Как сделать форматированный вывод в пурике по аналогии с printf в С ?
В MASM32 это можно сделать без проблем через msvcrt.lib, есть ли примеры подключения этой либы к PB ?

Спасибо.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог printf
СообщениеДобавлено: Чт фев 11, 2016 8:34 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6538
Благодарил (а): 28 раз.
Поблагодарили: 220 раз.
Пункты репутации: 57
DeGlucker писал(а):
Как сделать форматированный вывод в пурике по аналогии с printf в С ?
В MASM32 это можно сделать без проблем через msvcrt.lib, есть ли примеры подключения этой либы к PB ?

Спасибо.

Ни когда не понимал этих костылей, в Basic всё гораздо понятнее и проще делается штатными средствами форматирования
Но видно есть ещё любители, которые придумали этот код
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
EnableExplicit
 
Procedure.s formatString(string.s, *data_a = 0, *data_b = 0, *data_c = 0, *data_d = 0, *data_e = 0, *data_f = 0, *data_g = 0)
   
   ; format a string, like PrintF()
     
   Protected.s toInsert, _string = string, format
   Protected.l cs, ci, cd, cf, tFormat, count, iteration, location
 
   ; get number of times we need to deal with this string
   cs.l = CountString(string.s, "%s")
   ci.l = CountString(string.s, "%i")
   cd.l = CountString(string.s, "%d")
   cf.l = CountString(string.s, "%f")
   tFormat.l = cs.l + ci.l + cd.l + cf.l
   
   ; vvvv slower than above? vvvv
   ;tFormat.l = CountString(string.s, "%s") + CountString(string.s, "%i") + CountString(string.s, "%d") + CountString(string.s, "%f")
 
   For count.l = 1 To tFormat.l
      iteration.l = count.l - 1
 
      location.l = FindString(_string.s, "%", 0) ;
      format.s = Mid(_string.s, location, 2)
      Select format.s
         Case "%i"
            Select iteration
               Case 0 : toInsert = Str(PeekL(*data_a))
               Case 1 : toInsert = Str(PeekL(*data_b))
               Case 2 : toInsert = Str(PeekL(*data_c))
               Case 3 : toInsert = Str(PeekL(*data_d))
               Case 4 : toInsert = Str(PeekL(*data_e))
               Case 5 : toInsert = Str(PeekL(*data_f))
               Case 6 : toInsert = Str(PeekL(*data_g))
            EndSelect
         Case "%s"
            Select iteration
               Case 0 : toInsert = PeekS(*data_a)
               Case 1 : toInsert = PeekS(*data_b)
               Case 2 : toInsert = PeekS(*data_c)
               Case 3 : toInsert = PeekS(*data_d)
               Case 4 : toInsert = PeekS(*data_e)
               Case 5 : toInsert = PeekS(*data_f)
               Case 6 : toInsert = PeekS(*data_g)
            EndSelect
         Case "%d"
            Select iteration
               Case 0 : toInsert = Hex(*data_a)
               Case 1 : toInsert = Hex(*data_b)
               Case 2 : toInsert = Hex(*data_c)
               Case 3 : toInsert = Hex(*data_d)
               Case 4 : toInsert = Hex(*data_e)
               Case 5 : toInsert = Hex(*data_f)
               Case 6 : toInsert = Hex(*data_g)
            EndSelect
         Case "%f"
            Select iteration
               Case 0 : toInsert = StrF(PeekF(*data_a))
               Case 1 : toInsert = StrF(PeekF(*data_b))
               Case 2 : toInsert = StrF(PeekF(*data_c))
               Case 3 : toInsert = StrF(PeekF(*data_d))
               Case 4 : toInsert = StrF(PeekF(*data_e))
               Case 5 : toInsert = StrF(PeekF(*data_f))
               Case 6 : toInsert = StrF(PeekF(*data_g))
            EndSelect
         Default : toInsert = "[FORMAT_ERROR]"
      EndSelect
      _string.s = RemoveString(_string.s, format.s, #PB_String_CaseSensitive, location.l, 1)
      _string.s = InsertString(_string.s, toInsert.s, location)
   Next count.l
 
   ProcedureReturn _string.s
 
EndProcedure
 
DisableExplicit
 
OpenConsole()
 
time.s = FormatDate("%mm/%dd/%yyyy", Date())
teeth.l = 5
PrintN(formatString("Today is: %s and I only have %i teeth left in my head!", @time, @teeth))
Print("Press any key to continue...")
 
While Inkey()="" : Delay(10) : Wend
 


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог printf
СообщениеДобавлено: Чт фев 11, 2016 10:02 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11504
Благодарил (а): 4 раз.
Поблагодарили: 469 раз.
Код:
1
2
3
4
5
6
7
8
9
ImportC "msvcrt.lib"
  printf(Format.s, Param1=0, Param2=0, Param3=0, Param4=0)
EndImport
 
OpenConsole()
time.s = FormatDate("%mm/%dd/%yyyy", Date())
teeth.l = 5
printf("Today is: %s and I only have %i teeth left in my head!", @time, teeth)
Input()

Чтобы работало, нужно выключить поддержку юникода, и в настройках выбрать консольный тип исполняемого файла.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог printf
СообщениеДобавлено: Пт фев 12, 2016 2:37 pm 
Не в сети
ассистент

Зарегистрирован: Пт янв 29, 2016 3:02 pm
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо Петр. Понял, как передавать переменное число параметров.
Теперь еще идиотcкий вопрос: как с выделенной памятью работать как со строкой
и не использовать каждый раз PeekS(*buffer)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог printf
СообщениеДобавлено: Сб фев 13, 2016 3:51 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 286
Благодарил (а): 40 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Код:
1
2
3
4
Define *buf.String
*buf = AllocateMemory(1024)
*buf\s = "Привет мир!!!"
Debug *buf\s



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог printf
СообщениеДобавлено: Сб фев 13, 2016 8:32 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11504
Благодарил (а): 4 раз.
Поблагодарили: 469 раз.
Kuzmat
Код:
1
2
3
4
5
6
Define *buf.String
*buf = AllocateMemory(1024)
*buf\s = "Привет мир!!!"
Debug *buf\s
Debug *buf
Debug @*buf\s


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог printf
СообщениеДобавлено: Вс фев 14, 2016 8:39 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 286
Благодарил (а): 40 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Да, точно, в указатель идет адрес строки, тогда значит никак? (в сысле без peek-poke)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB