Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 55 из 87<  1 ... 52  53  54  55  56  57  58 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.08.2007
Root

стандартом С и С++ размер типов в байтах, кроме char (1 байт), не определен (в отличии от Явы например).

гарантируется только это соотношение:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long int) <= sizeof(long long)

сколько там будет конкретно байт зависит от реализации. Обычно 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ошьешь и бедное железо на совсем убьешь ! Не уверен , не прошивай !
Пниха Виста
Колбоса
КГ / АМ


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
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 и их эта разница не касается.

_________________
memento mori


 

Member
Статус: Не в сети
Регистрация: 27.05.2007
BiC писал(а):
Это стандарт , не нервничай так.

слишком формальный подход... в корне char это целочисленный тип, а уж тем более не стоит проводить аналогий с разницы int c float и int c char...


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
Root писал(а):
насколько я помню, по умолчанию 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


 

Member
Статус: Не в сети
Регистрация: 23.07.2005
Откуда: Екатеринбург
Подскажите, есть какой-нибудь быстрый вывод в консоль, кроме cout и printf?


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
LikvidatorMax
puts


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
к примеру, имеется такое
Код:
...
struct phonebook
   {
      int phone[N];
      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 (u=0;u<10;u++)
      {
         printf("Input name\n");
         do
         {
            c=getchar();
            if ((c!=' ') && (c!=',') && (c!='\n'))
            {
               persons[i].name[j]=c;
               j++;
            }
         }
         while (c!='\n');
         j=0;
         c=0;
         printf("Input sirname\n");
         do
         {
            c=getchar();
            if ((c!=' ') && (c!=',') && (c!='\n'))
            {
               persons[i].sirname[j]=c;
               j++;
            }
         }
         while (c!='\n');
         printf("Input phone\n");
         do
         {
            c=getchar();
            if ((c!=' ') && (c!=',') && (c!='\n'))
            {
               persons[i].phone[j]=c;
               j++;
            }
         }
         while (c!='\n');
         printf("Input day of birth\n");
         scanf("%d",persons[i].day_birth);
...

Вопрос: почему scanf-ом нельзя читать с клавы в поля структуры?

Добавлено спустя 36 секунд:
Имею ввиду не в массивы

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
manya
1) sirname - это, конечно, сильно... Наверное, все-таки surname?
2) scanf'ом очевидно в поля структуры считать можно... Только я не понял - в чем конкретно непонятки...

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 24.06.2008
manya писал(а):
к примеру, имеется такое
Код:
...
struct phonebook
   {
      int phone[N];
      char name[N];
      char sirname[N];
      int year_birth;
      int month_birth;
      int day_birth;
   } persons[PEOPLE];
...
        scanf("%d",persons[i].day_birth);
...

Вопрос: почему scanf-ом нельзя читать с клавы в поля структуры?

scanf в качестве аргументов указатели принимает (т.к. сам изменяет содержимое переменных). Поэтому перед person надо амперсанд поставить


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Цитата:
1) sirname - это, конечно, сильно... Наверное, все-таки surname?

Упс, очепятка :haha: Все вопрос исчерпан следующим постом))
2Any1 Спасибо большое, что-то глючу сегодня :insane:

Добавлено спустя 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 секунды:
Все, простите, вопрос снимается. :tooth:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya
Эти циклы не нужны, тем же scanf'ом можно строчки считывать


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
progn, спасибо.
Кстати, если сделать так:( на sirname внимание не обращать :oops: )
Код:
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");
   }

то он забабахает все имена и фамилии в том "размере", как они( массивы) будут объявлены. Тогда появятся всякие там разные символы, совершенно мне ненужные. Можно конечно завести счетчики длин имен и фамилий, в которых будет храниться длина. Тогда как записать поля структуры, содержащие имя и фамилию в файл? :bandhead: Ведь нельзя же написать "fprintf(f_out,"%s",persons[j].sirname[k]);"

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
manya
если структура фиксированной длины, то fwrite'ом писать ее... целиком.
типа так:
Код:
for (i = 0; i < N; i++)
   fwrite(persons[i], sizeof(phonebook), 1, f_out);

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

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);

так та же ошибка :gun:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 55 из 87<  1 ... 52  53  54  55  56  57  58 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan