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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Abs62



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

    Цитата:
    Может я не прав, потому что торренты при скачивани создают цельный файл большого размера, а потом пишет данные по позициям.

    Данные в середине файла можно изменить, переписав их другим блоком того же размера. Но нельзя ни вставить, ни удалить, не переписывая весь файл.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 08:13 05-07-2013
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    разве это утверждение само себе не противоречит?
     
    у меня двдром полетел а я это сразу не заметил, потому что обленился и отключил проверку после записи. получилось десять дисков на которых файлы (фильмы) были побиты в серединке, инет был еще дорогой пришлось их перекачивать с торрента - один блок всего. потом специальной программой делать заплатки.

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 13:05 05-07-2013
    HNKTO



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

    Цитата:
    Данные в середине файла можно изменить, переписав их другим блоком того же размера. Но нельзя ни вставить, ни удалить, не переписывая весь файл.

    А как такое осуществить не подскажите? Хотя-бы в общем.
    Вариант:
    char Tbuf = {"abc"};
    hFile = fopen("Filename.txt", "r+");
    fwrite( Tbuf, 1, 3, hFile);
    fclose(hFile);
    У меня не приводил к каким либо изменениям в Filename.txt.

    Всего записей: 2092 | Зарегистр. 30-01-2010 | Отправлено: 22:19 05-07-2013
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    hFile = fopen("Filename.txt", "r+");
    fwrite( Tbuf, 1, 3, hFile);
     
    а что такое r+ ?

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 22:40 05-07-2013
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    HNKTO
    В общем посоветую для начала взять учебник по C и изучить главу про указатели, что они означают и зачем нужны. В чём разница между char и char *, и почему fwrite хочет именно char *.
    Ну и, конечно же, проверять возвращаемое значение fopen, на самом ли деле файл открылся.
     
    akaGM

    Цитата:
    а что такое r+ ?

    Дык, чтение + запись, вестимо.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 22:58 05-07-2013
    dragon010



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    HNKTO
    Сдается мне, раз ты тут, то учебники читать лень, так что просто замени первую строчку на
    const char *Tbuf = "abc";
     
     
    хотя хоть чуть-чуть разобраться в теме, перед тем как спрашивать, не самоя плохая привычка...

    Всего записей: 42 | Зарегистр. 18-03-2008 | Отправлено: 00:00 06-07-2013 | Исправлено: dragon010, 00:00 06-07-2013
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
     
    всегда писал "r" для чтения, "w" для записи, и "а" для дописывания...

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 01:00 06-07-2013 | Исправлено: akaGM, 01:01 06-07-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    HNKTO
    Если честно ожидал больше знаний. Ну как, нравится посыл в справку? Вместо 5 букв "fseek".

    Код:
    //пример использования функции fseek
     
    #include <cstdio>
    #include <iostream>

     
    int main()
    {

      FILE * ptrFile = fopen( "example.txt" , "r+" );
     
      //fputs( "This is sample." , ptrFile );       // записать в файл строку
      fseek( ptrFile , 9 , SEEK_SET );            // изменить позицию на 9 байт относительно начала файла
      fputs( "parta" , ptrFile );                 // дописать слово в файл
      fclose ( ptrFile );
      return 0;
    }

     

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 01:30 06-07-2013 | Исправлено: AZJIO, 02:27 06-07-2013
    HNKTO



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

    Цитата:
    Ну как, нравится посыл в справку? Вместо 5 букв "fseek"

    Вполне. Просто тогда 1) влом туда заглянуть было 2)было пора баиньки т. к. время поста+1 - рано утром на работу =)
    AZJIO, спасибо за рабочий пример. fseek - это да.
    Возможно косяки ВизуалСтудии 2010, но если вызывать fwrite зразу после fread - то данные в файл не записываются. А если на оборот - fread какую-то фигню возвращает, вместо данных из файла.
    Короче это меня ввело немного в ступор.
    ......................
    пример в посте 22:19 05-07-2013
    мдя. Вот и придумывай на вскидку что-нибудь на работе вечером.
    Тупо приношу извинения.

    Всего записей: 2092 | Зарегистр. 30-01-2010 | Отправлено: 01:01 08-07-2013
    AZJIO



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

    Цитата:
    оборот - fread какую-то фигню возвращает, вместо данных из файла.
    Если сделал запись в файл, то обязательно делать fflush, перед тем как считывать данные.
     
    При операциях записи в открытый файл используется буфер ввода / вывода размером 128 байт. Данные передаются в буфер и сбрасываются на диск только после заполнения буфера или при закрытии файлового указателя функцией fclose(). Функция fflush() предназначена для принудительного сброса данных из буфера, это гарантирует сохранение информации в физический файл.
     
    Осуществляя доступ к файлу, который открыт для чтения и записи, не следует сразу за операцией ввода выполнять операцию вывода, не прибегнув прежде к промежуточному вызову одной из следующих функций: fflush(), fseek(), fsetpos() или rewind(). Нельзя также сразу за операцией вывода выполнять операцию ввода, не прибегнув прежде к промежуточному вызову одной из перечисленных выше функций. Исключением является момент достижения конца файла во время операции ввода, т.e. в конце файла вывод может непосредственно следовать за вводом.

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 02:56 08-07-2013 | Исправлено: AZJIO, 17:57 08-07-2013
    HNKTO



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

    Всего записей: 2092 | Зарегистр. 30-01-2010 | Отправлено: 00:11 09-07-2013
    say24



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Задача по ШАБЛОНАМ - не для слабонервных
     
    Нужно что-то вроде многомерного списка с разными типами данных:
    1. Добавляем по очереди несколько одномерных массивов (тип данных массивов - разный!) в один контейнер, также в другой контейнер, и т. д.
    2. Добавляем конейнер в ТАКОЙ ЖЕ вышестоящий контейнер, и ещё добавляем контейнер и т. д.
    и т.д.
     

    Код:
     
    template<class T> class ReursiveContainer
    {
        T* ArrayOfData;
    public:
        ReursiveContainer(T* PointerToData)
        {
            ArrayOfData = PointerToData;
        }
        T GetElement(int i)
        {
            return ArrayOfData[ i];
        }
    };
     
    void f()
    {
    // На первом уровне - всё проходит: добавляем реальные данные
        double ArrayOfDouble[] = {0.1, 0.5, 1.5};
        ReursiveContainer<double> *MyContainerDouble = new ReursiveContainer<double>(ArrayOfDouble);
        int ArrayOfInt[] = {100, 1, -20};
        ReursiveContainer<int> *MyContainerDouble = new ReursiveContainer<int>(ArrayOfInt);
    // Однако, дальше то как?
        ReursiveContainer<ReursiveContainer<?????????????????> > *MyConteiner_Level_2;
    }
     

     
    Добавлено:
     
     
     
    Было бы неплохим вариантом решения, если бы можно быть передавать тип, как переменную, шаблонная функция:
     

    Код:
    void *Storage;
    тип_хранения_типов SaveType;
    ...
    template<class T> void Put(T* X)
    {
        Storage = (void *)X;
        SaveType = T;
    }
    ...
    template<class T> T Get(int i)
    {
        return ((SaveType *)Storage)[i];
    }
     

     
    Но как в этом случае передать тип? Шаблоны Put и Get не могут быть связаны, так как тип становится определённым только после вызова Put

    Всего записей: 261 | Зарегистр. 18-02-2003 | Отправлено: 16:14 09-07-2013 | Исправлено: say24, 16:16 09-07-2013
    panda3

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    say24
    1. Шаблоны используются для выбора алгоритма при компиляции. При работе программы для этих целей нужно использовать виртуальные функциии или операторы ветвления.
    2. Какой ты хочешь иметь тип выражения:
    Код:
    MyConteiner_Level_3->GetElement[i]->GetElement[j]->GetElement[k]
    ?
    Не изобретая велосипеда, можно, например, состряпать нечто вроде:

    Код:
     
    #include "boost/variant.hpp"
     
    class RecursiveContainer;
     
    typedef boost::variant<int, double, RecursiveContainer*> TBaseItem;
     
    typedef std::vector<RecursiveContainer*> TCont;
     
    typedef boost::variant<
        int*,
        double*,
        TCont
    > TItem;
     
    class RecursiveContainer  
    {  
        TItem ArrayOfData;  
    public:
        template<class T>
        RecursiveContainer(T* PointerToData) : ArrayOfData(PointerToData)
        {}  
     
        RecursiveContainer() : ArrayOfData(TCont())
        {}
     
        void push_back(RecursiveContainer* item)
        {
            boost::get<TCont>(ArrayOfData).push_back(item);
        }
     
        class getter : public boost::static_visitor<TBaseItem>
        {
            int idx;
        public:
            getter(int i) : idx(i) {}
     
            template<class T>
            TBaseItem operator()(T p) const
            { return TBaseItem(p[idx]); }
        };
     
        TBaseItem GetElement(int i)  
        {  
            return boost::apply_visitor(getter(i), ArrayOfData);
        }
     
        RecursiveContainer* GetSubContainer(int i)  
        {  
            return boost::get<RecursiveContainer*>(GetElement(i));
        }
    };  
     
    double ArrayOfDouble[] = {0.1, 0.5, 1.5};
    int ArrayOfInt[] = {100, 1, -20};
     
        RecursiveContainer
            Level1_int(ArrayOfDouble),
            Level1_double(ArrayOfInt), Level2_1, Level2_2, Level3;
        Level2_1.push_back(&Level1_int);
        Level2_1.push_back(&Level1_double);
        Level2_2.push_back(&Level1_double);
        Level2_2.push_back(&Level1_int);
        Level3.push_back(&Level2_1);
        Level3.push_back(&Level2_2);
        std::cout << Level3.GetSubContainer(0)->GetSubContainer(0)->GetElement(0) << std::endl; // 0.1
        std::cout << Level3.GetSubContainer(1)->GetSubContainer(0)->GetElement(0) << std::endl; // 100
     

    Всего записей: 203 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-07-2013
    say24



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Прикольно, хоть и не совсем универсально.
    Свою задачу - я решил, правда "красивого решения" с универсальным контейнером - так и не придумал. У меня задача была - не совсем про контейнеры, это я тут - упростил, чтобы не описывать огромную идею. Мне действительно надо было связать контейнеры в иерархию через рекурсивный объект, но - для обработки данных. А решил так: запаковал нижний уровень, где реальные данные:

    Код:
    template<class T> class Container_class
    {
    private:
        T* SourcePointer;
        int SourceSize;
        Container_Recursive_class *Container_Recursive;
        bool Container_Recursive_Ready;
    public:
        Container_class(T* SourcePointer__a, int SourceSize__a)
        {
            SourcePointer = SourcePointer__a;
            SourceSize = SourceSize__a;
            Container_Recursive = new Container_Recursive_class();
            Container_Recursive_Ready = Container_Recursive->Add(SourcePointer, SourceSize, sizeof(T));
        }
     
        bool IsLinked() { return (Container_Recursive->IsLinked()); }
     
        bool Flag() { return (Container_Recursive->Flag()); }
     
        void LinkUp(Container_Recursive_class *Upper_ContainerRecursive)
        {
            if(Container_Recursive_Ready) if(!Container_Recursive->IsLinked()) Upper_ContainerRecursive->Add(Container_Recursive);
        }
     
        T P()
        {
            int i = -1;
            if(Container_Recursive_Ready) i = Container_Recursive->I();
            return ((i>=0 && i<SourceSize) ? SourcePointer[ i ] : 0);
        }
    };

    Всего записей: 261 | Зарегистр. 18-02-2003 | Отправлено: 16:38 11-07-2013 | Исправлено: say24, 16:44 11-07-2013
    Stalker



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите понять смысл вот такого определения типа данных

    Код:
     
    typedef void (*alt_isr_func)(void* isr_context, alt_u32 id);
     

    далее он используется, например, в функции для регистрации прерывания

    Код:
     
    int alt_irq_register (alt_u32 id, void* context, alt_isr_func handler)
    {
    ...
    }
     


    Всего записей: 32 | Зарегистр. 17-12-2005 | Отправлено: 14:24 01-08-2013 | Исправлено: Stalker, 14:27 01-08-2013
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    typedef void (*alt_isr_func)(void* isr_context, alt_u32 id);  
     
    определяется новый тип alt_isr_func -- указатель на функцию, ничего не возвращающую и принимающую два аргумента (void*, alt_u32)

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 14:29 01-08-2013
    Stalker



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM, спасибо!
    Просто не понял смысла объявлять параметры в типе данных.
     
    Причем, я так понял, это не обязательно должна быть функция ничего не возвращающая,
    void вместе с * означает, что тип указателя будет определён позднее, при объявлении самой функции, но он не обязательно будет void.

    Всего записей: 32 | Зарегистр. 17-12-2005 | Отправлено: 14:49 01-08-2013 | Исправлено: Stalker, 14:53 01-08-2013
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Stalker
     
    нет...
    ты путаешь формат вызова функции (её прототип) с просто указателем (пусть даже и на неё)...
     
    alt_isr_func pFunc;
    void *p;
     
    void myFunc1(void* a1, alt_u32 a2)
    {
    }
     
    int myFunc2(void* a1, alt_u32 a2)
    {
    }
     
     
    pFunc = myFunc1; можно
    pFunc = myFunc2; а это нельзя...
    pFunc = (alt_isr_func)p; можно
    p = (void *)pFunc; тоже можно, только непонятно зачем...
     
    и вообще...

    Цитата:
    в функции для регистрации прерывания
    нужно быть предельно аккуратным, в нормальных библиотеках для таких дел должны быть свои предопределённые типы...

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 15:00 01-08-2013 | Исправлено: akaGM, 17:38 01-08-2013
    dragon010



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

    Цитата:

    Цитата:
    в функции для регистрации прерывания

    нужно быть предельно аккуратным, в нормальных библиотеках для таких дел должны быть свои предопределённые типы...

     
    +1
    С сингналами не все так просто, если сильно не погружаться - то можно просто посмотреть на man 7 signal  
    а именно список
    Это функции которые будут вести себя адевкатно в хендлерах обработки сигналов.

    Всего записей: 42 | Зарегистр. 18-03-2008 | Отправлено: 22:02 01-08-2013 | Исправлено: dragon010, 22:08 01-08-2013
    Aleksoid1978



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет.  
    Есть "интересный" вопрос знатокам MFC.
    Диалог настроек, создается с помощью CPropertySheet.
    Вот скрин:

     
    Сколько я не ковырялся, так и не смог понять - почему размер диалога буквально на пару пикселей меньше(по высоте) чем TreeCtrl. У меня такое чувство что это сам MFC так выводит.
     
     
    P.S. Вопрос снят - нашел как менять размер.

    ----------
    AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

    Всего записей: 9225 | Зарегистр. 11-05-2006 | Отправлено: 08:44 02-08-2013 | Исправлено: Aleksoid1978, 09:55 02-08-2013
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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