Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 24

Чтение массива чисел из Memo

06.08.2012, 19:26. Показов 2836. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

У меня есть большой массив двузначных чисел в *.txt, который я при запуске программы сразу загружаю в memo1:
C++
1
2
3
4
void __fastcall TForm1::FormCreate(TObject *Sender) {
Memo1 -> Lines -> Clear();
Memo1 -> Lines -> LoadFromFile("Sample.txt"); 
}
Дальше я хочу, чтобы по кнопке TransmitBtnClick происходило чтение содержимого Memo1 (массив двузначных чисел) и передача по COM-порту на растерзание МК. Правильность передачи - контрольная сумма: находится сумма всех последовательно переданных чисел и сравнивается с принятой от контроллера суммы. Чтобы CRC не получилась сильно большого результата использую:

C++
1
2
3
while (CRC_Trans > 255){
CRC_Trans -= 255;
 }
Хоть убей не получается прочитать числа из memo1
Хэндл, ДЦБ, КомТаймОутс объявлены/настроены, все упирается в это чтение 2значных чисел

PS
Хотел раньше сразу грузить в Memo1 и сразу отправлять по COM`у с подсчетом контрольной суммы, но что-то подсказывает, что в одном потоке это не сделается...

C++
1
2
3
4
5
6
7
8
9
TStringList *list = new TStringList;
list->LoadFromFile("Sample.txt");
for(unsigned int i = 1; i<=list->Count; i++)
{
Memo1 -> Lines -> Append(list-> Strings[i]);
crc_trans += .....;
WriteFile(hFile,&crc_trans,1,&kto,NULL);
}
delete list;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2012, 19:26
Ответы с готовыми решениями:

Считывание массива чисел из файла и запись их в Memo
Помогите пожалуйста Есть файл, в нем в 1 столбик идет массив чисел X,кол-во элементов нам неизвестно, нужно написать программу, которая...

Дан двумерный массив.Получить последовательность чисел, получающуюся при чтение этого массива по спирали,по часовой стрелке начиная с середины массива
Не понимаю, как написать программу, выполняющую данную задачу, а вот понять хочется. Дан двумерный массив 9х9. Получить последовательность...

Чтение массива чисел из файла
Доброго времени суток, товарищи! Пишу программу, которое производит чтение и различные действия (сложение, умножение и т.д.) с матрицами,...

9
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.08.2012, 13:08
Иногда удобнее использовать STL вместо VCL, т.е. fstream

Как выглядит вообще файл?
Числа разделены пробелом или другим разделителем?
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 24
07.08.2012, 14:29  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Как выглядит вообще файл?
Файл представляет собой 8 массивов (каждый разделен пустой строкой) 64x64 одно-двузначных чисел, которые разделены между собой пробелом.

Часть из файла:
...
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 43 34 34 34 29 25 21 22 12 8 8 8 8 8 8 8 8 17 8 8 8 17 8 8 14 8 14 20 32 32 37 43 49 55 60 60 60 66 66 66 66 66 60 60 60 60 60 60 60
...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.08.2012, 16:31
C++
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
#include <fstream>
#include <vector>
#include <algorithm>  // std::copy
#include <iterator>    //  std::back_inserter
 
#include <memory> // std::auto_ptr
//----------------------- Variant STL ---------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
using namespace std;
 
vector<int> v;
ifstream ifs("1.txt");
if (ifs) copy(istream_iterator<int>(ifs),istream_iterator<int>(),back_inserter(v) );
else ShowMessage("Can't open file");
// вывод
for(size_t i=0; i<v.size(); i++) Memo1->Lines->Add(v[i]);
}
//-------------------------- Variant VCL ------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
std::auto_ptr<TStringList> SL (new TStringList);
std::vector<int> v;
 
try{ SL->LoadFromFile("1.txt"); }
catch(...){ ShowMessage("Can't open file"); }
 
SL->Delimiter=L' ';
SL->DelimitedText= SL->Text;
 
for(ssize_t i=0; i<SL->Count; i++)
  {
    int value=0;
    TryStrToInt(SL->Strings[i],value);
    v.push_back(value);
  }
// вывод
for(size_t i=0; i<v.size(); i++) Memo1->Lines->Add(v[i]);
}
//---------------------------------------------------------------------------
Добавлено через 4 минуты
В итоге получаем вектор всех чисел из файла.
1
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 24
08.08.2012, 13:31  [ТС]
Avazart
Хороший выход из данной проблемы. Спасибо большое!
удобнее использовать STL
Из двух представленных вариантов, выбор очевиден..

Есть еще один вопрос:

C++
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
#include <fstream>
#include <vector>
#include <algorithm>  // std::copy
#include <iterator>    //  std::back_inserter
 
#include <memory> // std::auto_ptr
 
HANDLE hFile;
DCB dcb;
COMMTIMEOUTS CommTimeOuts;
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
using namespace std;
 
vector<int> v;
ifstream ifs("Varu.txt");
if (ifs) copy(istream_iterator<int>(ifs),istream_iterator<int>(),back_inserter(v) );  //если файл открыт, заносим числа в динамический массив v[i]
else ShowMessage("Can't open file");  
 
for(size_t i=0; i<v.size(); i++) Memo1->Lines->Add(v[i]);  // вывод на форму
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned int crc_tx, temp;
DWORD kto;
 
PurgeComm(hFile,PURGE_TXCLEAR);               //очистить буфер передатчика
PurgeComm(hFile,PURGE_RXCLEAR);               //очистить буфер приемника
 
for(int i=0; i<=Memo1->Lines->Count;i++)      //перебор по строкам
{
temp = StrToInt(Memo1->Lines->Strings[i]);   //преобразование строки в целое
 
WriteFile(hFile,&temp,1,&kto,NULL);               //отправляем полученное число по COM
 
crc_tx+=temp;                                           //контрольная сумма 
while(crc_tx>=255) { crc_tx-=255;}              //чтобы контрольная сумма не была большой
Label1->Caption = crc_tx;                            //выводим значение на форму
}
 
//**********************[B]Контрольная сумма[/B]**********************************
 
/*Sleep(500);                                            //ожидание
 
ReadFile(hFile,&crc_rx,1,&kto,NULL);               //читаем ответ с МК 
AnsiString st;
if(crc_rx == crc_tx) st = "Передача завершена успешно";         //если суммы совпадают, то все норм
        else st = "Обнаружена ошибка в контрольной сумме";
st += "\nОтправлено: " + IntToStr((int)crc_tx)+ "\nПринято: "+IntToStr((int)crc_rx);
Application->MessageBoxA(st.c_str(),"Передача завершена",MB_OK);
 */
 
PurgeComm(hFile,PURGE_TXCLEAR);              //очистить буфер передатчика
PurgeComm(hFile,PURGE_RXCLEAR);              //очистить буфер приемника
}
При нажатии кнопки:
1. начинается перебор строк;
2. каждая строка конвертируется в целочисленное значени;
3. значение отпавляется по com`у;
4. считается сумма всех значений
5. сравниваются суммы crc_transmite & crc_receive

Однако мои кривые руки что-то не то делают при конвертировании строки в число: программа запускается (каждое число в собственной строке), как только нажимаю на кнопку появляется ошибка об Исключении класса EConverterError с сообщением "" is not a valid value
Подскажите, что я не так делаю?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.08.2012, 13:45
Однако мои кривые руки что-то не то делают при конвертировании строки в число: программа запускается (каждое число в собственной строке), как только нажимаю на кнопку появляется ошибка об Исключении класса EConverterError с сообщением "" is not a valid value
Подскажите, что я не так делаю?
C++
1
temp = StrToInt(Memo1->Lines->Strings[i]);
Так зачем конвертировать вообще ?
Используйте полученный вектор чисел.

C++
1
WriteFile(hFile,&v[i],1,&kto,NULL);
Добавлено через 5 минут
Эти действия мне не понятны...
C++
1
2
3
crc_t+=temp;                                           //контрольная сумма 
while(crc_t>=255) { crc_trans-=255;}          //чтобы контрольная сумма не была большой
Label1->Caption = crc_t;
Предположу что они несоответствуют методу нахождения CRC -суммы
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 24
08.08.2012, 15:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Предположу что они несоответствуют методу нахождения CRC -суммы
Извиняюсь, что ввел в заблуждение, это действительно не CRC - просто при упоминании выражения "контрольная сумма" первое, что приходит на ум crc, поэтому так и обозвал у себя переменную
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.08.2012, 16:02
Ну так что должно вычислятся ?

Добавлено через 4 минуты
http://all-ht.ru/inf/systems/p_0_13.html
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 24
08.08.2012, 16:37  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так что должно вычислятся ?
После отправки всех чисел по КОМ-порту, вычисляется сумма, оправленных чисел (поскольку элементов очень много, конечный результат окажется весьма большим, поэтому при достижении суммы >=255, применяется цикл while), на приемном конце вычисляется по тому же принципу сумма всех принятых чисел и это значение передается на ПК, а дальше сравниваются они между собой.

Подскажите, пожалуйста, каким образом можно сделать динамич. вектор v[i] общедоступным?
Связка с public в этом случае не помогает
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.08.2012, 20:38
Вынесете объявление вектора в хедер,поместите его в классе формы в разделе public и незабудьте подключит в хедере #include <vector>

Unit1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//...
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <vector>  // !!!!!
//---------------------------------------------------------------------------
 
// ...
 
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
           std::vector<int> v;  // !!!!! 
// ...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2012, 20:38
Помогаю со студенческими работами здесь

Чтение массива чисел из файла
Вот такое задание : Дан файл array.txt, содержащий последовательность целых чисел. Найти сумму этих чисел. Результат вывести на...

Введите целые числа в Memo. Создать массив нечетных чисел. Рассчитайте максимум негативных элементов массива
Ребят, нужна помощь C++ builder Введите целые числа в Memo. Создать массив нечетных чисел. Рассчитайте максимум негативных элементов...

Чтение из файла двумерного массива вещественных чисел
Добрый день! Установлен фортран pgi-f95 До этого месяца на фортране программировать не доводилось, сейчас вот возникла...

Чтение файла в Memo
procedure TForm1.RFF(); var f:TextFile; FN:String; begin FN:='file1.txt'; AssignFile(f,FN); Reset(f); while not Eof(f)...

Чтение из файла двумерного массива чисел (visual studio 2008)
Добрый день. Прошу помочь с чтением из файла двумерного вектора в visual studio 2008. На форуме видел множество примеров, но VS выдает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru