Segnetics

Вернуться   Segnetics > Форум Segnetics > Вопросы о Trim5

Вопросы о Trim5 Работа и применение контроллеров с сенсорной панелью Trim5.

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.03.2018, 14:58   #1
maxitronix
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)
Так же Netbean ругается на методы этих библиотек.



Вот сам код (без включений 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
maxitronix вне форума   Ответить с цитированием
Старый 26.03.2018, 15:05   #2
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Доброго времени суток! У меня возникла проблема при компиляции проекта для работы с совмещенной памятью. Суть в том что я написал программу в Visual Studio, проработал алгоритм, производил отладку кода без использования библиотек shm.hpp. Все работало без проблем.

Когда речь зашла о переносе программы на Trim, у меня возникли проблемы...
Сначала я пытался сделать это без тулчейна(напрямую), но без него как выяснилось намного сложнее скомпилировать собственную программу с участием shared memory. Решил воспользоваться предложенным образом для виртуальной машины линукс.

У меня возникли следующие проблемы:
1. После копипаста рабочего принципа из Visual Studio в Netbeans, он подчеркивал желтой волной такие библиотеки как string, fstream, iostream, cstring и.т.д, а при копиляции выдал мне следующее

Так же Netbean ругается на методы этих библиотек.



Что можно сделать?

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


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 26.03.2018, 15:22   #3
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Gromov, Вы имели ввиду перепилить программу под те библиотеки которые признает данный комплект? Например вместо string, использовать char* ?

Дело в том что я только знакомлюсь с программированием, и решаю проблемы по мере поступления. Я не совсем понял откуда берется каталог библиотек и как его обновить. И самое обидное что все эти библиотеки считаются стандартными =( никакой отсебятины.
maxitronix вне форума   Ответить с цитированием
Старый 26.03.2018, 15:31   #4
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: C++/Trim 5

Одно дело - кодить под виндоус, другое - под встраиваемый линукс.

Ну и, на мой взгляд, начинать программирование контроллеров надо всё-таки с того, что используется штатно. У нас это SMLogix. Если вы не можете решить поставленную задачу средствами smlogix в силу ограничений функционала - тогда уже можно заморачиваться с плюсами. Однако, в этом случае нужно знать архитектуру линукс и очень желательно иметь хоть какой-то опыт компиляции под командной строкой. Я думаю, вам следует начать с написания кода под RPi3, под него много примеров.

А позже почти все знания, полученные в ходе обучения RPi3 пригодятся и для Trim5, потому что операционная система имеет общие корни - это Debian.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 26.03.2018, 15:46   #5
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от Gromov Посмотреть сообщение
Одно дело - кодить под виндоус, другое - под встраиваемый линукс.

Ну и, на мой взгляд, начинать программирование контроллеров надо всё-таки с того, что используется штатно. У нас это SMLogix. Если вы не можете решить поставленную задачу средствами smlogix в силу ограничений функционала - тогда уже можно заморачиваться с плюсами. Однако, в этом случае нужно знать архитектуру линукс и очень желательно иметь хоть какой-то опыт компиляции под командной строкой. Я думаю, вам следует начать с написания кода под RPi3, под него много примеров.

А позже почти все знания, полученные в ходе обучения RPi3 пригодятся и для Trim5, потому что операционная система имеет общие корни - это Debian.
Буду разбираться
maxitronix вне форума   Ответить с цитированием
Старый 27.03.2018, 08:49   #6
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Если подскажете- буду признателен. Если подготовленный в VM проект попробую скомпилировать на Триме(там все нужные библиотеки точно есть), что из этого получится?
maxitronix вне форума   Ответить с цитированием
Старый 27.03.2018, 09:17   #7
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: C++/Trim 5

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

Лично я выбираю тот путь, который позволяет решить задачу быстрее. Например, чтобы написать какую-нибудь маленькую утилиту, я охотнее буду использовать компиляцию на контроллере. Но если проект более серьёзный и задачи обширны, тут уже удобнее использовать нетбинс.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 27.03.2018, 09:54   #8
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Я бы с радостью пользовался виртуалкой, если бы знал как туда залить недостающие библиотеки. fstream например.
Потому что свой Makefile я точно не построю в ближайшее время *_*
maxitronix вне форума   Ответить с цитированием
Старый 27.03.2018, 11:46   #9
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Я бы с радостью пользовался виртуалкой, если бы знал как туда залить недостающие библиотеки. fstream например.
Потому что свой Makefile я точно не построю в ближайшее время *_*
Позавчера в Кемерово сгорели дети. Целая цепочка безответственных людей. Кто-то плохо сделал ППС. Кто-то её плохо проверил. Кто-то плохо обслуживал. В результате случилось то, что случилось.

А ведь никто не хотел ничего плохого. Проектировщик просто не умел иначе. Инспектор просто хотел отправить жену на море. Эксплуатация просто ничего не хотела. Сотрудники кинотеатра просто хотели, чтобы не пролезали безбилетники. Никто не хотел ничего плохого, а дети сгорели.

Вы сейчас в роли человека, который не хочет ничего плохого. И точно также не чувствует персональной ответственности за будущее.

Задумайтесь. Вы задаёте вопросы уровня даже не первого курса института. Это уровень школьного кружка программирования. Вы уверены, что готовый автоматизировать техпроцесс, из-за которого могут пострадать люди? Вот прямо сознаёте свою ответственность за оборудование и за людей, работающих с этим оборудованием?

Есть такая библейская поговорка: благими намерениями вымощена дорога в ад. Вы сейчас ровно по ней идёте. А Дмитрий по глупости вам помогает.

Быть может, остановитесь и задумаетесь?

У вас есть два варианта:

1) Нанять человека, который имеет профильный опыт

2) Идти в подмастерья к такому человеку

Представьте, как вас оперирует хирург, и постит фотку в инстаграмм с подписью "ребята, помогите, что это за кишка и что с ней делать?". И задумайтесь.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 27.03.2018, 12:40   #10
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Зачем так иронизировать то? :/
Мне нужно что бы заработала программа. Довольно простая... Для сбора статистики и записи в файл. Никому кран на голову не упадет и током не шарахнет из за того что я что то не так сделаю(

С линуксом дела не имел вообще никогда.
maxitronix вне форума   Ответить с цитированием
Старый 27.03.2018, 12:51   #11
СВМ
Senior Member
 
Регистрация: Jan 2012
Адрес: Саратов
Сообщения: 179
Благодарил(а): 1 раз(а)
Поблагодарили: 3 раз(а) в 3 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Зачем так иронизировать то? :/
Мне нужно что бы заработала программа. Довольно простая... Для сбора статистики и записи в файл. Никому кран на голову не упадет и током не шарахнет из за того что я что то не так сделаю(

С линуксом дела не имел вообще никогда.
Для записи в файл на сайте есть готовый рабочий пример "Регистратор"
СВМ вне форума   Ответить с цитированием
Старый 27.03.2018, 12:52   #12
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Зачем так иронизировать то? :/
Мне нужно что бы заработала программа. Довольно простая... Для сбора статистики и записи в файл. Никому кран на голову не упадет и током не шарахнет из за того что я что то не так сделаю(

С линуксом дела не имел вообще никогда.
В примерах есть готовая программа для этого. Прямо внутри виртуальной машины и дополнительно на сайте.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 27.03.2018, 14:34   #13
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Я как раз опираясь на этот алгоритм и написал свою программу. Которая больше подходит под мой случай, т.к переменных нужно записывать много и выборочно, да еще и в нужном формате. Использовал для этого только 3 библиотеки которых не было в ваших примерах, но которые считаются стандартными. В вашей же сборке VM, IDE орет что у него таких библиотек нет. Весь труд на смарку
maxitronix вне форума   Ответить с цитированием
Старый 27.03.2018, 14:43   #14
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Я как раз опираясь на этот алгоритм и написал свою программу. Которая больше подходит под мой случай, т.к переменных нужно записывать много и выборочно, да еще и в нужном формате. Использовал для этого только 3 библиотеки которых не было в ваших примерах, но которые считаются стандартными. В вашей же сборке VM, IDE орет что у него таких библиотек нет. Весь труд на смарку
Стандартные библиотеки, реально стандартные, а не то, что вы думаете, их имена начинаются на std*. Это stdio.h, например.

Стандартные типы данных - это реально стандартные типы, а не то, что вы думаете. Типа данных "string" нет в C/C++. Стринг - это массив, объявленный одной из библиотек-контейнеров.

Труд насмарку не из-за библиотек, а из-за того, что вы посчитали несущественным изучить доступный вам функционал и доступные вам библиотеки.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 27.03.2018, 15:11   #15
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Ладно. Спасибо за ценные и не очень советы. Буду переделывать программу под тот набор что есть.. Хорошо хоть вектора есть.
maxitronix вне форума   Ответить с цитированием
Старый 28.03.2018, 13:27   #16
maxitronix
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'
Почему компилятор может выдавать такие ошибки?
maxitronix вне форума   Ответить с цитированием
Старый 28.03.2018, 13:28   #17
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Разрешите задать еще один тупой вопрос.

Я разделил часть кода в которой инициализировались и считывались шмемы на несколько частей и обозначил эти части функциями.

Код:
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'
Почему компилятор может выдавать такие ошибки?
Если сделать по аналогии с вашим примером ( вынести содержимое функций в мейн), то компилятор выдает тоже самое.
maxitronix вне форума   Ответить с цитированием
Старый 28.03.2018, 13:57   #18
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: C++/Trim 5

Просто гуглите ошибку и находите массу ответов.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 29.03.2018, 13:40   #19
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от Gromov Посмотреть сообщение
Просто гуглите ошибку и находите массу ответов.
Второй день копаюсь и не понимаю как это исправить..
В одной части кода, где использованы методы "GetBool" и др., все в порядке. А в другой выдает такие ошибки. Мозг набекрень уже
maxitronix вне форума   Ответить с цитированием
Старый 29.03.2018, 13:46   #20
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: C++/Trim 5

Цитата:
Сообщение от Arsie Посмотреть сообщение
Задумайтесь. Вы задаёте вопросы уровня даже не первого курса института. Это уровень школьного кружка программирования.
Как уже заметил Арсений, в таком случае, стоит задуматься. Потому что области видимости и время жизни переменных проходятся в первом десятке уроков по с++.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 29.03.2018, 13:50   #21
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Если сделать по аналогии с вашим примером ( вынести содержимое функций в мейн), то компилятор выдает тоже самое.
Вариант с не соблюдением области видимости исключен

В конце концов после добавления объекта класса "shm" в аргументы тех функций ничего не изменилось

И раз уж вы меня за круглого идиота держите- глобализация объекта тоже никаких результатов не дала
maxitronix вне форума   Ответить с цитированием
Старый 29.03.2018, 14:01   #22
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: C++/Trim 5

В конце концов, в том коде, что вы прикладываете в первом сообщении вообще всё плохо с объявлением класса разделяемой памяти и его использованием.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 29.03.2018, 14:04   #23
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от Gromov Посмотреть сообщение
В конце концов, в том коде, что вы прикладываете в первом сообщении вообще всё плохо с объявлением класса разделяемой памяти и его использованием.
Код:
#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);
			}
		}
	}
Последний вариант
maxitronix вне форума   Ответить с цитированием
Старый 29.03.2018, 14:31   #24
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Последний вариант
У вас в коде нарушены фундаментальные основы языка С/C++.

Извините, но техническая поддержка вам ничем помочь не может.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 29.03.2018, 14:49   #25
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Ага. Всего доброго.

P.S На поддержку то не особо похоже
maxitronix вне форума   Ответить с цитированием
Старый 29.03.2018, 15:00   #26
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: C++/Trim 5

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

Дам вам последнюю подсказку: В том классе, метод которого вы вызываете, действительно нет такого метода.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 29.03.2018, 15:10   #27
maxitronix
Member
 
Регистрация: Mar 2018
Сообщения: 34
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: C++/Trim 5

Прописная.........
maxitronix вне форума   Ответить с цитированием
Старый 29.03.2018, 18:08   #28
Gel
Senior Member
 
Регистрация: Nov 2017
Сообщения: 563
Благодарил(а): 3 раз(а)
Поблагодарили: 38 раз(а) в 30 сообщениях
По умолчанию Ответ: C++/Trim 5

Цитата
Сообщение от maxitronix Посмотреть сообщение
Ага. Всего доброго.
P.S На поддержку то не особо похоже
Я не из поддержки, но хочу заметить, что не стоит изучать C/C++ на примере программирования контроллера. Это небезопасно, можно легко отстрелить себе ногу.

Если хотите запрограммировать логгер, то попробуйте это сделать на языке Go с использованием Modbus. В этом случае вы сможете и отлаживать, и компилировать программу полностью на Windows и виртуальная машина вам совсем не понадобится. И Go будет сопротивляться до последнего попыткам стрелять по ногам.

Про использование Go я писал в этой теме: Альтернатива для C/C++ на Trim5/SMH4
Gel вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать свои сообщения

BB code is Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 16:49.


Версия vBulletin: 3.8.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Segnetics 2005 - 2023