dlinyj: (Default)
[personal profile] dlinyj
По работе набросал небольшую программку. Ну, я честно признаюсь, в си не особо силён. Так, со справочником и гуглом пишу. Редко бывает нужда писать Но тут вот прибило. Собственно говоря программа генерирует нужный мне текстовый файл. В начале файла должна быть строчка даты, вида

Date is: 30/09/2010

и дальше идут строчки со временем:

Time is: 01:01:01 input: 0.0000000000

Программа моя запрашивает дату, время и т.п. Забавно, что конструкции абсолютно идентичные, однако почему-то переменная day остаётся равной нулю, вот непонимаю я. Кто подскажет в чём засада? Код под катом, ввод дня идёт в строчке № 16


 1 #include <stdio.h>      /* standard I/O                */ 
 2  #include <string.h>     /* for strcpy - 3 occurrences  */
 3  #include <stdlib.h>     /* for exit   - 1 occurrence   */
 4  #include <ctype.h>
 5  FILE *fp;
 6  int main(void)
 7 {
 8    unsigned short i, year = 2010;
 9    char sec=0,min=20,ch=14, day = 30, month = 10;
10 	fp = fopen ("volt.txt","w");
11 		
12 //	printf("Input date (Day Month Year):");
13 //	while (scanf("Input date (Day Month Year): %02d %02d %4d\n", &day, &month, &year) !=1)
14 	
15 	printf("Input Day:");
16 	while (scanf("%02d", &day) !=1)
17 	printf("Error, please input Day:");
18 	
19 	printf("Input Month:");
20 	while (scanf("%02d", &month) !=1)
21 	printf("Error, please input Month:");
22 
23 	printf("Input date Year:");
24 	while (scanf("%4d",  &year) !=1)
25 	printf("Error, please input Year:");
26 //	scanf("%02d %02d %4d", &day, &month, &year);
27 
28 	printf("Input start Hour:");
29 	while (scanf("%02d", &ch) !=1)
30 	printf("Error please input start Hour:");
31 	
32 	printf("Input start time Min:");
33 	while (scanf("%02d", &min) !=1)
34 	printf("Error please input start Min:");
35 	
36 	printf("Date is: %02d/%02d/%4d\n", day, month, year);
37 	fprintf(fp,"Date is: %02d/%02d/%4d\n", day, month, year);
38 	for(i=0;i<40000;i++)
39      {
40 	if (!(i%3))
41 		 {
42 			sec++;
43 			if (sec == 60)
44 			 {
45 				sec=0;
46 				min++;
47 				if (min == 60)
48 				 {
49 				    min = 0;
50 				    ch++;
51 
52 				 }
53 			 }
54 		 }
55 	    printf("Time is: %02d:%02d:%02d input: 0.0000000000\n", ch, min, sec);
56 	    fprintf(fp,"Time is: %02d:%02d:%02d input: 0.0000000000\n", ch, min, sec);
57 	 }
58    
59    
60 //   printf("'%c'\n", key);
61 	fclose(fp);
62    return 0;
63 }






З.Ы. Попробую это скомпилить gcc в линухе, но позжа. Скажу о результатах.

UPD Заменил char на int - всё заработало. Моя микроконтроллерная привычка экономить каждый байт обернулась против меня.

Date: 2010-10-04 12:14 pm (UTC)
From: [identity profile] cybersonner.livejournal.com
int sec=0,min=20,ch=14, day = 30, month = 10;

Date: 2010-10-04 12:15 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
разница в интах?

Date: 2010-10-04 12:16 pm (UTC)
From: [identity profile] cybersonner.livejournal.com
scanf требует указателя на инт. мингв нормально закомпилировал.

Date: 2010-10-04 12:22 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Понятно, спасибо.

Date: 2010-10-04 12:21 pm (UTC)
From: [identity profile] ivs1958.livejournal.com
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ - видимо, да

Date: 2010-10-04 12:20 pm (UTC)
From: [identity profile] juunitaki.livejournal.com
gcc говорит:

t.c:17: предупреждение: формат ‘%02d’ предполагает тип ‘int *’, но аргумент 2 имеет тип ‘char *’

я бы с ним не спорил.

Переменная day затирается после ввода month. Если распечатать day до ввода month, то всё хорошо.

Если поменять типа на int или использовать модификатор %hhd (signed char or unsigned char argument), то работает как надо.

Date: 2010-10-04 12:23 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Благодарствую. Моя привычка экономить байтики обернулась против меня.

Date: 2010-10-04 12:38 pm (UTC)
From: [identity profile] maddev.livejournal.com
На «нормальных» архитектурах (не AVR) всегда используй int, если надо хранить целое число - код часто будет оптимальнее по производительности. int по определению оптимальный тип для хранения целых.

Date: 2010-10-04 12:46 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Ага, учту. Но мне как правило нужны беззнаковые числа.

Date: 2010-10-04 12:48 pm (UTC)
From: [identity profile] maddev.livejournal.com
unsigned int :-) Дело не в знаковости, а в разрядности: у int она чаще всего совпадает с разрядностью АЛУ.

Date: 2010-10-04 12:50 pm (UTC)
From: [identity profile] maddev.livejournal.com
И вообще, знаковость - это всего лишь на один бит короче и по другому сдвигается вправо )

Date: 2010-10-04 12:38 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
А борландовый компайлер warning-ов не показывал?

Date: 2010-10-04 12:46 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Не показывал :(

Date: 2010-10-04 12:42 pm (UTC)
From: [identity profile] maddev.livejournal.com
sec, min, ch, day, month :-)

Date: 2010-10-04 12:45 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
грамар наци негодуют ;)

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 11:28 am
Powered by Dreamwidth Studios