запись массива чисел Integer в двоичный файл

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
mike ordin
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 24.05.2005 (Вт) 9:31

запись массива чисел Integer в двоичный файл

Сообщение mike ordin » 24.05.2005 (Вт) 9:33

помогите разобраться, пожалуйста. Есть большой массив целых чисел в формате Integer (числа служат для вывода
косинусоиды). Его надо поместить в двоичный файл. к сожалению, после того, как массив записывается в файл, числа
в нем меняются. то же самое происходит и при присвоении правильного массива пустому массиву. Нижн привожу
используемый мной код.

Private Sub Form_Load()
Dim length As Integer
Dim i As Integer
Dim freq As Double
Dim arg As Double
Dim pi As Double
Dim x() As Integer
Dim y() As Integer

‘calculate cosine values
pi = 4 * Atn(1)
length = 8000
freq = 0.025
arg = 2 * pi * freq
ReDim x(8000)
Redim y(8000)

For i = 0 To length
x(i) = Int(32000 * Cos(i * arg))
Debug.Print x(i)
i = i + 1
Next i
'up to this point it works ok - to check see debug.print and
'plot it in excel - you will get a perfect cosine
‘Now I need to write these values into binary file and save it as dat file

Open "c:\output.dat" For Binary As #1
'For i = 1 To length
Put #1, , x(i)
Next i
Close#1
‘dat file contains incorrect values

End Sub

если я присваиваю массиву y() знаяения массива x() и в окне debug печатаю значения массива y() и потом вывожу их
в Excel и строю по ним график, то получаю уже не косинусоиду. Хотя изначально массив x() содержит правильные
значения для построения косинусоиды.

Помогите, пожалуйста, разобраться с этой проблемой

И еще, где можно найти доступную для понимания но подробную информацию по использованию SAPI

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 24.05.2005 (Вт) 10:31

Ну.... Во-первых, массив не меняется при копировании. Видимо у тебя где-то проблема с его переносом в Exclel. Во-вторых, по всей видимости ты не правильно сохраняешь в файл. Поищи там ошибки.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 24.05.2005 (Вт) 10:40

Код: Выделить всё
For i = 0 To length
...
i = i + 1
Next i

Переменная i в цикле дважды инкрементируется...

Для записи массива в файл цикл использовать не нужно, достаточно просто:
Код: Выделить всё
Put #1, , x


Не видно как массив копируется и как файл читается...

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: запись массива чисел Integer в двоичный файл

Сообщение codemaster » 24.05.2005 (Вт) 10:47

mike ordin писал(а): используемый мной код.

Private Sub Form_Load()


Open "c:\output.dat" For Binary As #1
'For i = 1 To length
Put #1, , x(i)
Next i
Close#1
‘dat file contains incorrect values

End Sub


Очень странный способ писать массив в файл!? :wink:
зачем для записи перебирать массив поэлементно ?


SAPI подробно описан + примеры в MSDN
(комиксов с SAPI нигде пока не видел )
//<-
Mit freundlichen Grüßen
//->

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 24.05.2005 (Вт) 11:44

Значения все корректные, ты просто не умеешь их готовить :). См. код - там идет проверка валидности твоих значений. Думаю, разберешься.
Код: Выделить всё
Private Sub Form_Load()
Dim length As Integer
Dim i As Integer
Dim freq As Double
Dim arg As Double
Dim pi As Double
Dim x() As Integer
Dim y() As Integer

'calculate cosine values
pi = 4 * Atn(1)
length = 8000
freq = 0.025
arg = 2 * pi * freq
ReDim x(8000)
ReDim y(8000)

For i = 0 To length
x(i) = Int(32000 * Cos(i * arg))
Debug.Print x(i)
i = i + 1
Next i
'up to this point it works ok - to check see debug.print and
'plot it in excel - you will get a perfect cosine
'Now I need to write these values into binary file and save it as dat file

Open "c:\output.dat" For Binary As #1
For i = 1 To length
Put #1, , x(i)
Next i
Close #1
'dat file contains incorrect values
Open "c:\output.dat" For Binary As #2
For i = 1 To length
Get #2, , y(i)
Next i
Close #2
Open "c:\2.dat" For Output As #4
Open "c:\1.dat" For Output As #5
For i = 1 To length
Print #5, x(i)
Print #4, y(i)
Next i
Close #4
Close #5
End Sub

Открой файлы 1.dat и 2.dat и сравни.
Видимо проблема в передаче данных Экселю, кидай код, посмотрим.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

mike ordin
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 24.05.2005 (Вт) 9:31

Сообщение mike ordin » 24.05.2005 (Вт) 12:05

Oxygen
Спасибо всем большое. Извиняйте за такой простой вопрос. Работающий код такой:
Private Sub Form_Load()
Dim length As Integer
Dim i As Integer
Dim freq As Double
Dim arg As Double
Dim pi As Double
Dim x() As Integer

pi = 4 * Atn(1)

length = 8000
freq = 0.025
arg = 2 * pi * freq
ReDim x(8000)

For i = 0 To length
x(i) = Int(32000 * Cos(i * arg))
'Debug.Print x(i)
Next i

Open "c:\output.dat" For Binary As #1
Put #1, , x
Close #1

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 164

    TopList