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

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

ua
Offline Offline

« : 24-09-2021 10:49 » 

Либерти С за 21 день. стр 164 https://ibb.co/K5sNsvm
Они - объекты, они же изолированы, каждый имеет свое и только функции общие...
« Последнее редактирование: 24-09-2021 11:45 от Boriska » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 24-09-2021 12:52 » 

Не понятно, какая связь между цитатой из книги и Си.

По цитате: вообще написано нечто недостаточно ясное. Я так понял: Cat::some_method(Cat &other) { ... other.itsAge ... }. Да, так можно. Код не различает "свой" объект и "чужой".
« Последнее редактирование: 24-09-2021 12:57 от RXL » Записан

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

ua
Offline Offline

« Ответ #2 : 24-09-2021 13:37 » 

А как же пресловутая фраза, что методы объекта предназначены для работы с членами-полями объекта. А они значит могут вывести нутро другого, такого же ? А где про это можно глянуть, чтоб понять, почему так.
« Последнее редактирование: 24-09-2021 13:59 от Boriska » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 24-09-2021 15:29 » 

Я так понял, что тут говорится примерно про такой случай
Код: (C++)
#include <iostream>
#include <string>

class Cat {
public:
    Cat(const std::string& Name, int Age) {
        name = Name;
        itsAge = Age;
    }
   
    Cat(const Cat& obj) {
        name = obj.name;
        itsAge = obj.itsAge;
    }
   
    void print() {
        std::cout << "Cat name is " << name << " and  " << itsAge
                  << " years old" << std::endl;
    }
private:
    std::string name;
    int itsAge;

};


int main() {
    Cat Fresske("Freeske", 5);
    Cat Boots(Fresske);
    Boots.print();
    return 0;
}
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов. В принципе для этого это нужно.
« Последнее редактирование: 24-09-2021 15:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

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

WWW
« Ответ #4 : 24-09-2021 22:42 » 

Код для класса один. Объектов может быть сколько угодно. Скрывать поля объекта своего класса только потому что он не this? А смысл?
Дело не только в копировании. Любой метод, например сравнение, может иметь доступ к приватным членам другого объекта своего класса. Если, конечно, у него есть указать или ссылка на него. Ну или копия.
Код: (C++)
class X {
        int v;
    public:
        X(int v) : v(v) {}
        bool operator< (const X& other) { return v < other.v; }
};
« Последнее редактирование: 24-09-2021 22:44 от RXL » Записан

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

ua
Offline Offline

« Ответ #5 : 30-09-2021 04:34 » 

Цитата
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов.
Ну если это оставлено специально для целей копирования или перегрузки операторов, почему оставлено и для всех остальных случаев. Это же можно было бы как-то урезать ? И потом оговорить это в литературе. А так как-то в период изучения конструкторов как-то не обращаешь на эту особенность внимания, а потом возникают вопросы.
Да как по мне, страдает концепция защиты полей или стройность. Это создание бэк доров Улыбаюсь
Код:
void steal_secret(const Cat& otherCat) { secret = otherCat.secret; }
« Последнее редактирование: 30-09-2021 04:41 от Boriska » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #6 : 30-09-2021 20:01 » 

"В литературе" все оговорено. Скока там? 1857 страниц?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 01-10-2021 03:29 » 

Boriska, выдача копий или ссылок на константы наружу из класса не нарушают целостность класса, поэтому это можно свободно делать (с многопоточностью, правда, немного сложнее)

а чтобы случайно не "портить" поля класса в тех методах, где это не должно произойти, сам метод можно пометить как const
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #8 : 01-10-2021 09:14 » 

Цитата
"В литературе" все оговорено. Скока там? 1857 страниц?
"Литературу" скачал.  Как в ней ориентироваться, ну к примеру с нашим случаем ?
Литература гласит http://ibb.co/q0nC365 только друзья и мемберы.
Нет я понимаю, что доступ есть, как это найти ?
« Последнее редактирование: 01-10-2021 10:25 от Boriska » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #9 : 01-10-2021 12:53 » 

Код класса имеет доступ к мемберам и методам согласно простым правилам, описанным во всех самоучителях и справочниках.
Для кода класса нет своих и чужих объектов. Если имеется от "чужого" объекта своего класса значение, ссылка или указатель, имеет те же права доступа к его мемберам и методам, как и с this.
« Последнее редактирование: 01-10-2021 13:10 от RXL » Записан

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

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 01-10-2021 20:35 » 

Почитать внимательно про private, protected и public области более внимательно. В чем у них принципиальная разница. Также понять в чем разница между понятиями "класс" и "экземпляр класса". То, что ты пишеш в реализации методов класса, ты сам себе злобный буратино. Компилятор не должен и не может отлавливать твои логические ошибки. А начальство и коллеги просто будут очень сильно стучать по рукам, выпремляя их. А если не будет  помогать, то скорее всего отправят в свободное плавание.
« Последнее редактирование: 01-10-2021 20:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 02-10-2021 05:00 » 

Кстати, когдв решишся изучать python. То после С++ будут последние волосы на затылке вставать дыбом. В python вполне возможна такое использование переменных
Код: (Python)
class a:
    def __init__(self):
        pass
   
   
b = a()
b.a = 6
print(b.a)
Т.е. завести переменную вне класса в экземпляре класса и использовать ее извне. При этом никак не влияя на работу класса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Boriska
Помогающий

ua
Offline Offline

« Ответ #12 : 26-01-2022 07:40 » 

Привет. Коллеги разъясните пожалуйста.
Код: (C++)
char* p_string = new char[5];
delete p_string;

char* p_string = new char[5];
delete []p_string;

Студия говорит - правильный второй вариант. Во втором случае подчеркивает зеленым и пишет "память была выделена при помощи оператора new [] для массивов, а удалятеся при помощи скалярного оператора delete "
Прошу разъяснить, мы когда получаем char* p_string = new char[5]; мы получаем указатель на символ, про массив указатель не знает. Почему же Липман удалят чрезе delete []p_string; и почему студия видит что это какой то не совсем указатель на char
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #13 : 26-01-2022 08:36 » 

Boriska, второй вариант правильный. Как выделялось, так и должно удаляться:

Код: (C++)
char* p_item = new char;
delete p_item;

char* p_array = new char[5];
delete [] p_array;

при других сочетания будет неопределённое поведение программы

А подчёркивает статический анализатор - он может такие ошибки выявлять иногда
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #14 : 26-01-2022 12:43 » 

Погоди Алексей.
В С++ указатель на char, он же ничего не может знать кроме как про char.
Я понимаю, что в доке написано надо delete [] pointer;
Тогда поясни.
Мы когда записываем char* p_item = new char; мы же делаем два действия
1.Запрашиваем чтобы ОС выделила нам память.
2.Запоминаем адрес начала куска этой памяти и ОС уже знает что это наша память.

теперь я рассуждаю как в С#, если я удаляю ссылку и ссылок больше нет, ею может воспользоваться кто угодно и мусорщик ее помечает что она ничья.
в С++ же по идее если мы делаем delete pointer, мы как я понимаю помечаем что этот кусок уже ни чей - пользуйтесь, а что там лежит уже никого не интересует.

В нашем случае что несет информацию сколько памяти освободить ? скобки-бред
Я так понимаю ОС выделила память и отдала дескриптор, и она знает сколько памяти выделено на данный дескриптор, поступил запрос отдать память по этому дескриптору, она разберется сколько.
Нифига не пойму зачем скобки, а главное как "[]pointer" превращается в  pointer, ведь для delete нужен pointer(адрес).



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

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


« Ответ #15 : 27-01-2022 03:30 » 

Boriska, нужно исходить из того, что это требуется стандарт C++:
для аллокации/освобождения на куче одного элемента используется new/delete
для аллокации/освобождения на куче массива элементов используется new[]/delete[]
если не соблюдать, будет UB

про ОС - нет ни слова. Это стандарт языка

А тонкости реализации могут быть свои у разных компиляторов - для одного элемента размер выделенного блока известен (sizeof(type)) , а для массива, я полагаю, количество элементов где-то сохраняется дополнительно.

со скобками и без - это разные операторы
https://en.cppreference.com/w/cpp/memory/new/operator_new
https://en.cppreference.com/w/cpp/memory/new/operator_delete

а ещё
а ещё есть placement вариант вызова new, когда можно конструировать объект в заранее выделенной памяти. И это единственный случай, когда нужно вручную вызывать деструктор
« Последнее редактирование: 27-01-2022 03:32 от Алексей++ » Записан

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

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

WWW
« Ответ #16 : 27-01-2022 21:23 » 

С точки зрения управления памятью, со скобками или без — пофиг. Не пофиг деструкторам объектов. Одно дело массив символов, другое дело — массив объектов. Без скобок будет вызван деструктор только для первого объекта в массиве, на который и указывает указатель. Со скобками он вызовет деструктор на каждом объекте в массиве (размер он знает).
В любом случае лучше писать корректно. Положены скобки — пиши со скобками. Заведи себе правило компилироваться с максимумом предупреждений. Доводи программу до их полного отсутствия.

Массив символов в современном C++ — это архаично. Попробуй std::string. Не забивай себе мозги ерундой, пока не знаешь достаточно.
« Последнее редактирование: 27-01-2022 21:25 от RXL » Записан

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

ua
Offline Offline

« Ответ #17 : 04-02-2022 14:33 » 

Привет.
static_cast<>, dinamic_cast<>, reinterprit_cast<>.... Липман пишет, что более читаемо, но также опасно как и раньше (int)m1 (double)m2..., надо чтобы программист по прежнему держал под контролем.
Подскажите что же нового, прогрессивного оно нам принесло, мне так старый синтаксис получше будет. Или они генерируют исключения ?
И если исключения генерит, нельзя ли было сделать чтобы скобки их генерировали ?
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #18 : 04-02-2022 17:11 » 

А почитать пробовал? Не Липмана (кто это вообще?), а спецификацию языка.
https://en.cppreference.com/w/cpp/language/static_cast
https://en.cppreference.com/w/cpp/language/dynamic_cast
https://en.cppreference.com/w/cpp/language/reinterpret_cast
https://en.cppreference.com/w/cpp/language/const_cast

Про части const, пожалуй соглашусь, что сишное приведение проще. По остальному рекомендую читать.
« Последнее редактирование: 04-02-2022 17:13 от RXL » Записан

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

ua
Offline Offline

« Ответ #19 : 04-02-2022 17:55 » 

Липман. Стенли Липман автор некоротого числа книг по С++.
В спецификации языка ничего на мой вопрос нет, там только какие типы и чем могут быть преобразованы. А как он поведет себя при не совпадении, зачем выдуман более сложный синтаксис - там такого не пишут, ну или я не умею читать спецификацию.
Записан
Boriska
Помогающий

ua
Offline Offline

« Ответ #20 : 15-12-2023 10:19 » 

Цитата
Это как С++ такое может быть.
char code_page_ru[256] = {
    [' '] = ' ',
    ['/'] = '/',
    ['.'] = '.',
};
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #21 : 15-12-2023 10:31 » 

Boriska, это в Си так можно, а в C++ неможно )
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #22 : 15-12-2023 10:33 » 

а  какова идея, как оно фунциклит ? Этж против всех законов физики. И по идее все законное в С - должно работать С++
« Последнее редактирование: 15-12-2023 10:35 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #23 : 15-12-2023 10:39 » 

Boriska, инициализация только элементов с индексами
(size_t)' '
(size_t)'/'
(size_t)'.'
остальные элементы - обнуляются

Добавлено через 25 секунд:
>>И по идее все законное в С - должно работать С++
нет, это разные языки
« Последнее редактирование: 15-12-2023 10:40 от Алексей1153 » Записан

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

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


« Ответ #24 : 15-12-2023 10:43 » 

ещё в Си вот так можно

Цитата
struct A
{
    int i1;
    int i2;
    int i3;
    int i4;
};

struct A a={.i2=7, .i4=42};
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #25 : 15-12-2023 11:23 » 

вообще это какая то недокументированная фича или ...?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #26 : 15-12-2023 11:43 » 

Boriska, это фича языка Си - designator-initialization https://en.cppreference.com/w/c/language/initialization
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #27 : 15-12-2023 12:33 » 

спсб
Записан
Boriska
Помогающий

ua
Offline Offline

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

Привет. Писал под контроллер и вдруг обнаружил, что char это не 8 а 16. В студии кодировка двухбайтовая вот и пожалуйста. В связи с этим вопрос о типах. Как нынче определять размер типа без sizeof. Вот допустим char будет зависеть не от контроллера или ПК, а от студии. А допустим int. По идее от платформы ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #29 : 02-02-2024 16:37 » 

Boriska, привет. Количество битов в типе char лежит в константе CHAR_BIT
для C https://en.cppreference.com/w/c/types/limits
для C++ https://en.cppreference.com/w/cpp/types/climits

>>Как нынче определять размер типа без sizeof
размер типа определяется нынче именно при помощи sizeof Улыбаюсь
Записан

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 » 

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

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

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

« Ответ #60 : 12-02-2024 14:07 » 

Улыбаюсь "Такой… Падает, одним словом." (c)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines