LINUX.ORG.RU

Два разных ctime() в одном printf дают одинаковое время???


0

1
#include <stdio.h>
#include <time.h>

int main() {
int lcount=0, lmax=400000000;
time_t t1, t2;

time(&t1);
//read_pause = 1;
while (1) {
  lcount ++;
  if (lcount == lmax) {
    printf("lcount=%i\n", lcount);
    time(&t2);
    printf("В одном printf: t1=%s  t2=%s", ctime(&t1), ctime(&t2));
    printf("Сначала t1: %s", ctime(&t1));
    printf("Потом t2: %s", ctime(&t2));
    //lcount = 0;
    break;
  }
}
}

Печать:

lcount=400000000

В одном printf: t1=Sat May 5 23:19:18 2012 t2=Sat May 5 23:19:18 2012

Сначала t1: Sat May 5 23:19:18 2012

Потом t2: Sat May 5 23:19:20 2012

Ничего не понимаю.

оптимизация? :)

invy ★★★★★
()
Ответ на: комментарий от post-factum

Вот строки из Makefile:

CFLAGS = -pipe -Wall -W -g

CXXFLAGS = -pipe -Wall -W -g

LEXFLAGS =

YACCFLAGS= -d

INCPATH = -I/usr/lib/qt3/mkspecs/default -I. -I. -I$(QTDIR)/include

LINK = g++

LFLAGS =

LIBS = $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm

chereda
() автор топика

Как думаешь, что возвращает ctime? Не надо ли делать free тому указателю, который она возвращает?

const86 ★★★★★
()
Ответ на: комментарий от UVV

Добавил в Makefile:

CFLAGS = -pipe -Wall -W -g -O0

CXXFLAGS = -pipe -Wall -W -g -O0

Прогнал:

lcount=400000000

В одном printf: t1=Sun May 6 00:31:33 2012

t2=Sun May 6 00:31:33 2012

Сначала t1: Sun May 6 00:31:33 2012

Потом t2: Sun May 6 00:31:35 2012

Не помогло.

chereda
() автор топика

Эта функция возвращает указатель на статический буфер. Указатель не меняется, соответственно значение будет одинаковое при таком использовании.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Не понял. Любая функция зависит от аргумента.

Заменил ctime() на strcat() ( то же возвращает char *).

char str1[7]=«a1», str2[7]=«a2»;

printf(«С функцией strcat в одном printf: strcat1=%s strca2=%s\n», strcat(str1,«b1»), strcat(str2, «b2»));

Теперь ожидаемый результат. Печать:

С функцией strcat в одном printf: strcat1=a1b1 strca2=a2b2

chereda
() автор топика
Ответ на: комментарий от chereda

Любая функция зависит от аргумента.

И от глобального состояния. В случае ctime(3) такое глобальное состояние — это внутренний статический буфер, назовем его cbuf, в который пишет ctime и указатель на который возвращает.

В твоем коде происходит следующее:

1. вызывается один из двух ctime (стандарт си не говорит, какой именно). он пишет дату в cbuf и возвращает в printf указатель на cbuf.

2. вызывается оставшийся ctime. он тоже пишет свою дату в то же место (перезаписав предыдущую) и возвращает тот же указатель.

3. printf печатает два раза один и тот же буфер.

anonymous
()
Ответ на: комментарий от chereda

Вообще, мне в свое время очень понравилась книжка, где аккуратно собраны и красиво разложены все такие грабли — к тому же, дают возможность самому их найти, прежде чем прочесть ответ:

http://www.books.ru/books/kak-ne-nado-programmirovat-na-c-111-nerabochikh-i-3...

Хоть она и называется "...C++", там достаточно много характерных для Си грабель.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.