Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: Это как С++ такое может быть.  (Прочитано 26972 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Boriska
Помогающий

ua
Offline Offline

« Ответ #30 : 02-02-2024 18:18 » 

Вы не совсем правильно меня поняли. sizeof это аксиома никто не отменял. Вот у меня есть студия для контроллера МикроЧип. А сам контроллер отсутствует в данный момент. Да я могу подождать, прийдет контроллер и я запущу sizeof и посмотрю. Меня интересует могу ли я, зная что он 16 битный определить размеры int. Ведь зависит же размер int от разрядности процессора в ПК. На ПК если ОС 32 и проц 32 то и инт будет 4. Если ОС 32, проц 64 int будет 4, если ОС64, проц 64 тогда int будет 8. Вот и пытаюсь связать размер слова микроконтроллера с размером int без sizeof
« Последнее редактирование: 02-02-2024 19:36 от Boriska » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #31 : 02-02-2024 21:29 » 

Писал под контроллер и вдруг обнаружил, что char это не 8 а 16. В студии кодировка двухбайтовая вот и пожалуйста.

Можно подробней? Что значит кодировка "двухбайтовая"? Что значит 8 и 16?

Почему спрашиваю:

 sizeof(char) = 1

другого не видел.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 03-02-2024 04:52 » 

Boriska, CHAR_BIT - это размер байта в битах (чаще всего это 8, но на каких-то компиляторах/платформах может быть и другое значение).
sizeof возвращает размер в байтах
https://en.cppreference.com/w/cpp/language/sizeof

размер int не зависит от битности чего-либо. В стандарте размеры прописаны так:

char / unsigned char / signed char - имеют размер один байт
остальные целочисленные типы:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
« Последнее редактирование: 03-02-2024 04:54 от Алексей++ » Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #33 : 03-02-2024 05:06 » 

Дело было так. В STM32CubeIDE заполнял таблицу
Код:
void init_ru_code_page()
{
code_page_ru['А'] = 'A'; //'А'0x90
code_page_ru['Б'] = (char)160; //'Б' 0x91
code_page_ru['В'] = 'B'; //'В'0x92
code_page_ru['Г'] = (char)161; //'Г'0x93
code_page_ru['Д'] = (char)224; //'Д'
code_page_ru['Е'] = 'E'; //'Е'
code_page_ru['Ё'] = (char)162; //'Ё'
code_page_ru['Ж'] = (char)163; //'Ж'
Обнаружил что символ в таблице занимал два байта. Пока не поставил в свойствах проекта -fexec-charset=866 так и было.
Может еще надо какая инфа, я откачу и предоставлю.
« Последнее редактирование: 03-02-2024 05:12 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #34 : 03-02-2024 15:03 » 

Есть такой wchar...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #35 : 03-02-2024 21:11 » 

Хорошо бы. Но это не VS и не для ОС. Это STM32CubeIDE для микроконтроллеров STM32. Там вроде С есть и даже C++ а эта страница заполнялась для индикации на ЖК индикаторе двухстрочном. Там wchar небывает Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #36 : 03-02-2024 23:44 » 

Т.е. нужны константы и строки в 8-битной кодировке, совместимой с используемым шрифтом.

С константами все просто:
Код: (C)
enum { // cp866
    char_ru_A  = 0x80,
    char_ru_B = 0x81,
    // ...
};

code_page_ru[char_ru_A] = ...;

Строки нужно перекодировать перед компиляцией. Например, объявить строки extern и поместить в один модуль не .c, а с каким-то другим расширением, напр. .cstr, и прописать для него в Makefile правила сборки, где будет создан файл .c в нужной кодировке.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #37 : 04-02-2024 07:33 » 

вот я и попытался съэкономить
Код:
code_page_ru['А'] = 'A';					//'А'0x90
code_page_ru['Б'] = (char)160;
если русский символ есть я подставляю его, если его нет беру значение из знакогенератора индикатора.
потом глядь, а  'A' двухбайтовый

сейчас это выглядит вот так, все работает но осадочек остался
Код:
char _code_page_ru[256] = {
   
    [' ' & 0x00FF] = ' ',
    ['.' & 0x00FF] = '.',
    ['=' & 0x00FF] = '=',
    ['+' & 0x00FF] = '+',
    ['-' & 0x00FF] = '-',
    [':' & 0x00FF] = ':',
    [';' & 0x00FF] = ';',
    ['[' & 0x00FF] = '[',
    [']' & 0x00FF] = ']',
    ['(' & 0x00FF] = '(',
    [')' & 0x00FF] = ')',
    ['%' & 0x00FF] = '%',
    ['@' & 0x00FF] = '@',
    ['*' & 0x00FF] = '*',
    ['/' & 0x00FF] = '/',
    ['\\' & 0x00FF] = '\\',
    ['|' & 0x00FF] = '|',
    ['?' & 0x00FF] = '?',
    ['<' & 0x00FF] = '<',
    ['>' & 0x00FF] = '>',
   
['А' & 0x00FF] = 'A',                   //'А'0x90
['Б' & 0x00FF] = (char)160,             //'Б'
['В' & 0x00FF] = 'B', //'В'
['Г' & 0x00FF] = (char)161, //'Г'
['Д' & 0x00FF] = (char)224, //'Д'
['Е' & 0x00FF] = 'E', //'Е'
['Ж' & 0x00FF] = (char)163, //'Ж'
['З' & 0x00FF] = (char)164, //'З'
« Последнее редактирование: 04-02-2024 07:37 от Boriska » Записан
Boriska
Помогающий

ua
Offline Offline

« Ответ #38 : 04-02-2024 07:46 » 

вот из С#
char a = 'A';
int b = sizeof(a);

'identifier' does not have a predefined size, therefore sizeof can only be used in an unsafe context
Without unsafe context, the sizeof operator can only be used for types whose size is a compile-time constant. If you are getting this error, use an unsafe context.
The following example generates CS0233:

Возможно там было что то из этой оперы, но по идее бред. Надо будет откатить и все пересмотреть.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 04-02-2024 07:50 » 

Boriska, казалось бы, при чём тут шарп

а сам файл в какой кодировке то, кстати ?
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #40 : 04-02-2024 12:17 » 

UTF8
« Последнее редактирование: 04-02-2024 16:00 от Boriska » Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #41 : 07-02-2024 21:08 » 

Алексей++, я тот еще специалист в сях, но для меня неочевидно что из
"CHAR_BIT - number of bits in a byte"...
а сколько тогда в CHAR - байт?)

как-то продолжение беседы не увидел сразу)
« Последнее редактирование: 07-02-2024 21:12 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 08-02-2024 03:28 » 

Ochkarik, CHAR - это студийный алиас (то есть - вообще не относится к стандарту). Размер его в байтах равен sizeof(CHAR)
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #43 : 08-02-2024 09:03 » 

sizeof(char) = 1, массив из двух char должен быть размером 2, но вот что мы видим, хотя sizeof(char) = 1
https://drive.google.com/file/d/16NX_l3bEzo4psVqzKloxIr1nQQpocNmu/view?usp=sharing
« Последнее редактирование: 08-02-2024 10:46 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 08-02-2024 09:25 » 

Boriska, там логин какой-то просят
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #45 : 08-02-2024 09:25 » 

Символ в UTF-8 — это последовательность, от 1 до 4 байт.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #46 : 08-02-2024 10:47 » 

Ссылку перебил. Пробуйте.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 08-02-2024 11:07 » 

Boriska, литерал "ББ" в файле с кодировкой UTF8 (суть - массив типа const char[5] ) будет содержать
2 байта под 'Б'
2 байта под 'Б'
1 байт под '\0'

итого - 5

если версия языка позволяет, то проверить можно на этапе компиляции:
Код:
static_assert(sizeof s == 5);

Добавлено через 4 минуты и 50 секунд:
можно сделать отдельный файл *.c в нужной кодировке, там определить массив
(название только надо бы более говорящее)

//some.c - этот файл в нужной кодировке, к примеру 1251 Отлично
const char s[3]="ББ";

а в нужных местах (в файлах, где нужно видеть переменную) делать объявление:

Код:
extern const char s[3];



Добавлено через 4 минуты и 18 секунд:
собственно, чего это я. Ведь размер указывать придётся явно - это неудобно

если версия языка позволяет, то можно применить std::string_view

либо в заголовочнике эту переменную разместить, но добавить перед ней inline
« Последнее редактирование: 08-02-2024 11:23 от Алексей1153 » Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #48 : 08-02-2024 13:11 » 

Я собственно зацепился с эти почему
Цитата
Boriska, литерал "ББ" в файле с кодировкой UTF8 (суть - массив типа const char[5] ) будет содержать
2 байта под 'Б'
2 байта под 'Б'
1 байт под '\0'

итого - 5

язык С, создается массив, вычисляется размер 2 chara (sizeof(char)=1 в С), по идее получается конфликт, вычислено надо две ячейки выделено по две на символ. На каком таком этапе подмена понятий ?
(забудем что это строка), напишем char a[] = {'a'}; должно выделится одна ячейка, один же символ, и sizof говорит одну, а выделит 2.
Какая то не стыковка С и современных кодировок. Это при Ричи символы были по байту, а нынче погдяди в окно, под голубыми небесам великолепными коврами...По идее тогда sizeof в наше время уже не совсем то...Может я че не то горожу ?
« Последнее редактирование: 08-02-2024 13:15 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #49 : 08-02-2024 13:59 » 

Boriska,

char a[] = {'Б'};
- это массив размером в 1 элемент. Литерал 'Б', какой бы он длины не был, обрежется до char

а "ББ" - это строковый литерал. Это массив типа const char [размер]
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #50 : 09-02-2024 07:13 » 

да обрезало. И ни слова предупреждений. Символ то двухбайтовый. Вот интересно, когда int в byte то обязательно поругается, а тут нет.
не доработка однако. И в примере с массивом, тоже не ругнулось, массив char и размер его известен, а мы суем туда char но уже двубайтовый.
https://drive.google.com/file/d/1Or09vx6jxe1T9dtr935sRRyr1UdN8yE0/view?usp=sharing
« Последнее редактирование: 09-02-2024 07:14 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #51 : 09-02-2024 07:46 » 

>>да обрезало
так содержимое переменной char s смотри Улыбаюсь А не размер. С размером то всё понятно
содержимое будет обрезанное (хех)

Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #52 : 09-02-2024 08:11 » 

Цитата
так содержимое переменной char s смотри Улыбаюсь А не размер. С размером то всё понятно
содержимое будет обрезанное (хех)
но вякнуть же полагается, ну хоть ворнингом.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #53 : 09-02-2024 08:41 » 

Boriska, добавь компилятору три таких флага. Удивишься Отлично
-pedantic-errors -Wall -Wextra
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #54 : 11-02-2024 21:31 » 

так содержимое переменной char s смотри

Лёшик, тут ты не совсем прав. Содержимое переменной s, в данном примере, это адрес первой (нулевой) ячейки памяти. Надо смотреть, что лежит в памяти, начиная с этого адреса.

зы хотя я подозреваю, что ты это имел в виду

а мы суем туда char но уже двубайтовый.

char всегда один байт

Boriska, есть предположение.

в чём разница между

char a[] = {'a'};
и
char a = 'a';

Это не одно и то же.

Касаемо вот этого

Ты ж не смотри, что тебе редактор кода показывает (две буквы Б -> "ББ"), а посмотри реально память по адресу s.
« Последнее редактирование: 11-02-2024 21:47 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #55 : 12-02-2024 03:03 » 

Джон, да, я то и имею в виду - что в char s попадёт только младший байт

Добавлено через 38 секунд:
это же у него уже не массив, а отдельная переменная типа char
« Последнее редактирование: 12-02-2024 03:04 от Алексей1153 » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #56 : 12-02-2024 10:04 » 

Лёш, s объявлена как char s[], те это целочисленный указатель размером, установленным на данной системе. Насколько я понял, микроконтроллерные студии имеют свои особенности.
« Последнее редактирование: 12-02-2024 10:05 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #57 : 12-02-2024 10:21 » 

Джон, нее, смотри ответ 50, строка 133 на скрине. Там просто char s

и поправочка к
>>s объявлена как char s[], те это целочисленный указатель

таки нет. Указателем такая запись окажется только в случае, когда это аргумент функции

Код:
void F(char s[]){}
// это равнозначно
void F(char* s){}

в остальных случаях, char s[] - это массив. Но массив с непонятным размером, поскольку размер не указан, инициализатор - тоже (таким массивом компилятор не разрешит пользоваться)




Добавлено через 1 минуту и 45 секунд:
а если же инициализатор есть, то это массив с размером (но тоже не указатель)
« Последнее редактирование: 12-02-2024 10:23 от Алексей1153 » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #58 : 12-02-2024 10:49 » 

Джон, нее, смотри ответ 50, строка 133 на скрине. Там просто char s

Ок, сорри, я видел только скрин из #43.


таки нет. Указателем такая запись окажется только в случае, когда это аргумент функции

Код:
void F(char s[]){}
// это равнозначно
void F(char* s){}

в остальных случаях, char s[] - это массив.

Улыбаюсь А что есть массив?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #59 : 12-02-2024 11:20 » 

Джон, массив - это массив Улыбаюсь
Записан

Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines