2012-06-21 2 views
-2

У этого кода нет ошибок, но затем, когда я его выполню, нет выхода, и программа автоматически отключается, говоря, что программа перестала работать.Код C++ для планирования задач

#include<unistd.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#include<string.h> 
int main() 
{ 
char *timetoken; 
char currtime[7]; 
char schedtime[7]; 
int i; 
struct tm *localtimeptr; 
strcpy(schedtime,"15:25:00"); 
while(6!=9) 
{ 
    time_t lt; 
    sleep(1); 
    lt = time(NULL); 
    localtimeptr = localtime(lt); 
    timetoken=strtok(asctime(localtimeptr)," "); 
    for(i=1;i<5;i++) 
    timetoken=strtok('\0'," "); 
    if(i==3) 
    { 
      strcpy(currtime,timetoken); 
    } 
} 
      printf("The current time is: %s\n",currtime); 
      printf("We are waiting for: %s\n",schedtime); 
      if(!strcmp(currtime,schedtime)) 
      { 
              printf("Time to do stuff \n"); 
              system("C:\PROJECT X"); 
      }   
      getch(); 
      return 0;      
} 
+4

Звучит как ошибка для меня. –

+2

Что это значит? 'system (" C: \ PROJECT X ");' – sarnold

+1

Кроме того, вы копируете 8 байтов в расписание, которое было выделено для 7. – CatShoes

ответ

3

Некоторых проблемы с публикуемым кодом:

  • Это работает после конца массива:

    strcpy(schedtime,"15:25:00"); 
    

    в schedtime объявлен как char[7], должно быть char[9] (8 символов плюс нулевой ограничитель).

  • первый аргумент strtok() является char*, не char:

    timetoken=strtok('\0'," "); 
    

    Вы имели в виду:

    timetoken=strtok(NULL," "); 
    
  • нет никакой проверки, что timetoken не является нулевым или для того, чтобы ему будет входить в состав currtime:

    if(i==3) 
    { 
        strcpy(currtime,timetoken); 
    } 
    

    , передающий нулевой указатель на strcpy(), почти наверняка приведет к ошибке сегментации (http://ideone.com/bacOG).

5

Я не уверен, что вы пытаетесь сделать, но это подозрительное:

while(6!=9) 
{ 
    /* ... */ 
} 
/* ... more code ... */ 

6 всегда будет не равно 9, так что это бесконечный цикл. Невозможно выйти из цикла, и поэтому ничего в разделе «больше кода» не будет выполнено. Это означает, что ваш printf s не будет выполнен, и ваш звонок system не будет выполнен. Вам нужно выйти из этого цикла.

Чтобы сделать код более удобным для чтения (, который всегда должен быть высшим приоритетом!), я предложил бы просто написать

while (true) { 
    ... 
} 

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

Другое примечание: этот код

system("C:\PROJECT X"); 

неверен, так как C++ интерпретирует \P как экранирующий символ.Чтобы это исправить, избежать вашего слэш:

system("C:\\PROJECT X"); 

Для другого жука, внимательно посмотрите на эту петлю:

for(i=1;i<5;i++) 
    timetoken=strtok('\0'," "); 
    if(i==3) 
    { 
     strcpy(currtime,timetoken); 
    } 

C++ интерпретирует это как

for(i=1;i<5;i++) { 
     timetoken=strtok('\0'," "); 
    } 

    if(i==3) 
    { 
     strcpy(currtime,timetoken); 
    } 

Отсюда яснее, что это не будет работать, поскольку оператор if находится вне цикла. Следовательно, i никогда 3. Вы, вероятно, имел в виду

for(i=1;i<5;i++) { 
     timetoken=strtok('\0'," "); 
     if(i==3) 
     { 
      strcpy(currtime,timetoken); 
     } 
    } 

сделать усилие, чтобы очистить свой код форматирования (отступов, пробелов и т.д.) поможет предотвратить такого рода ошибки. Если вы указали i как локальный для цикла for, вы, вероятно, заметили бы это раньше. Например, этот код не компилируется:

for(int i = 1; i < 5; i++) { 
     timetoken=strtok('\0'," "); 
    } 

    if(i==3) // i is not in scope 
    { 
     strcpy(currtime,timetoken); 
    } 

Как правило, отложить декларирование переменных, пока вы абсолютно не нужны. Это облегчает чтение кода (используемые переменные, как правило, близки к используемому ими коду) и меньше ошибок (как показано выше).

Надеюсь, это поможет вам начать работу!

+0

Thanx, но после внесения вышеуказанных изменений он показывает 2 предупреждения о том, что «(в функции« main »:)«, »(передача arg 1« localtime »делает указатель из целого без литья)», и он автоматически отключается, как обычно без выполнения программы. Я ошибочно отметил программу как C++, когда я закодировал ее в c, sry. – scheduling

1

Вы копируете больше данных в schedtime, чем вы выделили:

strcpy(schedtime,"15:25:00"); 

строка копируется длиной 9 символов, то есть пространство для 7. Это не может быть проблема сама по себе, но если память расположено таким образом, что localtimptr участвуют, завершающий нулевой символ не будет там при вызове printf() с scheduletime, возможно, трогательной памятью, не выделенная для процесса, таким образом завершая ошибочный

2

этой последовательностью является buffer overflow. Вы нацарапали над несвязанной памятью содержимое вашей строки, так что что-нибудь может произойти после этой точки. (Буфер переполнения используется для быть наиболее широко и легко эксплуатируемыми проблемы безопасности.)

char schedtime[7]; 
strcpy(schedtime,"15:25:00"); 

Вы должны убедиться, что schedtime достаточно долго, чтобы держать всю строку, включая байт ASCII NUL в конце. schedtime[9] хватит.

Это нечетный способ, чтобы написать бесконечный цикл:

while(6!=9) 
{ 
... 
} 

Более идиоматичен является while (1) или for (;;). Придерживайтесь этих, они намного облегчают чтение вашего кода.

Возможно, есть и другие ошибки в деталях вашего кода, но в дизайне есть большая ошибка: проблемы; вы считаете, что запуск sleep(1) в бесконечном цикле и проверка строкового значения времени по отношению к целевому времени в конечном итоге сравниваются с true - это неверное предположение.Процесс, который ложится спать в течение одной секунды, может разбудить после назначенное время уже прошло - ваш процесс может спать прямо через 1000 миллисекунд, когда ваше состояние может быть оценено до true.

Намного лучше было бы проверить текущее время на нужное время, выяснить, сколько секунд осталось, и sleep() на весь период. Если ваша задача не пробуждается первым сигналом, это будет в течение секунды желаемого времени.

Смежные вопросы