Ответ: Срочно! Помогите! О разделяемой памяти!
Кто может объяснить мне:
Есть функция float getFloat(const char * name, float val), она
вызывает get() с определенным набором параметров, а get() натравливает
IsFound() на поиск имени переменной в map , которая собирается с
ини-файла.
Собирается все отлично, переменные, их тип и адреса видны в файлике
load_files.srv. НО!
Когда мы начинаем брать значения этих переменных (хоть по имени, хоть
по номеру из этого файла) - нам возвращают -1 в первом случае и NULL
во втором.
Тут и начинается самое интересное:
- В смлоджик имена менял (на всякий) - ноль эмоций
- Контроллер рестартил
- Наткнулся на кучу ерроров нетбинс (IDE на убунте), которая не может
распарсить итераторы у мапа (хотя на это можно положить)
- Обнаружил очень интересную фичу: раньше итемы в листе собирали с
чарами, а теперь решили собрать со стрингом. На всякий, оставив
комментами старые методы. Если честно, возвращать обратно чары не вижу
смысла (см. про NULL в ответ на запрос по номеру переменной), но
интересен сам факт - видимо с именами проблемы уже были.
#include "shm.hpp"
int main()
{
Shm mymem("./load_files.srv"); //Инициализация переменных разделяемой памяти
//FILE *file;
struct timespec tv;//Структура для задания временных интервалов
tv.tv_sec = 0;
tv.tv_nsec = 100000000; //(наносекунд) задержка в 1 сек
// хотя лучше сделать столько-же, сколько период обновления на веб-морде (!)
if (( mymem.getType("mem_tech") == FLOAT ) && \
( mymem.getType("mem_in") == FLOAT ) && \
( mymem.getType("mem_out") == FLOAT ) && \
( mymem.getType("mem_room") == FLOAT ))
for (int i=0;i<50;i++) // Бесконечный цикл
{
/*if ((file = fopen("result.txt","w")) == NULL)
{
printf("Can't open file\n");
exit(-1);
} else {
fprintf (file, "<?xml version=\"1.0\" encoding=\"cp1251\">");
fprintf (file, "<result>");
fprintf (file, "<bases>");*/
nanosleep(&tv, NULL); //выполняем задержку для экономии ресурсов
//================================================== ==================//
// mem_tech - температура наружняя //
//================================================== ==================//
float mem_tech = mymem.getFloat(6);
//fprintf(file,"<base>mem_tech = %f</base>",mem_tech);
printf("<base>mem_tech = %3.6f</base>\n",mem_tech);
//================================================== ==================//
// mem_in - температура канала //
//================================================== ==================//
float mem_in = mymem.getFloat(7);
//fprintf(file,"<base>mem_in = %f</base>",mem_in);
printf("<base>mem_in = %f</base>\n",mem_in);
//================================================== ==================//
// mem_out - температура обр_воды //
//================================================== ==================//
float mem_out = mymem.getFloat(8);
//fprintf(file,"<base>mem_out = %f</base>",mem_out);
printf("<base>mem_out = %f</base>\n",mem_out);
//================================================== ==================//
// mem_room - температура помещения //
//================================================== ==================//
float mem_room = mymem.getFloat(9);
//fprintf(file,"<base>mem_room = %f</base>",mem_room);
printf("<base>mem_room = %f</base>\n",mem_room);
/*fprintf (file, "</bases>");
fprintf (file, "</result>");
fclose(file);
}*/
printf("=====\n");
} else {
//fprintf(file,"<base>ERROR: mem_tech has type %d</base>",mymem.getType("mem_tech"));
printf("ERROR: mem_tech has type %d\n",mymem.getType("mem_tech"));
//fprintf(file,"<base>ERROR: mem_in has type %d</base>",mymem.getType("mem_in"));
printf("ERROR: mem_in has type %d\n",mymem.getType("mem_in"));
//fprintf(file,"<base>ERROR: mem_out has type %d</base>",mymem.getType("mem_out"));
printf("ERROR: mem_out has type %d\n",mymem.getType("mem_out"));
//fprintf(file,"<base>ERROR: mem_room has type %d</base>",mymem.getType("mem_room"));
printf("ERROR: mem_room has type %d\n",mymem.getType("mem_room"));
exit(-1);
}
printf("DONE\n");
}
Собственно вопрос: в каком случае вашими нативными методами
нельзя взять перменные? (хотелось бы МАКСИМАЛЬНО подробно)
|