сколько там будет конкретно байт зависит от реализации. Обычно int такого размера чтобы обеспечить максимальную эффективность. Поэтому обычно на 16битных реализациях int - 2х байтовый, на 32бит - 4х, а на 64 может быть 4 или 8 байтовым.
закладываться на конкретные размеры которые у тебя действуют в текущей системе признак плохого стиля, Си все таки кросплатформенный язык. Если это нужно, то принято вводить typedef'ы, например: BYTE, WORD, DWORD.
Последний раз редактировалось progn 07.10.2009 6:06, всего редактировалось 1 раз.
Заблокирован Статус: Не в сети Регистрация: 23.01.2005 Откуда: с Марса
Root Это стандарт , не нервничай так. Если я в памяти занимаю место под float , то значит лутше там хранить числа с запятой , а не цельное число. Кашелёк для денег, бутылка для жидкости или вы деньги в бутылке носите ???
_________________ Монитор никак у всех, у меня на IPS. Пpошьешь и бедное железо на совсем убьешь ! Не уверен , не прошивай ! Пниха Виста Колбоса КГ / АМ
char челочисленный тип, вполне можно писать char i = 65; литералы 'a', 'b', ... чисто для удобства. И в зависимости от кодовой таблицы локали преобразуются компилятором в числа, например 97, 98. Но надо иметь ввиду что если char i0 = 255; и int i1 = 255; то большинстве систем i0 != i1, т.к. (int)i0 == -1 из-за переполнения. Кстати getchar() возращает целое типа int, не char. Для того чтобы можно было вернуть -1 признак конца ввода или ошибки.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
progn
Цитата:
char i0 = 255
насколько я помню, по умолчанию char signed. В отличии от int и long int. Которые по умолчанию unsigned. Поэтому реально char i0=255 на самом деле запишет в ячейку памяти отрицательное число -1. Вроде Вы тоже самое и сказали другими словами.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 21.01.2004 Откуда: ядерная помойка
char обычно 8 бит, т.е. 256 значений. Что там "по умолчанию" - зависит от реализации. Т.е. может быть от -128 до 127, а может быть от 0 до 255. Чтобы явно указать, какой диапазон используется, пишется unsigned char для воторого и signed char для первого. Но на самом деле голову можно не забивать. Все общеупотребительныесимволы лежат в диапазоне от 0 до 127 и их эта разница не касается.
насколько я помню, по умолчанию char signed. В отличии от int и long int. Которые по умолчанию unsigned.
int и long тоже по умолчанию signed...
Ps кстати, в юникоде не обязательно символ занимает два байта. В UTF-8 - переменная длинна, для символов попадающих в ASCII - 1 байт, для остальных от 2 до 4 байт (теоритически до 6), русский диапазон 2 байта, а до 4х разные иероглифы. UTF-16 фиксировано 2 байта (принята в Windows), UTF-32 фиксировано 4 байта (принята в nix'ах), поэтому если программу c wchar_t скомилируешь под Winows, то там sizeof(wchar_t) = 2, а если под Linux то sizeof(wchar_t) = 4.
ядерный отход писал(а):
Но на самом деле голову можно не забивать. Все общеупотребительныесимволы лежат в диапазоне от 0 до 127 и их эта разница не касается.
англоязычным программистам может и не надо, а нам надо иметь ввиду, что русские символы лежат как раз в диапазоне 127-255.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Цитата:
int и long тоже по умолчанию signed...
Склероз-с Мне всегда проще было спецификацию переменной написать четко, чтобы потом не морочиться. А под MSVC вообще все прекрасно - есть предопределенные /макросы или typedef'ы/ BYTE/WORD/DWORD/QWORD из PlatformSDK
Цитата:
кстати, в юникоде не обязательно символ занимает два байта.
согласен.
Цитата:
англоязычным программистам может и не надо, а нам надо иметь ввиду, что русские символы лежат как раз в диапазоне 127-255.
Под винду проще писать везде TCHAR, компилить с UNICODE и не морочить себе голову. ИМХО. В случае кроссплатформенного - или gcc (под Win - Cygwin/Mingw32), или использование спец. библиотек типа QT (тогда можно смело и под MSVC сидеть)
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
manya 1) sirname - это, конечно, сильно... Наверное, все-таки surname? 2) scanf'ом очевидно в поля структуры считать можно... Только я не понял - в чем конкретно непонятки...
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
Цитата:
1) sirname - это, конечно, сильно... Наверное, все-таки surname?
Упс, очепятка Все вопрос исчерпан следующим постом)) 2Any1 Спасибо большое, что-то глючу сегодня
Добавлено спустя 24 минуты 30 секунд:
Код:
#include <stdio.h> #include <stdlib.h> FILE *f_out; #define N 50 #define M 50 #define PEOPLE 100 void main(void) { f_out=fopen("test.out","w+"); struct phonebook { long phone; char name[N]; char sirname[N]; int year_birth; int month_birth; int day_birth; } a,persons[PEOPLE]; int i,j; i=0; j=0; int u=0; char c=0; { for (i=0;i<10;i++) { printf("Input information about the "); printf("%d",i+1); printf(" person\n"); printf("Input name\t"); do { c=getchar(); if ((c!=' ') && (c!=',') && (c!='\n')) { persons[i].name[j]=c; j++; } } while (c!='\n'); j=0; printf("Input surname\t"); do { c=getchar(); if ((c!=' ') && (c!=',') && (c!='\n')) { persons[i].sirname[j]=c; j++; } } while (c!='\n'); j=0; printf("Input phone\t"); scanf("%d",&persons[i].phone); printf("Input day of birth\t"); scanf("%d",&persons[i].day_birth); printf("Input month of birth\t"); scanf("%d",&persons[i].month_birth); printf("Input year of birth\t"); scanf("%d",&persons[i].year_birth); system("cls"); } } fclose(f_out); }
Кхм, что-то я опять не догоняю. Вот кусок кода. Почему после первого прохода по большому циклу он не входит в первый внутренний?
Добавлено спустя 7 минут 44 секунды: Все, простите, вопрос снимается.
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
progn, спасибо. Кстати, если сделать так:( на sirname внимание не обращать )
Код:
struct phonebook {
long phone; char name[N]; char sirname[N]; int length_1; int length_2; int year_birth; int month_birth; int day_birth; } a,persons[PEOPLE]; for (j=0;j<=count;j++) { fprintf(f_out,"%s",persons[j].name); fprintf(f_out,"%s",persons[j].sirname); fprintf(f_out,"%d",persons[j].phone); fprintf(f_out,"%d",persons[j].day_birth); fprintf(f_out,"%d",persons[j].month_birth); fprintf(f_out,"%d",persons[j].year_birth); fprintf(f_out,"\n"); }
то он забабахает все имена и фамилии в том "размере", как они( массивы) будут объявлены. Тогда появятся всякие там разные символы, совершенно мне ненужные. Можно конечно завести счетчики длин имен и фамилий, в которых будет храниться длина. Тогда как записать поля структуры, содержащие имя и фамилию в файл? Ведь нельзя же написать "fprintf(f_out,"%s",persons[j].sirname[k]);"
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
пишет, что "Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен "
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
manya а вообще что требуется? Просто сделать отчет в табличной форме или сохранить массив в файл?
Добавлено спустя 54 секунды:
Цитата:
пишет, что "Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен "
Код:
for (i = 0; i < N; i++) fwrite((void*)persons[i], sizeof(phonebook), 1, f_out);
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
в файл всю структуру запихать, но так, чтобы не было там всяких непечат. символов и всяких там прочих, которые валяются в массивах, не до конца заполненных
Добавлено спустя 2 минуты 45 секунд:
Код:
for (i = 0; i < N; i++) fwrite((void*)persons[i], sizeof(phonebook), 1, f_out);
так та же ошибка
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения