Äîáðîãî âðåìåíè ñóòîê! Ó ìåíÿ âîçíèêëà ïðîáëåìà ïðè êîìïèëÿöèè ïðîåêòà äëÿ ðàáîòû ñ ñîâìåùåííîé ïàìÿòüþ. Ñóòü â òîì ÷òî ÿ íàïèñàë ïðîãðàììó â 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);
}
}
}
×òî ìîæíî ñäåëàòü?