Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    zzz528

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть файл h там что-то типа

    Код:
     
    class CacheStorage final : public nsISupports,
                               public nsWrapperCache,
                               public TypeUtils {
      typedef mozilla::ipc::PBackgroundChild PBackgroundChild;
    .....
     

    публики прописаны в других h и обычно оно всё в #include пишется. Но бывает нет, скажем
    h от TypeUtils не прописан в #include этого h файла, просто после #include пишут дополнительно

    Код:
     
    class TypeUtils;
     

    И всё, а h от TypeUtils прописывают вообще в другом файле который этот h пользует.
    А вот если я хочу добавить новый файл или ещё что - такая путаница это просто кошмар.
    Так какой смысл так делать???!!!!

    Всего записей: 1652 | Зарегистр. 20-06-2005 | Отправлено: 23:36 11-02-2023
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zzz528

    Цитата:
    Так какой смысл так делать???!!!!
     

    1. Иногда включить все сразу технически невозможно из-за циклических зависимостей.
    2. Люди используют такой прием в качестве инкапсуляции по разным причинам.

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 01:36 12-02-2023
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет. Есть код.

    Код:
    #include <memory>
     
    template <typename T>
    class CSimpleBlock
    {
    protected:
        std::unique_ptr<T[]> m_data;
        size_t m_size = 0;
     
    public:
        auto* Data() { return m_data.get(); }
     
        auto Size() { return m_size; }
     
        void SetSize(const size_t newsize)
        {
            if (newsize!= m_size) {
                m_data.reset(newsize? new T[newsize] : nullptr);
                m_size = newsize;
            }
        }
    };
     
    template <typename T>
    class CSimpleBuffer : public CSimpleBlock<T>
    {
    public:
        void ExtendSize(const size_t newsize)
        {
            if (newsize> m_size) {
                SetSize(newsize);
            }
        }
    };

    На MSVC v19.35 /std:c++17 компилируется нормально.
    На MSVC v19.35 /std:c++20 внутри класса CSimpleBuffer перестает видеть m_size и SetSize.
    Пробую GGC 13.1 также не видит m_size и SetSize.
     
    В чем проблема?

    Всего записей: 10499 | Зарегистр. 05-02-2003 | Отправлено: 19:40 10-06-2023 | Исправлено: V0lt, 20:20 10-06-2023
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    В чем проблема?

    Для удобства придумали так, что при поиске имен внутри поля имен параметризованного класса поле имен зависимого от параметра шаблона базового класса не рассматривается. Майкрософту было плевать на удобства, и он просто работал. Но, по прошествую полутора десятка лет, они решили сделать все по фэншую по умолчанию, а не только в режиме /Za.
    Другими словами, стандарт требует от Вас в этом месте квалифицированного имени, типа, CSimpleBlock<T>::m_size. Но C++ не был бы C++’ом, если не существовал другой способ заставить компилятор поискать имя в параметризованном базовом классе, типа, this->SetSize(newsize).

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 21:55 10-06-2023
    useretail



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    В чем проблема?

    очевидно что в ключе -fpermissive
     
    Добавлено:
    Rock
    +1

    Всего записей: 4629 | Зарегистр. 14-09-2007 | Отправлено: 22:03 10-06-2023
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    useretail

    Цитата:
    очевидно что в ключе -fpermissive

    Никаких подобных ключей в указанных компиляторах задано не было.
     
    Rock

    Цитата:
    Для удобства придумали так, что при поиске имен внутри поля имен параметризованного класса поле имен зависимого от параметра шаблона базового класса не рассматривается.

    Очень странное правило. Удобства тут не вижу, вижу нелогичность. Класс потомок спокойно предоставляет публичные методы класса родителя, но сам напрямую их использовать не может.

    Цитата:
    Но C++ не был бы C++’ом, если не существовал другой способ заставить компилятор поискать имя в параметризованном базовом классе, типа, this->SetSize(newsize).

    Спасибо. Накидал кучу "this->", компилируется без ошибок.

    Всего записей: 10499 | Зарегистр. 05-02-2003 | Отправлено: 23:02 10-06-2023
    useretail



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    Никаких подобных ключей в указанных компиляторах задано не было

    ключ указан не был, поэтому и ошибка. читайте что написал Rock

    Всего записей: 4629 | Зарегистр. 14-09-2007 | Отправлено: 23:05 10-06-2023 | Исправлено: useretail, 23:07 10-06-2023
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    Очень странное правило. Удобства тут не вижу, вижу нелогичность.

    C++ -- это религия. С очень странными правилами и обрядами. Любой, кто начинает писать на С++, становится странным, неудобным и нелогичным. Это судьба.
    Вот, взять, хотя бы Вас. Вы пишете size_t m_size = 0;. Это странно, неудобно и нелогично. Во-первых, здесь два лишних символа, один из которых набирается с шифтом, что довольно неудобно. Во-вторых, глядя на код, понимаешь, что первые два символа в имени – мусор (почти) и нужно смотреть дальше. В-третьих, современные среды помогают в написании кода и подставляют остаток имени при наборе. В Вашем случае среде нужно дождаться третьего символа, чтобы начать соображать. А Вам, соответственно, нужно каждый раз (и всю оставшуюся жизнь) эти лишние два символа набирать.
    Тем не менее, венгерская нотация иногда довольно удобна. Казалось бы, помести эти два лишних символа в конец имени и все станет намного лучше: size_t size_m = 0; -- и глаз сразу цепляется за осмысленные буквы, и среда начинает работать с первых же символов, и набирать последние два символа почти никогда набирать не придется. Профит! Но религия требует делать все наоборот.
    Кстати, после трех-четырех лет использования такой записи, Вам обязательно придет в голову, а зачем, собственно, вообще писать эту m? Ведь size_ выглядит ничуть не хуже, а места на экране занимает меньше.
    Или, например, запись std::unique_ptr<T[]>. Вот T* набрать гораздо удобнее и проще. Помимо того, что это на один символ меньше, это еще хоть и набирается двумя руками, но в очень удобном положении пальцев обеих рук. Последовательность [] при слепой десятипальцевой печати набирается одним правым мизинцем, который нужно еще и довольно ощутимо оттопырить. Но религия требует жертв.
    Про ключевое слово auto лучше вообще ничего не говорить. Вот, можно писать удобно – глянул на код и все понятно, что какого типа и чем оно занимается. А можно написать auto и сразу стало так, что что какого типа и чем оно занимается понятно только компилятору.
    Видимо, наши внуки доведут язык до состояния, когда писать на нем станет вообще невозможно и он, наконец-то, умрет.

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 00:20 11-06-2023
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    useretail
    Ключ не указан https://godbolt.org/z/basonWT68 , но ошибки нет.
     
    Rock
    Префикс "m_" могу не писать и компилятор ошибку не выдаст. К языку это не относиться.
    С "this->" совершенно иначе. В обычных классах никакого "this->" писать не требуется, а в шаблонном внезапно обязательно надо. Причина мне непонятна.

    Всего записей: 10499 | Зарегистр. 05-02-2003 | Отправлено: 06:55 11-06-2023 | Исправлено: V0lt, 06:57 11-06-2023
    useretail



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    V0lt
    GCC это совершенно другой компилятор и этот ключ именно для него

    Всего записей: 4629 | Зарегистр. 14-09-2007 | Отправлено: 16:19 11-06-2023
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    С "this->" совершенно иначе. В обычных классах никакого "this->" писать не требуется, а в шаблонном внезапно обязательно надо. Причина мне непонятна.

    К сожалению, я уже не помню причин, по которым было сделано так. Но мы с Вами можем попытаться поспекулировать на эту тему. Дальше – чисто мои измышления, которые могут оказаться ошибочными.
    С++ -- это довольно стремный и неконсистентный язык, к которому (почти) бессистемно приделывались новые возможности. Причем, иногда довольно спорные. Так, ключевое слово export было реализовано в одном единственном компиляторе (EDG), и его автор/основатель лавки Стив Адамчик был категорически против этого export, но, по иронии судьбы, ему единственному не повезло потратить кучу времени и бабок на его реализацию. В итоге на результат посмотрели, и ключевое слово export из стандарта языка убрали. Или никому не нужный двухфазный поиск имен. Майкрософт не заморачивалась с ним два десятка лет и, например, Вам это было абсолютно пофигу. Грамотная политика практической достаточности, так сказать.
    Подобное бессистемное усложнение языка быстро привело к тому, что время компиляции программ стало критическим блокирующим фактором – люди тупо не хотели тратить свое рабочее время/бабки та подобную херню и начали изобретать новые языки, типа, Java и C#.
    Поиск имен в поле имен параметризованного базового класса требует всех инстанцирований, включая частичные специализации, и двухфазный поиск имен. Это казалось очень дорого по времени и по умолчанию такой поиск, я полагаю, решили отключить. Майкрософту было пофигу – двухфазного поиска имен у них не было, да и вообще они у себя не реализовали много всякой фигни, что значительно упрощало им жизнь и было вполне себе пригодно для практического использования.
    Сейчас, вполне вероятно, мощности современных ЭВМ вполне хватает для того, чтобы подобный поиск производился всегда, как в старом Майкрософте. Но менять стандарт стремно, поскольку имена в Вашем параметризованном классе могут начать конфликтовать с именами в параметризованных базах. В принципе, перестанет собираться парочка программ и ничего страшного не произойдет. Но религия не позволяет менять Библию. Только дописывать. И обязательно так же криво.

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 20:04 11-06-2023
    paparazzo



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!
    Давно не пользовался С.
    В общем надо сделать ввод данных из файлов.
    Пытаюсь сформировать имя файла вида MLA_XX.txt, где XX - целый номер.
    Конструкцию ниже компилятор пропускает, но программа вылетает, что не так?
     
    int file_num;
    char file_name[30];
    file_num=99;
    sprintf(file_name,"MLA_%d",file_num,".txt");
    mlafile=fopen(file_name,"r");

    Всего записей: 3775 | Зарегистр. 06-04-2003 | Отправлено: 18:52 20-06-2023 | Исправлено: paparazzo, 18:54 20-06-2023
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    paparazzo
    sprintf неправильно используете, но это не должно приводить к падению.
    Правильно так:
    Код:
    sprintf(file_name,"MLA_%d.txt",file_num);

    Используйте отладчик, чтобы найти место падения.

    Всего записей: 10499 | Зарегистр. 05-02-2003 | Отправлено: 22:07 20-06-2023
    Garrett

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    paparazzo
    Надеюсь "mlafile" объявлена как "FILE *mlafile"?

    Всего записей: 2736 | Зарегистр. 16-10-2003 | Отправлено: 22:39 20-06-2023
    paparazzo



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Надеюсь "mlafile" объявлена как "FILE *mlafile"?

     
    Именно так!
     

    Цитата:
    sprintf неправильно используете, но это не должно приводить к падению.
    Правильно так:
    Код:
    sprintf(file_name,"MLA_%d.txt",file_num);

     
    Спасибо! Попробую

    Всего записей: 3775 | Зарегистр. 06-04-2003 | Отправлено: 08:06 21-06-2023
    paparazzo



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Спасибо! Попробую

     
    Весьма странно - с %d, %i не заработало, с %u работает. Ну да ладно. Если что Microsoft VisualSrtudio 2010

    Всего записей: 3775 | Зарегистр. 06-04-2003 | Отправлено: 17:26 21-06-2023 | Исправлено: paparazzo, 17:28 21-06-2023
    zzz528

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В h в classasa добавили
     
    public:
    blabla* owner() const;
     
    а в cpp
     
    inline classasa::blabla* classasa::owner() const {
    ...
    ...
    ...
    }
     
    ошибка на линке что classasa::owner() const undefined
    но если убрать 'inline' то нормально, но почему у них же как-то работает с inline тоже.

    Всего записей: 1652 | Зарегистр. 20-06-2005 | Отправлено: 00:24 03-04-2024
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zzz528
    Нельзя так делать. Уберите inline или реализуйте inline метод в заголовочном файле.
     
    StackOverflow: Ссылка на неразрешенный внешний символ (возможные причины)

    Всего записей: 10499 | Зарегистр. 05-02-2003 | Отправлено: 18:10 04-04-2024
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru