|
Вопросы о Trim5 Работа и применение контроллеров с сенсорной панелью Trim5. |
|
Опции темы | Поиск в этой теме |
26.03.2018, 14:58 | #1 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
C++/Trim 5
Доброго времени суток! У меня возникла проблема при компиляции проекта для работы с совмещенной памятью. Суть в том что я написал программу в Visual Studio, проработал алгоритм, производил отладку кода без использования библиотек shm.hpp. Все работало без проблем.
Когда речь зашла о переносе программы на Trim, у меня возникли проблемы... Сначала я пытался сделать это без тулчейна(напрямую), но без него как выяснилось намного сложнее скомпилировать собственную программу с участием shared memory. Решил воспользоваться предложенным образом для виртуальной машины линукс. У меня возникли следующие проблемы: 1. После копипаста рабочего принципа из Visual Studio в Netbeans, он подчеркивал желтой волной такие библиотеки(#include) как string, fstream, iostream, cstring и.т.д, а при копиляции выдал мне следующее Код:
rm -f main.o rlcutil.o rlinifile.o rlserial.o rlsharedmemory.o rlsocket.o rlthread.o rlwthread.o shm.o rm -f *~ core *.core ОЧИСТИТЬ SUCCESSFUL (общее время: 203мс) arm-linux-gnueabihf-g++ -c -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard -g -O0 -Wall -W -fPIE -I/opt/compiler_platform/compiled/mkspecs/linux-TIarmv7-sgx-g++ -I. -I. -o main.o main.cpp main.cpp:30:1: error: reference to ‘string’ is ambiguous string GetTime(){ ^ In file included from main.cpp:3:0: shm.hpp:23:7: note: candidates are: class string class string { ^ In file included from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iosfwd:39:0, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ios:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ostream:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iostream:39, from main.cpp:14: /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/bits/stringfwd.h:62:33: note: typedef class std::basic_string<char> std::string typedef basic_string<char> string; ^ main.cpp:30:1: error: ‘string’ does not name a type string GetTime(){ ^ main.cpp:40:14: error: template argument 1 is invalid vector<string> GetValues(vector<string> &buffer, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу ^ main.cpp:40:14: error: template argument 2 is invalid main.cpp:40:39: error: template argument 1 is invalid vector<string> GetValues(vector<string> &buffer, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу ^ main.cpp:40:39: error: template argument 2 is invalid main.cpp:40:63: error: template argument 1 is invalid vector<string> GetValues(vector<string> &buffer, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу ^ main.cpp:40:63: error: template argument 2 is invalid main.cpp: In function ‘int GetValues(int&, int&)’: main.cpp:47:2: error: reference to ‘string’ is ambiguous string buf; ^ In file included from main.cpp:3:0: shm.hpp:23:7: note: candidates are: class string class string { ^ In file included from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iosfwd:39:0, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ios:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ostream:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iostream:39, from main.cpp:14: /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/bits/stringfwd.h:62:33: note: typedef class std::basic_string<char> std::string typedef basic_string<char> string; ^ main.cpp:47:9: error: expected ‘;’ before ‘buf’ string buf; ^ main.cpp:52:10: error: ‘buf’ was not declared in this scope rec >> buf; ^ main.cpp:55:9: error: request for member ‘resize’ in ‘buffer’, which is of non-class type ‘int’ buffer.resize(num); ^ main.cpp:56:8: error: request for member ‘resize’ in ‘types’, which is of non-class type ‘int’ types.resize(num); ^ main.cpp:61:23: error: invalid types ‘int[int]’ for array subscript getline(rec, types[i], '.'); ^ main.cpp:62:24: error: invalid types ‘int[int]’ for array subscript getline(rec, buffer[i]); ^ main.cpp:63:19: error: invalid types ‘int[int]’ for array subscript cout << buffer[i] << " " << types[i] << endl; //для отладки(удалить) ^ main.cpp:63:39: error: invalid types ‘int[int]’ for array subscript cout << buffer[i] << " " << types[i] << endl; //для отладки(удалить) ^ main.cpp:67:19: error: ‘WriteFirst’ was not declared in this scope WriteFirst(buffer); ^ main.cpp:69:17: warning: left operand of comma operator has no effect [-Wunused-value] return buffer, types; // ^ main.cpp:48:7: warning: unused variable ‘buff’ [-Wunused-variable] char buff[20];//пересчет ^ main.cpp: At global scope: main.cpp:72:1: error: reference to ‘string’ is ambiguous string GetFilename() { //Определение имени для файла с учетом текущей даты ^ In file included from main.cpp:3:0: shm.hpp:23:7: note: candidates are: class string class string { ^ In file included from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iosfwd:39:0, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ios:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ostream:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iostream:39, from main.cpp:14: /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/bits/stringfwd.h:62:33: note: typedef class std::basic_string<char> std::string typedef basic_string<char> string; ^ main.cpp:72:1: error: ‘string’ does not name a type string GetFilename() { //Определение имени для файла с учетом текущей даты ^ main.cpp:84:30: error: template argument 1 is invalid void WriteFirst(vector<string> &buffer) { ^ main.cpp:84:30: error: template argument 2 is invalid main.cpp: In function ‘void WriteFirst(int&)’: main.cpp:86:27: error: ‘GetFilename’ was not declared in this scope ofstream out(GetFilename(), ios::app); ^ main.cpp:88:22: error: request for member ‘size’ in ‘buffer’, which is of non-class type ‘int’ while (num < buffer.size()) { ^ main.cpp:89:20: error: request for member ‘size’ in ‘buffer’, which is of non-class type ‘int’ if (num < buffer.size() - 1) { ^ main.cpp:90:21: error: invalid types ‘int[int]’ for array subscript out << buffer[num] << ";" << setw(15); ^ main.cpp:94:21: error: invalid types ‘int[int]’ for array subscript out << buffer[num] << endl; ^ main.cpp: At global scope: main.cpp:101:28: error: template argument 1 is invalid void InitFBD(vector<string> &buffer, vector<string> &types) { ^ main.cpp:101:28: error: template argument 2 is invalid main.cpp:101:52: error: template argument 1 is invalid void InitFBD(vector<string> &buffer, vector<string> &types) { ^ main.cpp:101:52: error: template argument 2 is invalid main.cpp: In function ‘void InitFBD(int&, int&)’: main.cpp:104:30: error: request for member ‘size’ in ‘buffer’, which is of non-class type ‘int’ for (num = 0; num < buffer.size(); num++) { ^ main.cpp:105:17: error: invalid types ‘int[int]’ for array subscript if (types[num] == "bool" && mymem.getType(buffer[num].c_str()) == BOOL) ^ main.cpp:105:32: error: ‘mymem’ was not declared in this scope if (types[num] == "bool" && mymem.getType(buffer[num].c_str()) == BOOL) ^ main.cpp:105:56: error: invalid types ‘int[int]’ for array subscript if (types[num] == "bool" && mymem.getType(buffer[num].c_str()) == BOOL) ^ main.cpp:107:22: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "float" && mymem.getType(buffer[num].c_str()) == FLOAT) ^ main.cpp:107:62: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "float" && mymem.getType(buffer[num].c_str()) == FLOAT) ^ main.cpp:109:22: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "short" && mymem.getType(buffer[num].c_str()) == SHORT) ^ main.cpp:109:62: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "short" && mymem.getType(buffer[num].c_str()) == SHORT) ^ main.cpp:111:22: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "long" && mymem.getType(buffer[num].c_str()) == LONG) ^ main.cpp:111:61: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "long" && mymem.getType(buffer[num].c_str()) == LONG) ^ main.cpp:115:7: error: ‘mymem’ was not declared in this scope if (mymem.getType("Eject") != BOOL) ^ main.cpp:117:7: error: ‘mymem’ was not declared in this scope if (mymem.getType("FreeDiskSpace") != FLOAT) ^ main.cpp:103:8: warning: unused variable ‘init’ [-Wunused-variable] bool init = false; ^ main.cpp: At global scope: main.cpp:121:31: error: template argument 1 is invalid bool CompareFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { //Постоянная проверка и экстримальная запись по изм. ^ main.cpp:121:31: error: template argument 2 is invalid main.cpp:121:55: error: template argument 1 is invalid bool CompareFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { //Постоянная проверка и экстримальная запись по изм. ^ main.cpp:121:55: error: template argument 2 is invalid main.cpp:121:78: error: template argument 1 is invalid bool CompareFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { //Постоянная проверка и экстримальная запись по изм. ^ main.cpp:121:78: error: template argument 2 is invalid main.cpp: In function ‘bool CompareFBD(int&, int&, int&)’: main.cpp:123:10: error: request for member ‘resize’ in ‘values’, which is of non-class type ‘int’ values.resize(buffer.size()); ^ main.cpp:123:24: error: request for member ‘size’ in ‘buffer’, which is of non-class type ‘int’ values.resize(buffer.size()); ^ main.cpp:126:31: error: request for member ‘size’ in ‘values’, which is of non-class type ‘int’ for (num = 0; num < values.size(); num++) ^ main.cpp:127:18: error: invalid types ‘int[int]’ for array subscript if (types[num] == "bool" && mymem.GetBool(buffer[num].c_str()) != values[num]) ^ main.cpp:127:33: error: ‘mymem’ was not declared in this scope if (types[num] == "bool" && mymem.GetBool(buffer[num].c_str()) != values[num]) ^ main.cpp:127:57: error: invalid types ‘int[int]’ for array subscript if (types[num] == "bool" && mymem.GetBool(buffer[num].c_str()) != values[num]) ^ main.cpp:127:81: error: invalid types ‘int[int]’ for array subscript if (types[num] == "bool" && mymem.GetBool(buffer[num].c_str()) != values[num]) ^ main.cpp: At global scope: main.cpp:133:15: error: template argument 1 is invalid vector<string> GetFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { ^ main.cpp:133:15: error: template argument 2 is invalid main.cpp:133:37: error: template argument 1 is invalid vector<string> GetFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { ^ main.cpp:133:37: error: template argument 2 is invalid main.cpp:133:61: error: template argument 1 is invalid vector<string> GetFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { ^ main.cpp:133:61: error: template argument 2 is invalid main.cpp:133:84: error: template argument 1 is invalid vector<string> GetFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { ^ main.cpp:133:84: error: template argument 2 is invalid main.cpp: In function ‘int GetFBD(int&, int&, int&)’: main.cpp:135:30: error: request for member ‘size’ in ‘values’, which is of non-class type ‘int’ for (num = 0; num < values.size(); num++) ^ main.cpp:136:17: error: invalid types ‘int[int]’ for array subscript if (types[num] == "bool") { ^ main.cpp:137:15: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetBool((buffer[num].c_str()))); ^ main.cpp:137:29: error: ‘mymem’ was not declared in this scope values[num] = to_string(mymem.GetBool((buffer[num].c_str()))); ^ main.cpp:137:54: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetBool((buffer[num].c_str()))); ^ main.cpp:137:65: error: ‘to_string’ was not declared in this scope values[num] = to_string(mymem.GetBool((buffer[num].c_str()))); ^ main.cpp:140:22: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "float") { ^ main.cpp:141:15: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetFloat((buffer[num].c_str()))); ^ main.cpp:141:29: error: ‘mymem’ was not declared in this scope values[num] = to_string(mymem.GetFloat((buffer[num].c_str()))); ^ main.cpp:141:55: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetFloat((buffer[num].c_str()))); ^ main.cpp:141:66: error: ‘to_string’ was not declared in this scope values[num] = to_string(mymem.GetFloat((buffer[num].c_str()))); ^ main.cpp:144:22: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "int") { ^ main.cpp:145:15: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetShort((buffer[num].c_str()))); ^ main.cpp:145:29: error: ‘mymem’ was not declared in this scope values[num] = to_string(mymem.GetShort((buffer[num].c_str()))); ^ main.cpp:145:55: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetShort((buffer[num].c_str()))); ^ main.cpp:145:66: error: ‘to_string’ was not declared in this scope values[num] = to_string(mymem.GetShort((buffer[num].c_str()))); ^ main.cpp:148:22: error: invalid types ‘int[int]’ for array subscript else if (types[num] == "long") ^ main.cpp:149:15: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetLong((buffer[num].c_str()))); ^ main.cpp:149:29: error: ‘mymem’ was not declared in this scope values[num] = to_string(mymem.GetLong((buffer[num].c_str()))); ^ main.cpp:149:54: error: invalid types ‘int[int]’ for array subscript values[num] = to_string(mymem.GetLong((buffer[num].c_str()))); ^ main.cpp:149:65: error: ‘to_string’ was not declared in this scope values[num] = to_string(mymem.GetLong((buffer[num].c_str()))); ^ main.cpp: At global scope: main.cpp:153:30: error: template argument 1 is invalid void WriteVals(vector<string> &values) { //Запись самого лога в текстовый файл. ^ main.cpp:153:30: error: template argument 2 is invalid main.cpp: In function ‘void WriteVals(int&)’: main.cpp:160:3: error: reference to ‘string’ is ambiguous string buf; ^ In file included from main.cpp:3:0: shm.hpp:23:7: note: candidates are: class string class string { ^ In file included from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iosfwd:39:0, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ios:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/ostream:38, from /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/iostream:39, from main.cpp:14: /opt/compiler_platform/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/arm-linux-gnueabihf/include/c++/4.8.3/bits/stringfwd.h:62:33: note: typedef class std::basic_string<char> std::string typedef basic_string<char> string; ^ main.cpp:160:10: error: expected ‘;’ before ‘buf’ string buf; ^ main.cpp:161:28: error: ‘GetFilename’ was not declared in this scope ofstream out(GetFilename(), ios::app); ^ main.cpp:162:18: error: ‘GetTime’ was not declared in this scope out << GetTime() << ";" << setw(15); ^ main.cpp:163:23: error: request for member ‘size’ in ‘values’, which is of non-class type ‘int’ while (num < values.size()) { ^ main.cpp:165:21: error: request for member ‘size’ in ‘values’, which is of non-class type ‘int’ if (num < values.size() - 1) { ^ main.cpp:166:22: error: invalid types ‘int[int]’ for array subscript out << values[num] << ";" << setw(15); ^ main.cpp:170:22: error: invalid types ‘int[int]’ for array subscript out << values[num] << endl << setw(15); ^ main.cpp: In function ‘int main()’: main.cpp:180:16: error: template argument 1 is invalid vector<string> buffer; ^ main.cpp:180:16: error: template argument 2 is invalid main.cpp:180:24: error: invalid type in declaration before ‘;’ token vector<string> buffer; ^ main.cpp:181:16: error: template argument 1 is invalid vector<string> types; ^ main.cpp:181:16: error: template argument 2 is invalid main.cpp:181:23: error: invalid type in declaration before ‘;’ token vector<string> types; ^ main.cpp:182:16: error: template argument 1 is invalid vector<string> values; ^ main.cpp:182:16: error: template argument 2 is invalid main.cpp:182:24: error: invalid type in declaration before ‘;’ token vector<string> values; ^ make: *** [main.o] Ошибка 1 ПОСТРОИТЬ FAILED (значение выхода 2, общее время: 1s) Вот сам код (без включений rlcutil, rlinifile, rlserial, rlsharedmemory и.т.д): Код:
#define _CRT_SECURE_NO_WARNINGS #include "shm.hpp" #include <string> #include <cstring> #include <cstdlib> #include <ctime> #include <iostream> #include <fstream> #include <vector> #include <iomanip> #include <sys/vfs.h> #include <sys/mount.h> #define MY_FLASH_FILENAME "/media/u1/" #define FLASH_MOUNT_DIR "/media/u1" #define TYPE_VFAT 0x4d44 using namespace std; struct tm *mytime; // временная структура string GetTime() { char timebuf[10]; time_t now; time(&now); mytime = localtime(&now); strftime(timebuf, 10, "%H:%M", mytime); string logtime = string(timebuf); return logtime; } vector<string> GetValues(vector<string> &buffer, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу struct statfs flash_fs; statfs(FLASH_MOUNT_DIR, &flash_fs); if (flash_fs.f_type != TYPE_VFAT) exit(1); string buf; char buff[20];//пересчет int num = 0; ifstream rec("/media/u1/vals.txt"); while (!rec.eof()) { rec >> buf; num++; } buffer.resize(num); types.resize(num); rec.seekg(0, ios::beg); //возврат потока в начало файла rec.clear(); for (int i = 0; i < num; i++) { getline(rec, types[i], '.'); getline(rec, buffer[i]); cout << buffer[i] << " " << types[i] << endl; //для отладки(удалить) } rec.close(); WriteFirst(buffer); return buffer, types; // } string GetFilename() { //Определение имени для файла с учетом текущей даты time_t date; time(&date); mytime = localtime(&date); char buffer[20]; string data; string ext = " log.txt"; strftime(buffer, 20, "%d.%m.%Y", mytime); // dd.mm.yy data = MY_FLASH_FILENAME + string(buffer) + ext; // dd.mm.yy + log.txt return data; } void WriteFirst(vector<string> &buffer) { int num = 0; ofstream out(GetFilename(), ios::app); out << "Время;" << setw(15); while (num < buffer.size()) { if (num < buffer.size() - 1) { out << buffer[num] << ";" << setw(15); num++; } else { out << buffer[num] << endl; num++; } } out.close(); } void InitFBD(vector<string> &buffer, vector<string> &types) { int num; bool init = false; for (num = 0; num < buffer.size(); num++) { if (types[num] == "bool" && mymem.getType(buffer[num].c_str()) == BOOL) continue; else if (types[num] == "float" && mymem.getType(buffer[num].c_str()) == FLOAT) continue; else if (types[num] == "short" && mymem.getType(buffer[num].c_str()) == SHORT) continue; else if (types[num] == "long" && mymem.getType(buffer[num].c_str()) == LONG) continue; else exit(1); } if (mymem.getType("Eject") != BOOL) exit(1); if (mymem.getType("FreeDiskSpace") != FLOAT) exit(1); } bool CompareFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { //Постоянная проверка и экстримальная запись по изм. int num; values.resize(buffer.size()); bool change = false; while (!change) { for (num = 0; num < values.size(); num++) if (types[num] == "bool" && mymem.GetBool(buffer[num].c_str()) != values[num]) return true; } return change; } vector<string> GetFBD(vector<string> &buffer, vector<string> &types, vector<string> &values) { int num; for (num = 0; num < values.size(); num++) if (types[num] == "bool") { values[num] = to_string(mymem.GetBool((buffer[num].c_str()))); continue; } else if (types[num] == "float") { values[num] = to_string(mymem.GetFloat((buffer[num].c_str()))); continue; } else if (types[num] == "int") { values[num] = to_string(mymem.GetShort((buffer[num].c_str()))); continue; } else if (types[num] == "long") values[num] = to_string(mymem.GetLong((buffer[num].c_str()))); return values; } void WriteVals(vector<string> &values) { //Запись самого лога в текстовый файл. struct statfs flash_fs; statfs(FLASH_MOUNT_DIR, &flash_fs); if (flash_fs.f_type != TYPE_VFAT) return; int num = 0; string buf; ofstream out(GetFilename(), ios::app); out << GetTime() << ";" << setw(15); while (num < values.size()) { if (num < values.size() - 1) { out << values[num] << ";" << setw(15); num++; } else { out << values[num] << endl << setw(15); num++; } } out.close(); } int main() { vector<string> buffer; vector<string> types; vector<string> values; Shm mymem("./load_files.srv"); GetValues(buffer, types); InitFBD(buffer, types); GetFBD(buffer, types, values); struct timespec tv; tv.tv_sec = 0; tv.tv_nsec = 1000000; while (1) { time_t timeto; timeto = time(NULL) + 600; do { nanosleep(&tv, NULL); if (CompareFBD(buffer, types, values)) break; } while (timeto > time(NULL)); // Функция сохранения значения в файл GetFBD(buffer, types, values); WriteVals(values); struct statfs flash_fs; statfs(FLASH_MOUNT_DIR, &flash_fs); if (flash_fs.f_type == TYPE_VFAT) { float FreeDiskSpace = (float)flash_fs.f_bfree / (float)flash_fs.f_blocks * 100.0; mymem.setFloat("FreeDiskSpace", FreeDiskSpace); } else mymem.setFloat("FreeDiskSpace", 0.0); if (mymem.getBool("Eject")) { umount(FLASH_MOUNT_DIR); } } } Что можно сделать? Последний раз редактировалось maxitronix, 26.03.2018 в 15:10 |
26.03.2018, 15:05 | #2 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: C++/Trim 5
Цитата:
Именно поэтому мы не оказываем техподдержку такого уровня. Программист либо сам может разобраться, либо, простите, ему нечего делать в автоматике на настолько низком уровне процессов. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
26.03.2018, 15:22 | #3 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Gromov, Вы имели ввиду перепилить программу под те библиотеки которые признает данный комплект? Например вместо string, использовать char* ?
Дело в том что я только знакомлюсь с программированием, и решаю проблемы по мере поступления. Я не совсем понял откуда берется каталог библиотек и как его обновить. И самое обидное что все эти библиотеки считаются стандартными =( никакой отсебятины. |
26.03.2018, 15:31 | #4 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: C++/Trim 5
Одно дело - кодить под виндоус, другое - под встраиваемый линукс.
Ну и, на мой взгляд, начинать программирование контроллеров надо всё-таки с того, что используется штатно. У нас это SMLogix. Если вы не можете решить поставленную задачу средствами smlogix в силу ограничений функционала - тогда уже можно заморачиваться с плюсами. Однако, в этом случае нужно знать архитектуру линукс и очень желательно иметь хоть какой-то опыт компиляции под командной строкой. Я думаю, вам следует начать с написания кода под RPi3, под него много примеров. А позже почти все знания, полученные в ходе обучения RPi3 пригодятся и для Trim5, потому что операционная система имеет общие корни - это Debian. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
26.03.2018, 15:46 | #5 | |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Цитата:
|
|
27.03.2018, 08:49 | #6 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Если подскажете- буду признателен. Если подготовленный в VM проект попробую скомпилировать на Триме(там все нужные библиотеки точно есть), что из этого получится?
|
27.03.2018, 09:17 | #7 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: C++/Trim 5
Зависит от того, что вы умеете. Надо поставить компилятор туда, добавить библиотеки, написать makefile.
На мой взгляд, проще сразу кодить на триме тогда уж. Тут либо использовать тулчейн с кросскомпилятором, и иметь проблемы с виртуальной машиной и кросс компиляцией, но не иметь проблем с библиотеками, либо писать и компилить сразу на целевой платформе, иметь проблемы с библиотеками, но не иметь проблем кросс-компиляции и отладки. Лично я выбираю тот путь, который позволяет решить задачу быстрее. Например, чтобы написать какую-нибудь маленькую утилиту, я охотнее буду использовать компиляцию на контроллере. Но если проект более серьёзный и задачи обширны, тут уже удобнее использовать нетбинс. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
27.03.2018, 09:54 | #8 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Я бы с радостью пользовался виртуалкой, если бы знал как туда залить недостающие библиотеки. fstream например.
Потому что свой Makefile я точно не построю в ближайшее время *_* |
27.03.2018, 11:46 | #9 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: C++/Trim 5
Цитата:
А ведь никто не хотел ничего плохого. Проектировщик просто не умел иначе. Инспектор просто хотел отправить жену на море. Эксплуатация просто ничего не хотела. Сотрудники кинотеатра просто хотели, чтобы не пролезали безбилетники. Никто не хотел ничего плохого, а дети сгорели. Вы сейчас в роли человека, который не хочет ничего плохого. И точно также не чувствует персональной ответственности за будущее. Задумайтесь. Вы задаёте вопросы уровня даже не первого курса института. Это уровень школьного кружка программирования. Вы уверены, что готовый автоматизировать техпроцесс, из-за которого могут пострадать люди? Вот прямо сознаёте свою ответственность за оборудование и за людей, работающих с этим оборудованием? Есть такая библейская поговорка: благими намерениями вымощена дорога в ад. Вы сейчас ровно по ней идёте. А Дмитрий по глупости вам помогает. Быть может, остановитесь и задумаетесь? У вас есть два варианта: 1) Нанять человека, который имеет профильный опыт 2) Идти в подмастерья к такому человеку Представьте, как вас оперирует хирург, и постит фотку в инстаграмм с подписью "ребята, помогите, что это за кишка и что с ней делать?". И задумайтесь. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
27.03.2018, 12:40 | #10 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Зачем так иронизировать то? :/
Мне нужно что бы заработала программа. Довольно простая... Для сбора статистики и записи в файл. Никому кран на голову не упадет и током не шарахнет из за того что я что то не так сделаю( С линуксом дела не имел вообще никогда. |
27.03.2018, 12:51 | #11 |
Senior Member
Регистрация: Jan 2012
Адрес: Саратов
Сообщения: 179
Благодарил(а): 1 раз(а)
Поблагодарили:
3 раз(а) в 3 сообщениях
|
Ответ: C++/Trim 5
Для записи в файл на сайте есть готовый рабочий пример "Регистратор"
|
27.03.2018, 12:52 | #12 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: C++/Trim 5
В примерах есть готовая программа для этого. Прямо внутри виртуальной машины и дополнительно на сайте.
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
27.03.2018, 14:34 | #13 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Я как раз опираясь на этот алгоритм и написал свою программу. Которая больше подходит под мой случай, т.к переменных нужно записывать много и выборочно, да еще и в нужном формате. Использовал для этого только 3 библиотеки которых не было в ваших примерах, но которые считаются стандартными. В вашей же сборке VM, IDE орет что у него таких библиотек нет. Весь труд на смарку
|
27.03.2018, 14:43 | #14 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: C++/Trim 5
Цитата:
Стандартные типы данных - это реально стандартные типы, а не то, что вы думаете. Типа данных "string" нет в C/C++. Стринг - это массив, объявленный одной из библиотек-контейнеров. Труд насмарку не из-за библиотек, а из-за того, что вы посчитали несущественным изучить доступный вам функционал и доступные вам библиотеки. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
27.03.2018, 15:11 | #15 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Ладно. Спасибо за ценные и не очень советы. Буду переделывать программу под тот набор что есть.. Хорошо хоть вектора есть.
|
28.03.2018, 13:27 | #16 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Разрешите задать еще один тупой вопрос.
Я разделил часть кода в которой инициализировались и считывались шмемы на несколько частей и обозначил эти части функциями. Код:
main.cpp:135: error: 'class Shm' has no member named 'GetBool' main.cpp:139: error: 'class Shm' has no member named 'GetFloat' main.cpp:143: error: 'class Shm' has no member named 'GetShort' main.cpp:147: error: 'class Shm' has no member named 'GetLong' |
28.03.2018, 13:28 | #17 | |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Цитата:
|
|
28.03.2018, 13:57 | #18 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: C++/Trim 5
Просто гуглите ошибку и находите массу ответов.
__________________ В сегнетиксе не работаю с самого начала 2019 года. |
29.03.2018, 13:40 | #19 | |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Цитата:
В одной части кода, где использованы методы "GetBool" и др., все в порядке. А в другой выдает такие ошибки. Мозг набекрень уже |
|
29.03.2018, 13:46 | #20 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: C++/Trim 5
Как уже заметил Арсений, в таком случае, стоит задуматься. Потому что области видимости и время жизни переменных проходятся в первом десятке уроков по с++.
__________________ В сегнетиксе не работаю с самого начала 2019 года. |
29.03.2018, 13:50 | #21 | |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Цитата:
В конце концов после добавления объекта класса "shm" в аргументы тех функций ничего не изменилось И раз уж вы меня за круглого идиота держите- глобализация объекта тоже никаких результатов не дала |
|
29.03.2018, 14:01 | #22 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: C++/Trim 5
В конце концов, в том коде, что вы прикладываете в первом сообщении вообще всё плохо с объявлением класса разделяемой памяти и его использованием.
__________________ В сегнетиксе не работаю с самого начала 2019 года. |
29.03.2018, 14:04 | #23 | |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Цитата:
Код:
#include "shm.hpp" #include <sys/vfs.h> #include <sys/mount.h> #include <string> #include <stdio.h> #include <cstring> #include <cstdlib> #include <ctime> #include <iostream> #include <fstream> #include <vector> #include <iomanip> #define MY_FLASH_FILENAME "/media/u1/" #define FLASH_MOUNT_DIR "/media/u1" #define TYPE_VFAT 0x4d44 using std::string; struct tm *mytime; // временная структура string GetTime() { char timebuf[10]; time_t now; time(&now); mytime = localtime(&now); strftime(timebuf, 10, "%H:%M", mytime); string logtime = string(timebuf); return logtime; } string GetFilename() { //Определение имени для файла с учетом текущей даты time_t date; time(&date); mytime = localtime(&date); char buffer[20]; string data; string ext = " log.txt"; strftime(buffer, 20, "%d.%m.%Y", mytime); // dd.mm.yy data = MY_FLASH_FILENAME + string(buffer) + ext; // dd.mm.yy + log.txt return data; } void WriteFirst(vector<string> &buffer) { int num = 0; ofstream out(GetFilename().c_str(), ios::app); out << "Время;" << setw(15); while (num < buffer.size()) { if (num < buffer.size() - 1) { out << buffer[num] << ";" << setw(15); num++; } else { out << buffer[num] << endl; num++; } } out.close(); } vector<string> GetValues(vector<string> &buffer, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу struct statfs flash_fs; statfs(FLASH_MOUNT_DIR, &flash_fs); if (flash_fs.f_type != TYPE_VFAT) exit(1); string buf; int num = 0; ifstream rec("/media/u1/vals.txt"); while (!rec.eof()) { rec >> buf; num++; } buffer.resize(num); types.resize(num); rec.seekg(0, ios::beg); //возврат потока в начало файла rec.clear(); for (int i = 0; i < num; i++) { getline(rec, types[i], '.'); getline(rec, buffer[i]); cout << buffer[i] << " " << types[i] << endl; //для отладки(удалить) } rec.close(); WriteFirst(buffer); return buffer, types; // } void InitFBD(vector<string> &buffer, vector<string> &types, Shm mymem) { int num; for (num = 0; num < buffer.size(); num++) { if (types[num] == "bool" && mymem.getType(buffer[num].c_str()) == BOOL) continue; else if (types[num] == "float" && mymem.getType(buffer[num].c_str()) == FLOAT) continue; else if (types[num] == "short" && mymem.getType(buffer[num].c_str()) == SHORT) continue; else if (types[num] == "long" && mymem.getType(buffer[num].c_str()) == LONG) continue; else exit(1); } if (mymem.getType("Eject") != BOOL) exit(1); if (mymem.getType("FreeDiskSpace") != FLOAT) exit(1); } bool CompareFBD(vector<string> &buffer, vector<string> &types, vector<string> &values, Shm mymem) { //Постоянная проверка и экстримальная запись по изм. int num; values.resize(buffer.size()); bool change = false; while (!change) { for (num = 0; num < values.size(); num++) if (types[num] == "bool" && mymem.GetBool(buffer[num].c_str()) != values[num]) return true; } return change; } vector<string> GetFBD(vector<string> &buffer, vector<string> &types, vector<string> &values, Shm mymem) { int num; for (num = 0; num < values.size(); num++) if (types[num] == "bool") { values[num] = string(mymem.GetBool(buffer[num].c_str())); continue; } else if (types[num] == "float") { values[num] = string(mymem.GetFloat(buffer[num].c_str())); continue; } else if (types[num] == "int") { values[num] = string(mymem.GetShort(buffer[num].c_str())); continue; } else if (types[num] == "long") values[num] = string(mymem.GetLong(buffer[num].c_str())); return values; } void WriteVals(vector<string> &values) { //Запись самого лога в текстовый файл. struct statfs flash_fs; statfs(FLASH_MOUNT_DIR, &flash_fs); if (flash_fs.f_type != TYPE_VFAT) return; int num = 0; string buf; ofstream out(GetFilename().c_str() , ios::app); out << GetTime() << ";" << setw(15); while (num < values.size()) { if (num < values.size() - 1) { out << values[num] << ";" << setw(15); num++; } else { out << values[num] << endl << setw(15); num++; } } out.close(); } int main() { Shm mymem("./load_files.srv"); vector<string> buffer; vector<string> types; vector<string> values; GetValues(buffer, types); InitFBD(buffer, types, mymem); GetFBD(buffer, types, values, mymem); struct timespec tv; tv.tv_sec = 0; tv.tv_nsec = 1000000; while (1) { time_t timeto; timeto = time(NULL) + 600; do { nanosleep(&tv, NULL); if (CompareFBD(buffer, types, values, mymem)) break; } while (timeto > time(NULL)); // Функция сохранения значения в файл GetFBD(buffer, types, values, mymem); WriteVals(values); struct statfs flash_fs; statfs(FLASH_MOUNT_DIR, &flash_fs); if (flash_fs.f_type == TYPE_VFAT) { float FreeDiskSpace = (float)flash_fs.f_bfree / (float)flash_fs.f_blocks * 100.0; mymem.setFloat("FreeDiskSpace", FreeDiskSpace); } else mymem.setFloat("FreeDiskSpace", 0.0); if (mymem.getBool("Eject")) { umount(FLASH_MOUNT_DIR); } } } |
|
29.03.2018, 14:31 | #24 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: C++/Trim 5
У вас в коде нарушены фундаментальные основы языка С/C++.
Извините, но техническая поддержка вам ничем помочь не может. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
29.03.2018, 14:49 | #25 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Ага. Всего доброго.
P.S На поддержку то не особо похоже |
29.03.2018, 15:00 | #26 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: C++/Trim 5
Понимаете, я нашел ошибку в вашем коде менее чем за минуту. Вы мучаетесь с этим делом уже не первый день, при том, что у вас немногим больше ста строк живого кода.
Я не знаю, чем вы здесь занимаетесь. Но на мой взгляд, следует уделить больше внимания стандартным вещам, а потом, после нескольких удачных испытаний, пытаться переработать их под свои нужды. Дам вам последнюю подсказку: В том классе, метод которого вы вызываете, действительно нет такого метода. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
29.03.2018, 15:10 | #27 |
Member
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: C++/Trim 5
Прописная.........
|
29.03.2018, 18:08 | #28 |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: C++/Trim 5
Я не из поддержки, но хочу заметить, что не стоит изучать C/C++ на примере программирования контроллера. Это небезопасно, можно легко отстрелить себе ногу.
Если хотите запрограммировать логгер, то попробуйте это сделать на языке Go с использованием Modbus. В этом случае вы сможете и отлаживать, и компилировать программу полностью на Windows и виртуальная машина вам совсем не понадобится. И Go будет сопротивляться до последнего попыткам стрелять по ногам. Про использование Go я писал в этой теме: Альтернатива для C/C++ на Trim5/SMH4 |