ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
476954 Топик полностью
fk0, легенда (27.12.2013 20:36 - 20:47, просмотров: 356) ответил FDA на Твоя проблема, видимо в том, что ты программировать прост не умеешь. Могу для начала посоветовать почитать книжки по Си, потом по основам программирования, а в идеале попрограммить ещё для ПК, обязательно на другом языке - Delphi или C#, там
Ты тут не умничай, ты пальцем покажи, где здесь неправильный код:  static int_fast8_t xcclk_unsol(char *text) { char *p, s[6], *msg; int i; struct tm *tm; time_t t; /* AT+CLTS */ #if defined(SIM900) || defined(SIM900B) if (!strncmp(text, "*PSNWID:", 8)) return -1; if (!strncmp(text, "DST:", 4)) return -1; if (!strncmp(text, "+CTZV:", 6)) return -1; if (!strncmp(text, "*PSUTTZ:", 8)) { writelog(LOG_INFO, MNAME "network time updated"); if (cclk_S==CCLK_IDLE) cclk_S=CCLK_GET; return -1; } #endif /* parse +CCLK */ if (strncmp(text, "+CCLK:", 6)!=0) return 0; /* не обработано */ if (cclk_S!=CCLK_WAITTIME) return -1; /* время не запрашивалось */ msg=strdup(text); do { /* allocate memory */ tm=malloc(sizeof(struct tm)); if (tm==NULL) { OUT_OF_MEMORY(); free(msg); return -1; } /* parse answer, TODO нечоткий парсер! */ p=strunquote(&text[6]); if (p==NULL) break; i=sscanf(p, "%u/%u/%u,%2u:%2u:%2u%5s", &tm->tm_year, &tm->tm_mon, &tm->tm_mday, &tm->tm_hour, &tm->tm_min, &tm->tm_sec, s); if (i<6) break; /* difference from UTC (15min. intervals) */ if (i>6) { if (s[0]!='+' && s[0]!='-') break; if (sscanf(s, "%d", &i)!=1) break; } else i=0; /* fix year = 70..138 and month */ if (tm->tm_year < 70) tm->tm_year+=100; tm->tm_mon--; /* validate time */ if (tm->tm_hour<0 || tm->tm_hour>23) break; if (tm->tm_min<0 || tm->tm_hour>59) break; if (tm->tm_sec<0 || tm->tm_sec>60) break; if (tm->tm_year<70 || tm->tm_year>137) break; if (tm->tm_mon<0 || tm->tm_mon>11) break; if (tm->tm_mday<1 || tm->tm_mday>31) break; /* compute UTC time */ tm->tm_isdst=0; /* no daylight saving! */ t=timegm(tm); t-=i*15*60L; /* set new time */ free(msg); writelog(LOG_INFO, "-- UTC %4.4u-%2.2u-%2.2uT%2.2u:%2.2u:%2.2u", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec ); free(tm); if (labs(TIME(NULL) - t) > MAX_DIFF_SEC) { DEBUG0(MNAME "setting new time"); stime_ignored=1; stime(&t); stime_ignored=0; } return -1; } while(0); free(tm); writelog(LOG_WARN, MNAME "incorrect +CCLK message: %s", (const char*)(msg==NULL ? "(out of memory)" : msg) ); free(msg); return -1; } А я даже больше скажу. Если в ниже приведённом вместо xmalloc сразу звать malloc -- будет can't generate code в строке, где s->x+=s->c. Или если localtime заменить на malloc. Впечатлает? Логика проф. уровня! static void *xmalloc(size_t n) { return (void*)(unsigned long)malloc(n); } static int_fast8_t cclk_unsol(char *text) { struct s_1 { int x; char c; } *s; struct tm *tm = localtime(NULL); s=xmalloc(sizeof(struct s_1)); s->x+=s->c; // тут ошибка при замене xmalloc-->malloc if (s->x<10) s->c++; if (tm->tm_year < 70) tm->tm_year+=100; // тут ошибка если localtime заменить на malloc tm->tm_mon--; return tm->tm_year+tm->tm_mon; } PS: да, ошибка вызывается в свою очередь такой же ошибкой в malloc ("can't generate code"), если там исправить -- всё ок. Логики никакой, сообщение об ошибке так и отдаёт профессиональностью.
[ZX]