purebasic.info

PureBasic forum
Текущее время: Вс янв 21, 2018 7:33 am

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




Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 31, 2007 5:30 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Случился маленький облом... При воспроизведении видео звук перетает записываться или пишет рывками и со щелчками. Если выводить запись отдельным thread-ом, то тогда рывками идет видео... Пришлось пока вернуться к MCI-ным командам. Только никак не пойму, как при их помощи осуществлять визуальный контроль записи...
Привожу куски кода:
Код:
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
 
    ;- Sound
      Case #Button_24;record
        If Not SoundFlag
          SoundFlag=1
          DisableGadget(#Button_21,1)
          DisableGadget(#Button_22,1)
          DisableGadget(#Button_23,0)
          DisableGadget(#Button_24,1)
          mciSendString_("open new type waveaudio alias capture",buffer$,128,0)
          mciSendString_("set capture time format ms bitspersample 16 channels 1 samplespersec 44100",0,0,0)
          mciSendString_("record capture",buffer$,128,0)
        Else
          mciSendString_("record capture",buffer$,128,0)
        EndIf
 
      Case #Button_21;play
          mciSendString_(  "play capture",buffer$,128,0)
          DisableGadget(#Button_21,1)
          DisableGadget(#Button_22,0)
          DisableGadget(#Button_23,0)
          DisableGadget(#Button_24,1)
       
      Case #Button_22;pause
          mciSendString_( "pause capture",buffer$,128,0)
          DisableGadget(#Button_21,0)
          DisableGadget(#Button_22,1)
          DisableGadget(#Button_23,0)
          DisableGadget(#Button_24,1)
       
      Case #Button_23;stop
          mciSendString_( "stop capture",buffer$,128,0)
          mciSendString_( "seek capture to start",buffer$,128,0)
          DisableGadget(#Button_21,0)
          DisableGadget(#Button_22,1)
          DisableGadget(#Button_23,1)
          DisableGadget(#Button_24,0)


Сами гаджеты:
Код:
1
2
3
4
5
        ButtonGadget(#Button_21, 340, 440, 40, 20, "Play")
        ButtonGadget(#Button_22, 380, 440, 40, 20, "Pause")
        ButtonGadget(#Button_23, 420, 440, 40, 20, "Stop")
        ButtonGadget(#Button_24, 460, 440, 40, 20, "Record")
 


Сохранение:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    If SoundFlag
      filename$ = SaveFileRequester("Please choose file name to save", "example.wav", "Windows Audio (*.wav)|*.wav|All files (*.*)|*.*", 0)
      If ReadFile(#File_1, filename$)
      If MessageRequester(Logo$, "File already exist!"+#LF$+"Overwrite it?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
        mciSendString_( "stop capture",buffer$,128,0)
        mciSendString_("save capture "+filename$,buffer$,128,0)
      EndIf
      Else
        mciSendString_( "stop capture",buffer$,128,0)
        mciSendString_("save capture "+filename$,buffer$,128,0)
;        mciSendString_("close capture",buffer$,128,0)
;        SoundFlag=0
      EndIf
    EndIf
 


В долбагере сохранение не всегда работает: хочет - сохранит, а хочет - нет. В ЕХЕ-шнике тоже если не выбрать папку, может сохранить куда попало: в папку с титрами, в папку с видео или даже в папку программы.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 21, 2008 4:42 pm 
Не в сети
доцент

Зарегистрирован: Пт дек 28, 2007 3:00 pm
Сообщений: 65
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
[quote="kvitaliy"]1.У многих на компах стоит Lame, или в виде lame_enc.dll, или в виде lame.exe. [/kvitaliy]
а у ламеров стоит "Lamer" :D :D :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 22, 2008 4:18 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6224
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
У ламеров, по ходу, вообще ни чего не стоИт. Даже теги цитирования, и то не стоят как надо.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 13, 2008 11:46 pm 
Не в сети
доцент

Зарегистрирован: Пт июн 13, 2008 10:31 pm
Сообщений: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Fdisk писал(а):
Такого кода, который бы захватывал и сохранял звук в файл,-
я не встречал.
Зато встречал код, который выводит "изображение" звука,
по типу осциллографа.

Как заставить этот код сохранять звук - я не знаю.
Код:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
 
;Corrected for current version of PB (3.93) (Hroudtwolf)
;Miscellaneous improvements (chris319)
;***********************************************************************************
;- DECLARATIONS                                ; SOUND CAPTURE, Flype (26-juil-2002)
;***********************************************************************************
Declare CAPTURE_Read( hWaveIn.l, lpWaveHdr.l )
Declare CAPTURE_Error( err.l )
Declare CAPTURE_Start()
Declare CAPTURE_Stop()
Declare CAPTURE_Draw()
Declare CAPTURE_Now()
Declare GUI_CallBack( hWnd.l, Message.l, wParam.l, lParam.l )
Declare GUI_Button( id.l, ico.l, tip.s )
Declare GUI_Init()
Declare GUI_Main()
Declare GUI_Resize()
Declare FILE_Recording( state.b )
Declare FILE_Create()
Declare FILE_Append()
Declare FILE_Close()
;***********************************************************************************
;- INIT CONFIGURABLE CONSTANTS
;***********************************************************************************
#SOUND_NCHANNELS   = 1      ; This example only supports Mono
#SOUND_NBITS       = 16     ; This example only supports 16 bits
#SOUND_NHERTZ      = 48000  ; Try 8000, 11050, 22100, 44100...
#SOUND_NBYTES      = 2
#HEADROOM          = 9      ; dB of headroom before clipping
#BUFFER_NUM        = 8      ; Number of buffers for capture
#BUFFER_SIZE       = 1536   ; Size of each buffer, should be x2 in Stereo
#BUFFER_TICK       = 10     ; Wave redraw delay : SetTimer_ in CAPTURE_Start()
;***********************************************************************************
;- INIT CONSTANTS
;***********************************************************************************
#gadRecord   =  0
#gadStop     =  1
#gadMode     =  2
#StatusBar   =  0
#StatusTime  =  0
#StatusInfo  =  1
#StatusFile  =  2
#COLOR_RECBACK  = $000050
#COLOR_RECLINE  = $000035
#COLOR_RECWAVE  = $1010E0
;#COLOR_CAPBACK  = $004900
#COLOR_CAPBACK  = $800000
#COLOR_CAPLINE  = $004000
#COLOR_CAPWAVE  = $20E020
#COLOR_VOLUME   = $00FFFF
#COLOR_GREEN    = $00EE00
#COLOR_RED      = $2222FF
#STR_ERROR      = "Error"
#STR_STOP       = "Stop"
#STR_RECORD     = "Record"
#STR_CLOSED     = "File saved"
#STR_SAVEREQ    = "Choose a file..."
#STR_MODE       = "Display mode"
#STR_RECORDED   = " bytes recorded"
#STR_PBFILE     = "Problem while creating file"
#STR_NODEVICE   = "Audio device not found"
;***********************************************************************************
;- INIT STRUCTURES
;***********************************************************************************
Structure RECORD_INFO
x.l          ; Left
y.l          ; Top
w.l          ; Width
h.l          ; Height
m.l          ; YMiddle
cback.l      ; Back color
cline.l      ; Line color
cwave.l      ; Wave color
size.l       ; Wave buffer size
buffer.l     ; Wave buffer pointer
output.l     ; WindowOutput()
mode.b       ; Wave mode (line or plain)
wave.l       ; Address of waveform-audio input device
frame.b      ; Counter for back clearing
update.b     ; If true Wave have to be redrawn
recorded.l   ; Number of bytes recorded
recording.b  ; Record is running...
time.s       ; Store the time string
EndStructure
Structure WAVEFORMATEX
wFormatTag.w
nChannels.w
nSamplesPerSec.l
nAvgBytesPerSec.l
nBlockAlign.w
wBitsPerSample.w
cbSize.w
EndStructure
Global Dim inHdr.WAVEHDR(#BUFFER_NUM)
Global inHdr, rec.RECORD_INFO, now.SYSTEMTIME
rec\time = Space(9)
Global scale.f, sample.w, max.w
;***********************************************************************************
;- PROCS CAPTURE
;***********************************************************************************
Procedure CAPTURE_Error( err.l )
If err
text.s = Space( #MAXERRORLENGTH )
waveInGetErrorText_( err, text, #MAXERRORLENGTH )
MessageRequester( #STR_ERROR, text, #MB_ICONERROR )
CAPTURE_Stop()
End
EndIf
EndProcedure
;==============================================================================
Procedure CAPTURE_Now()
GetLocalTime_( @now )
GetTimeFormat_(0, 0, @now, "HH:mm:ss:", @rec\time, 9 )
StatusBarText( #StatusBar, #StatusTime, rec\time+Str(now\wMilliseconds) )
EndProcedure
;==============================================================================
Procedure CAPTURE_Draw()
If rec\update = #True
CAPTURE_Now()
StartDrawing( rec\output )
;Draw Background...
If rec\frame = 2
Box( rec\x, rec\y, rec\w, rec\h, rec\cback )
shift = rec\h >> 2
Line( rec\x, rec\m - shift, rec\w, 0, rec\cline )
Line( rec\x, rec\m + shift, rec\w, 0, rec\cline )
rec\frame = 0
Else
rec\frame + 1
EndIf
;Draw Wave Data
oldx = rec\x : oldy = 0 : max = 0
For i = 0 To rec\size - #SOUND_NBYTES Step #SOUND_NBYTES ;#Word
sample = PeekW(rec\buffer + i)
If sample > max: max = sample: EndIf ;FIND PEAK VALUE WITHIN THIS BUFFER
x = rec\x + ( i * rec\w-1 ) / rec\size
y = ( sample * rec\h ) / $FFFF
If x <> oldx
Select rec\mode
Case #True  : LineXY(oldx,rec\m+oldy,x,rec\m+y,rec\cwave)
Case #False : LineXY(oldx,rec\m+oldy,x,rec\m-y,rec\cwave)
EndSelect
oldx = x : oldy = y
EndIf
Next
;Draw Meter
Box(rec\x + 2, rec\h + rec\y - 26, (max * scale) + 1, 24, #COLOR_GREEN)
StopDrawing()
rec\update = #False
EndIf
EndProcedure
;==============================================================================
Procedure.s CAPTURE_GetDevice()
Caps.WAVEINCAPS
For i = 0 To waveInGetNumDevs_()-1
CAPTURE_ERROR( waveInGetDevCaps_( i, @Caps, SizeOf( WAVEINCAPS ) ) )
If Caps\dwFormats & #WAVE_FORMAT_1S08
ProcedureReturn PeekS( @Caps\szPname, 32 )
EndIf
Next
ProcedureReturn #STR_NODEVICE
EndProcedure
;==============================================================================
Procedure CAPTURE_Start()
DeviceName.s = CAPTURE_GetDevice()
If DeviceName
SetWindowText_(WindowID(0), DeviceName)
format.WAVEFORMATEX
format\wFormatTag      = 1
format\nChannels       = #SOUND_NCHANNELS
format\wBitsPerSample  = #SOUND_NBITS
format\nSamplesPerSec  = #SOUND_NHERTZ
format\nBlockAlign     = #SOUND_NCHANNELS * (#SOUND_NBITS / 8)
format\nAvgBytesPerSec = #SOUND_NHERTZ * format\nBlockAlign
format\cbSize          = 0
CAPTURE_Error(waveInOpen_(@rec\wave, #WAVE_MAPPER, @format, WindowID(0), #Null, #CALLBACK_WINDOW | #WAVE_FORMAT_DIRECT))
For i = 0 To #BUFFER_NUM - 1
inHdr(i)\lpData         = AllocateMemory(  #BUFFER_SIZE )
inHdr(i)\dwBufferLength = #BUFFER_SIZE
CAPTURE_Error(waveInPrepareHeader_( rec\wave, inHdr(i), SizeOf( WAVEHDR ) ) )
CAPTURE_Error(waveInAddBuffer_    ( rec\wave, inHdr(i), SizeOf( WAVEHDR ) ) )
Next
CAPTURE_Error( waveInStart_( rec\wave ) )
SetTimer_( WindowID(0), 0, #BUFFER_TICK, 0 )
EndIf
EndProcedure
;==============================================================================
Procedure CAPTURE_Stop()
If rec\wave
CAPTURE_Error( waveInReset_( rec\wave ) )
CAPTURE_Error( waveInStop_ ( rec\wave ) )
For i = 0 To #BUFFER_NUM - 1
CAPTURE_Error( waveInUnprepareHeader_( rec\wave, inHdr(i), SizeOf( WAVEHDR ) ) )
Next
CAPTURE_Error( waveInClose_( rec\wave ) )
EndIf
KillTimer_( WindowID(0), 0 )
EndProcedure
;==============================================================================
Procedure CAPTURE_Read( hWaveIn.l, lpWaveHdr.l )
CAPTURE_Error( waveInAddBuffer_( hWaveIn, lpWaveHdr, SizeOf( WAVEHDR ) ) )
rec\buffer  = PeekL( lpWaveHdr )
rec\size    = PeekL( lpWaveHdr + 8 )
rec\update  = #True
FILE_Append()
EndProcedure
;***********************************************************************************
;- PROCS FILE
;***********************************************************************************
Procedure FILE_Create()
File.s = SaveFileRequester( #STR_SAVEREQ, "C:\test.raw", "Son brut|(*.raw)", 0 )
If File
If CreateFile( 0, File )
FILE_Recording( #True )
StatusBarText( #StatusBar, #StatusFile, File )
Else
MessageRequester( #STR_ERROR, #STR_PBFILE, #MB_ICONERROR )
EndIf
EndIf
EndProcedure
;==============================================================================
Procedure FILE_Append()
If rec\recording = #True
rec\recorded + rec\size
WriteData(0, rec\buffer, rec\size )
StatusBarText( #StatusBar, #StatusInfo, Str(rec\recorded) + #STR_RECORDED )
EndIf
EndProcedure
;==============================================================================
Procedure FILE_Recording( state.b )
If state = #True
rec\cback = #COLOR_RECBACK
rec\cline = #COLOR_RECLINE
rec\cwave = #COLOR_RECWAVE
Else
rec\cback = #COLOR_CAPBACK
rec\cline = #COLOR_CAPLINE
rec\cwave = #COLOR_CAPWAVE
EndIf
DisableToolBarButton(0, #gadRecord, state )
DisableToolBarButton(0, #gadStop, #True-state )
rec\recording = state
rec\recorded = 0
EndProcedure
;==============================================================================
Procedure FILE_Close()
If rec\recording = #True
FILE_Recording( #False )
CloseFile(0)
StatusBarText( #StatusBar, #StatusFile, #STR_CLOSED )
EndIf
EndProcedure
;***********************************************************************************
;- PROCS GUI
;***********************************************************************************
Procedure GUI_Button( id.l, ico.l, tip.s )
ToolBarStandardButton( id, ico )
ToolBarToolTip(0, id, tip )
EndProcedure
;==============================================================================
Procedure GUI_Init()
hFlags.l = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
If OpenWindow( 0, 0, 0, 480, 240, "" , hFlags) = #Null
ProcedureReturn #False
EndIf
If CreateToolBar( 0, WindowID( 0) ) = #Null
ProcedureReturn #False
EndIf
If CreateGadgetList( WindowID( 0) ) = #Null
ProcedureReturn #False
EndIf
Frame3DGadget( 0, 0,0,0,0, "", #PB_Frame3D_Double )
If CreateStatusBar( #StatusBar, WindowID( 0) ) = #Null
ProcedureReturn #False
EndIf
rec\output = WindowOutput( 0)
GUI_Button( #gadRecord, #PB_ToolBarIcon_Save,       #STR_RECORD )
GUI_Button( #gadStop,   #PB_ToolBarIcon_Delete,     #STR_STOP   )
GUI_Button( #gadMode,   #PB_ToolBarIcon_Properties, #STR_MODE   )
AddStatusBarField(   80 )
AddStatusBarField(  150 )
AddStatusBarField( $FFF )
ProcedureReturn #True
EndProcedure
;==============================================================================
Procedure GUI_Resize()
rec\x = 2
rec\y = 30
rec\w = WindowWidth(0) - 4
scale = (rec\w - 5) / ((Pow(2, #SOUND_NBITS) / 2) - 1)
rec\h = WindowHeight(0) - 52
rec\m = rec\y + rec\h / 2
ResizeGadget( 0, rec\x-2, rec\y-2, rec\w+4, rec\h+4 )
EndProcedure
;==============================================================================
Procedure GUI_CallBack( hWnd.l, uMsg.l, wParam.l, lParam.l )
Result.l = #PB_ProcessPureBasicEvents
Select uMsg
Case #MM_WIM_DATA : CAPTURE_Read( wParam, lParam )
Case #WM_TIMER    : CAPTURE_Draw()
Case #WM_SIZE     : GUI_Resize()
Case #WM_CLOSE    : Quit = #True
Case #WM_COMMAND
Select wParam
Case #gadRecord : FILE_Create()
Case #gadStop   : FILE_Close()
Case #gadMode   : rec\mode = #True-rec\mode
EndSelect
EndSelect
ProcedureReturn Result
EndProcedure
;==============================================================================
Procedure GUI_Main()
If GUI_Init()
SetWindowCallback( @GUI_CallBack() )
FILE_Recording(#False)
GUI_Resize()
CAPTURE_Start()
While WaitWindowEvent()<>#WM_CLOSE : Wend
CAPTURE_Stop()
EndIf
EndProcedure
;***********************************************************************************
;- START
;***********************************************************************************
GUI_Main()
FreeMemory(-1)
End
 




Здравствуйте.
Я в этом деле новичёк. Хоселось бы чтоб ктонибуть пояснил принцип
работы этого кода.
А именно мне хочется узнать как производить считывание данных с линейного входа звукавой карты и системное время, и присваевать их какимнибуть переменным?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 14, 2008 11:31 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
Цитата:
как производить считывание данных с линейного входа звуковой карты и системное время, и присваевать их какимнибуть переменным
Как считывать данные с линейного входа - незнаю, но похоже что мне тоже нужно будет подобную прогу делать, так что хотелось-бы узнать.

Системное время можно узнавать с помощью функций из встроенной библиотеки Date (описание функций можно найти в справке).

Вот код, который считывает текущее всемя и отображает его в строке состояния.
Код:
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
; Эта процедура вызывается по таймеру два раза в секунду.
Procedure DateStatusBar()
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  StatusBarText(0, 0,Time) ; Выводим его на строку состояния
EndProcedure
; Открываем окно
If OpenWindow(0,0,0,200,100,"Строка состояния",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
 If CreateGadgetList(WindowID(0))
   ; Создаём строку состояния
   CreateStatusBar(0, WindowID(0))
   ; Делим её на области
   AddStatusBarField(80)
   AddStatusBarField(120)
  StatusBarText(0, 1, " Текущее время") ; Выводим строку в область с идентификатором 1.
 
  OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
  CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"
   
  Repeat
   Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
  ; Вызываем функцию "KillTimer"
  CallFunction(0,"KillTimer",WindowID(0),1)
   ; Закрываем файл "user32.dll".
  CloseLibrary(0)
 EndIf
EndIf
End


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 2:55 am 
Не в сети
доцент

Зарегистрирован: Пт июн 13, 2008 10:31 pm
Сообщений: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр помойму в коде приведённом выше следующие строки тоже извлекают системное время.

Structure RECORD_INFO
time.s ; Store the time string
EndStructure

Global rec.RECORD_INFO, now.SYSTEMTIME
rec\time.s = Space(9)

Procedure CAPTURE_Now()
GetLocalTime_( @now )
GetTimeFormat_(0, 0, @now, "HH:mm:ss:", @rec\time, 9 )
StatusBarText( 0, 1, rec\time+Str(now\wMilliseconds) )
EndProcedure

хотелосьбы узнать что каждая строка означает?
И ещё вопрос, что означает "time.s" именно окончание " .s"?
Что означает "@" ?
Как присвоить разным переменным значения %HH, %ii, %ss ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 7:20 am 
Не в сети
BackupUser
Аватар пользователя

Зарегистрирован: Ср ноя 29, 2006 9:29 pm
Сообщений: 1492
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
alexvolk писал(а):
И ещё вопрос, что означает "time.s" именно окончание " .s"?

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

Если ты обьявил текстовую переменную типа-вида Bukva$, то везде у тебя будет легко-читаемая ясность, что это и есть текст, не ошибёшься, не потеряешь мысль.

Но, можно пойти другим путём обьявления букв - Bukva.s .
Тогда в коде, далее, ты получаешь возможность её писать как - Bukva
То есть, лишить код ясности и читаемости, чёрт ногу сломает теперь, разбираясь дальше - строковая эта переменная или она цифровая.

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


Последний раз редактировалось Fdisk Вс июн 15, 2008 9:27 am, всего редактировалось 4 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 7:27 am 
Не в сети
BackupUser
Аватар пользователя

Зарегистрирован: Ср ноя 29, 2006 9:29 pm
Сообщений: 1492
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Теперь по поводу "@", это кусок памяти, где лежит переменная.
Вот понятный пример:
Код:
1
2
3
4
5
ReadFile(0, "c:\boot.ini")
N$ = Space(Lof(0)); здесь определяется, какой обьём куска
ReadData(0, @N$, Lof(0))
chislo=CountString(N$, #CRLF$)
Debug "У меня число строчек в бут-ини: "+Str(chislo)



То есть!
Эти ПурикМейкеры считают!
Если ты обьявляешь переменную вида Text$ - то заранеее резервировать кусок под неё не надо.
А в случае @Text$ - ты должен уже сам начать заботиться о достаточном размере под её место...

Это всё надо угадывать самому, ибо, на справку они откровенно забили, с самого начала.
Они хотят!
С одной стороны - продать побольше Пуриков.
С другой стороны - навести побольше путанки, чтоб в них ничерта не получалось у новичка.
Цель одна - чтоб юзер заплатил бабки, а Пурик забросил.

Но, у нас они не на тех нарвались!
Я не брошу, под расстрелом, его.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 11:21 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
Цитата:
помойму в коде приведённом выше следующие строки тоже извлекают системное время

Да, но только с помощью API функций.

Цитата:
И ещё вопрос, что означает "time.s" именно окончание " .s"?
Буква s значит что это строковая переменная и в ней можно хранить строку текста практически неограниченого размера.
Существуют и другие типы переменных, более подробно узнать об этом можно в справке или в учебнике http://pbasic.spb.ru/phpBB2/viewtopic.php?t=59&start=15


Цитата:
Что означает "@" ?
С помощью "собаки" можно узнать физичиский адрес в памяти интерисующей нас переменной. Это обычно необходимо при вызовах API функций.

Вот пример где применяется "собака"
Код:
1
2
3
4
5
6
7
 
xxx.s="Текст" ; Объявляем строковую переменную и записываем туда слово
 
Debug xxx ; Убеждаемся что есть данные в переменной
Debug @xxx ; Узнаём физический адрес переменной
Debug PeekS(@xxx) ; Читаем данные из переменной зная её физический адрес в памяти
 



Цитата:
Как присвоить разным переменным значения %HH, %ii, %ss ?
Как я понимаю, нужно в отдельные переменные записать текущие значения часов, минут и секунд. Для этого существует встроеная библиотека Date.
Вот пример
Код:
1
2
3
4
5
6
7
8
9
10
 
Time = Date()  ; Узнаём текущее время
Hour=Hour(Time) ; Выделяем часы
Minute=Minute(Time) ; Выделяем минуты
Second=Second(Time) ; Выделяем секунды
 
Debug "Текущее время"
Debug Str(Hour)+"    Часов"
Debug Str(Minute)+"    Минут"
Debug Str(Second)+"    Секунд"


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 1:08 pm 
Не в сети
BackupUser
Аватар пользователя

Зарегистрирован: Ср ноя 29, 2006 9:29 pm
Сообщений: 1492
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Код:
1
2
3
 
Debug PeekS(@xxx)
 



Читаем справку про PeekS()
Оказывается, что эта функция For advanced programmers!
То есть!
Если у меня будут с ней проблемы, то, я недостаточно продвинутый.
Я воздержусь, пока, от этой функции.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 4:39 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
Цитата:
For advanced programmers!
Это касается только буржуев, мы же при любом раскладе "приручим" эти функции. :)


Цитата:
Если у меня будут с ней проблемы, то, я недостаточно продвинутый.
Я воздержусь, пока, от этой функции.
Воков боятся... :D
Функции из библиотеки Memory работают довольно стабильно (это не относится к PB4.10 и 4.20 :( ).
Они бывают порой просто не заменимы.
Например, если нужно молнеиносно обработать большой объём текста, то только с помощью их это сделать можно.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 5:20 pm 
Не в сети
BackupUser
Аватар пользователя

Зарегистрирован: Ср ноя 29, 2006 9:29 pm
Сообщений: 1492
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Например, если нужно молнеиносно обработать большой объём текста, то только с помощью их это сделать можно.

Обработка огромных массивов текста - это моё хобби, многолетнее, ежедневное.
Я это делаю ультраедитом, обрабатываю текст по 20-30 мБ обьёмом.
Я в Пурике даже прочитать такой обьём не смогу, файл, даже, не смогу такой открыть большой.
Много раз пытался - но.. знаниев не хватат, язЫков не знаю.(С)Чапаев В.И..


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 15, 2008 6:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
Цитата:
Я в Пурике даже прочитать такой обьём не смогу, файл, даже, не смогу такой открыть большой.
Ну открыть можно, с обработкой могут быть проблемы.
Давай поэсперементируем, откроем файл C:\WINDOWS\Driver Cache\i386\driver.cab имеющий размер почти 73Мб. :shock:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
If ReadFile(0,GetWindowsDirectory()+"\Driver Cache\i386\driver.cab")
 size=Lof(0)+1
 Debug "Размер файла "+Str(size)+" байт"
 Debug ""
 *mem=AllocateMemory(size)
 If *mem
  ReadData(0,*mem,size)
   For i=0 To 99
    Debug PeekC(*mem+i)
   Next i
  FreeMemory(*mem)
 Else
  MessageRequester("Упс", "Проблемы с памятью" + Chr(10) + "Не удалось зарезервировать "+StrF(size/1000000,3) +" Мб памяти", #MB_OK|#MB_ICONERROR)
 EndIf  
Else
 MessageRequester("Файл потерялся!", "Нету файла!" + Chr(10) + "Наверное где-то прячется.", #MB_OK|#MB_ICONERROR)
EndIf


Так вот, эти 73 метра грузятся в память :shock: а потом читаются первые 100 байт.

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 16, 2008 1:42 am 
Не в сети
доцент

Зарегистрирован: Пт июн 13, 2008 10:31 pm
Сообщений: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Как я понимаю, нужно в отдельные переменные записать текущие значения часов, минут и секунд. Для этого существует встроеная библиотека Date.
Вот пример
Код:
1
2
3
4
5
6
7
8
9
10
 
Time = Date()  ; Узнаём текущее время
Hour=Hour(Time) ; Выделяем часы
Minute=Minute(Time) ; Выделяем минуты
Second=Second(Time) ; Выделяем секунды
 
Debug "Текущее время"
Debug Str(Hour)+"    Часов"
Debug Str(Minute)+"    Минут"
Debug Str(Second)+"    Секунд"

[/quote]

да то что надо.
а как обстоит дело с милисекундами ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 16, 2008 6:37 am 
Не в сети
BackupUser
Аватар пользователя

Зарегистрирован: Ср ноя 29, 2006 9:29 pm
Сообщений: 1492
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Так вот, эти 73 метра грузятся в память :shock: а потом читаются первые 100 байт.

Действительно, таким способом открывается. Я раньше не догадался делать таким образом. Сегодня попробую его обработать дальше, потом отпишусь.

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу Пред.  1, 2, 3  След.

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


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

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


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

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