[закрыто] непонятки

stream2008

Нижеприведённый код почему-то упорно выводит (на экран и в базу) вот такое:
INSERT INTO meas VALUES (0,'2012-8-27 14:21:39',10, 84.1126, 56.9707, 4.88713e-270, "(null)");
Хотя вместо последнего "null" ведь явно должно быть "tt"?!
А если вместо "tt" аргументом в sprintf ставлю str1 то вообще вылетает с надписью ошибка сегментации.
Никак не могу понять, что я делаю не так?
 
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <time.h>
#include <mysql/mysql.h>

#include <getopt.h> /* getopt_long() */

#include <fcntl.h> /* low-level i/o */
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

#include <linux/videodev2.h>

char frame [1244160];
float korrl;
int chan,avs;

static void process_image(const void *p, int size)
{
FILE *f1;
float medium =0, disp=0;
unsigned char an1;
int i;
struct tm tm1;
time_t tim1;
char str[1024],str1[512];
struct v4l2_tuner tun1;
int fd1;
MYSQL mysql1,mysql2;

if (out_buf)
{

memcpy (frame,p,size);
for (i=0;i<size;i++)
medium+=(float)frame[i]/(float)size;
for (i=0;i<size;i++)
disp+=((float)an1-medium)*((float)frame[i]-medium)/size;

disp=sqrt(disp);

if (last==1)
{
f1=fopen("image.ppm","w");
fprintf (f1,"P6\n720 576\n255\n");
fwrite(p, size, 1, f1);
fclose (f1);

time (&tim1);
memcpy(&tm1,localtime(&tim1),sizeof(tm1));
sprintf (str1,"%g-%d.%02d.%02d-%d-%02d-%02d.jpg",freq[chan],1900+tm1.tm_year,tm1.tm_mon,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
sprintf (str,"cjpeg -quality 60 image.ppm > %s",str1);
system (str);

sprintf (str,"INSERT INTO meas VALUES (%d,'%d-%d-%d %d:%d:%d',%d, %g, %g, %g, \"%s\");",chan,1900+tm1.tm_year,tm1.tm_mon,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec,avs,medium,disp,korrl,"tt");
mysql_init(&mysql2);

if (!mysql_real_connect(&mysql2,"localhost","root","12345","tvstat",0,0,0)) {printf ("mysql error \n"); return;}
printf ("\n%s\n",str);
if (mysql_query(&mysql2,str)) {printf ("mysql insert error\n");return;}
mysql_close (&mysql2);
avs=0;
}
}
}

apl13

pubuntu:~$ gcc test.c
pubuntu:~$ ./a.out

INSERT INTO meas VALUES (0,'-1215835588--1215794847--1080685264 1:-1215838120:8',0, 0, 0, 0, "tt");

stream2008

Нашёл, где ошибся. В текст программы вкралась ещё одна переменная korr1, на этот раз типа integer. :crazy:

sergey_m

А это то нахуя?
#include <linux/videodev2.h>

apl13

ТОЛЬКО ГЛОБАЛЫ! ТОЛЬКО ХАРДКОР!

stream2008

Я ж не всю прогу скопировал. Там в других функциях тв-тюнер мучается, а в конкретно эту указатель на картинку одного кадра приходит.

Werdna

Бегло пройдусь по коду, не запуская.
                
sprintf(str1,"%g-%d.%02d.%02d-%d-%02d-%02d.jpg",freq[chan],1900+tm1.tm_year,tm1.tm_mon,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);


Используй strftime.
Используй snprintf, не используй sprintf так как она не безопасна.
printf ("mysql insert error\n");

Ошибки принято выводить в stderr, fprintf делай туда.
memcpy(&tm1,localtime(&tim1),sizeof(tm1));

Ахтунг какой-то, зачем memcpy? Что хотел — не понятно.

stream2008

она не безопасна.
Что значит не безопасна?
memcpy(&tm1,localtime(&tim1),sizeof(tm1));
Что хотел — не понятно.

В переменной tim1 - текущее время в секундах, отсчёт от 70 года. localtime преобразует его в структуру, где есть годы, месяцы, дни, часы, минуты и секунды и её результат я копирую в tm1.
Ошибки принято выводить в stderr, fprintf делай туда.

Это отладка, при ней мне удобнее сразу видеть что выполнилось, а что нет.

serge18

 
Что значит не безопасна?

sprintf потенциально может попытаться писать за пределами твоего буфера. даже если ты наперед знаешь что год будет занимать 4 позиции в строке (что будет верно только ближайшие ~8000 лет), использовать snprintf - хорошая практика.
 
Это отладка, при ней мне удобнее сразу видеть что выполнилось, а что нет.

по дефолту в консоли stderr и так идет на экран. а при желании можно отделить желток от белка.

stream2008

А это то нахуя?
#include <linux/videodev2.h>
Прогу допилил, если вдруг интересно кому.
Раз в 5 минут по кронтабу запускается, сканирует n каналов телевидения, оценивает уровень, делает скриншоты, сравнивает их со снятыми 5 минут назад (для отлавливания замершей картинки).
Результат можно смотреть здесь: http://83.151.9.102/tv/statall.php
Спасибо за полезные советы.
Оставить комментарий
Имя или ник:
Комментарий: