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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alxm
    Код:
    The SendDlgItemMessage function does not return until the message has been processed.  
    Using SendDlgItemMessage is identical to retrieving a handle to the specified control and calling the SendMessage function
    Так что ищи другое решение.


    ----------
    Майкудук, Пришахтинск не предлагать!:)
    А на Пирогова приходит снова весенний гомон...

    Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 01:11 30-05-2007
    alxm

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    Спасибо. Второй способ заработал сразу. Но так как перерывы на вывод информации в цикле происходят редко, то обновление окна выполняется рывками (например, при перемещении окна мышью). Наверное, имеет смысл попробовать CreateThread.

    Всего записей: 8 | Зарегистр. 26-02-2006 | Отправлено: 01:33 30-05-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    TeXpert
    Дык как раз таки
    Цитата:
    function DOES NOT return until the message has been processed
    , так что с этой точки зрения все очень даже верно. Шутка в том, что текст для этого окошка установится, а вот чтобы его прорисовать - нужно еще сообщение WM_PAINT обработать, которое автоматом посылаться в очередь при обработке окошком сообщения WM_SETTEXT, а очередь сообщений начинает обрабатываться только в основном рабочем цикле приложения, до которого дело доходит только после возврата из этой самой большой и жырной процедуры.
    alxm
    Да, всё верно, от рывков можно избавиться только создав отдельный тред для своей процедуры.

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 01:41 30-05-2007
    TeXpert



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

    ----------
    Майкудук, Пришахтинск не предлагать!:)
    А на Пирогова приходит снова весенний гомон...

    Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 01:45 30-05-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude, как я помню, для того что бы заставить окно перерисоваться самое простое, это вызвать функцию BOOL InvalidateRect(HWND, CONST RECT*, BOOL).

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 10:18 30-05-2007
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    veronica b
    InvalidateRect пошлёт то же самое сообщение WM_PAINT.

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 10:46 30-05-2007
    OleFun



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Использовал следующие функции для конвертирования строк в Uppercase и LowerCase:
     
    std::string ConvertToUpper(const std::string &aValue)
    {
            std::string result = aValue;
            std::transform(aValue.begin(), aValue.end(), result.begin(), (int(*)(int))std::toupper);
            return result;
    }
     
    std::string ConvertToLower(const std::string &aValue)
    {
            std::string result = aValue;
            std::transform(aValue.begin(), aValue.end(), result.begin(), (int(*)(int))std::tolower);
            return result;
    }
     
    Недавно заметил что они не работают для UTF-8 строк (кириллица)
    Как правильно преобразовать std::string в Uppercase и LowerCase для UTF-8?

    Всего записей: 20 | Зарегистр. 12-02-2003 | Отправлено: 13:49 30-05-2007
    veronica b



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

    Цитата:
    InvalidateRect пошлёт то же самое сообщение WM_PAINT.

    Абсолютно верно, но есть "маленькая" тонкость, пошлет, но минуя системную очередь! Прямо в оконную процедуру.

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 17:29 30-05-2007
    Abs62



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

    Цитата:
    Абсолютно верно, но есть "маленькая" тонкость, пошлет, но минуя системную очередь!

    Хм. Смотрим описание:

    Цитата:
    Remarks
    The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function.  
     
    The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window.
     
     
    Тут как раз сказано обратное - сообщение будет послано, только если WM_PAINT в очереди нет.
    А если уж очень хочется послать напрямую, для этого надо ещё задействовать  UpdateWindow:

    Цитата:
    The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:41 30-05-2007
    veronica b



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

    Цитата:
    А если уж очень хочется послать напрямую, для этого надо ещё задействовать  UpdateWindow:

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

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 12:36 31-05-2007
    AirBlade



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    2 нубских вопроса по C++Builder 6:
    Как задать фоновое изображение надписи в форме или сделать фон надписи прозрачным?
     
    Почему на картинке у SpeedButton появились белые точки?  

    Всего записей: 1 | Зарегистр. 31-05-2007 | Отправлено: 22:33 31-05-2007
    iamrecvezitor

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравстуйте. Вот меня на собеседовании озадачили таким вопросом как инвертировать однонаправленный список? Т.е. у нас есть однонаправленный список, нужно сделать так, чтобы поле с указателем на следующюю структуру каждой структуры ссылался не на следующий а на предыдущий элемент списка. Я в затупе. Кроме как запомнить все адреса в обычном массивы, а потом их переназанчить  я ничего не придумал. Может быть есть готовый алгоритм этого процеса без использования массива?

    Всего записей: 8 | Зарегистр. 31-05-2007 | Отправлено: 16:25 02-06-2007
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Примерно так:
    Код:
    struct snode
    {
     /* ... */
     snode *next;
    };
     
    snode* ptr;
     
    /* ... */
     
    if(ptr != NULL)
    {
     snode *ptrNext = ptr->next,
           *ptrPred = NULL;
     
     while(ptrNext!=NULL)
     {
      ptr->next = ptrPred;
      ptrPred   = ptr;
      ptr       = ptrNext;
      ptrNext   = ptr->next;
     }
     ptr->next = ptrPred;
    }
    Зачем массивы?

    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 17:59 02-06-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    iamrecvezitor, ваш вопрос задают на собеседовании довольно часто. Из моего опыта, я могу сказать, что очень важно нарисовать рисунок списка и через стрелки показать как меняется связи списка. Посмотрите книгу Джоэла Слопольски, "Джоэл о программировании". Там, как я помню, эта задача расматривалась и сего легкой руки стали широко использовать!

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 21:33 02-06-2007
    iamrecvezitor

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Qraizer, veronica b спасибо. Блин все так элегантно... а я там замутить пытался... мда видимо опыта явно не хватает. Кстати рисуночки то я им нарисовал, а вот реализовать это не получилось в отведенное время
     
     
    Добавлено:
    Qraizer
    хмм.. у меня так как у вас не получилось... пришлось немного изменить
     
        struct ar *nextSave;
        struct ar *tail = NULL;
     
        current = head;
        nextSave = current->next;
     
                    while(nextSave!=NULL)
        {        
            prev = current;
            current = nextSave;
            nextSave = current->next;    
            if(current->next == NULL)
                tail = current;
            current->next = prev;
        }
        current = head;
        current->next = NULL;

    Всего записей: 8 | Зарегистр. 31-05-2007 | Отправлено: 03:47 03-06-2007
    L0ST



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Люди помогите пожалуйста, наверно децкий вопрос!
    Выдает ошибку "Lvalue required" на следующей строке

    Код:
     
    (char huge *)            v3 = (char huge *) (vm + 32768l);
     

    Как исправить чтоб работало?
    Пробовал удалять (char huge *), оставив только

    Код:
     
    v3 = (char huge *) (vm + 32768l);
     

    в этом случае компилируется без ошибок, но функционал теряется!

    Всего записей: 281 | Зарегистр. 08-11-2003 | Отправлено: 17:56 04-06-2007
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    iamrecvezitor Давай смотреть.
    Цитата:
    nextSave = current->next;      
            if(current->next == NULL)  
                tail = current;
    Нетрудно увидеть, что current->next и nextSave равны, благодаря первому присваиванию, поэтому условие будет истинным, только если это последняя итерация цикла. Значит весь if можно смело выкинуть из цикла, а присваивание tail-у просто поставить за его концом.
    Цикл у тебя имеет инвариант: в начале каждой итерации - current указывает на "новую" голову уже перевёрнутого списка, а nextSave - на остаток (хвост) ещё не перевёрнутого; в конце итерации к "новому" списку в голову добавляется указываемый предыдущим nextSave-ом, а сам nextSave перемещается дальше. Всё хорошо и правильно, за исключением того, что "новый" список не является списком - его последний элемент (бывший первый) ссылается не на NULL, а на предпоследний (бывший второй). Ты знакОм с концепцией отказоустойчивого (безопасного) программирования? Если нет, то познакомься, если да, то почему её не соблюдаешь? Конечно, NULL ему-таки присваивается
    Цитата:
    current = head;  
        current->next = NULL;
    но почему-то в самом конце, а не начале. Нелогично. Кроме того, если ты разворачиваешь список, то его новая голова - это по логике head, а новый хвост - это tail. А так как у тебя эти переменные используются, согласись, смущает.
    Итак, head - это голова списка. Для односвязного списка этого достаточно, т.е. tail избыточен. Даже бесполезен, наверное. Если head в "новом" списке станет хвостом, то он тоже будет безполезен, как в бывшем был бесполезен tail. Следовательно нет никакой причины иметь две переменные. Далее, current - это у тебя текущая голова (для текущей итерации) для "нового" списка. Т.к. head в цикле не используется, после цикла станет новой головой, а заNULLение хвоста списка мы вроде бы уже перенесли в начало алгоритма, получается, что и current не нужен, его вполне можно заменить head-ом.
    Если теперь всё это применить к твоему тексту, то получится как раз, как у меня с точностью до замены имён переменных.
    К чему это я собственно, чуть не забыл. Я не хочу сказать, что твой хуже (хотя несоблюдение логической целостности структур - это очень нехорошо), скорее, чуть сложнее и медленнее, однако мой фрагмент так же корректно отрабатывает ситуации с пустым списком, чего не скажешь о твоём. Непонятно, почему у тебя не вышло, как у меня - ведь в итоге твой текст получился эквивалентными моему.  
     
    Добавлено:
    L0ST
    И правильно выдаёт. Не знаю, какого типа у тебя v3, но если не char huge*, то кастование к char huge* создаёт новую неименованную временную переменную, присваиваение которой бессмысленно, т.к. в конце выражения одна будет уничтожена. Чтобы было понятнее, рассмотри такой вариант своего кода
    Код:
    int v3;
     
    (double) v3 = 123.456;
    Тоже не скомпилится.


    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 18:45 04-06-2007 | Исправлено: Qraizer, 18:59 04-06-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    L0ST, а какой тип имеет переменная vm, если я правильно понял, то напиши так
    v3 = (char huge *) (&vm + 32768l);  
    Понятно, где я исправил?
    Если не пройдет, то напишите определение vm и что вы хотите получить!

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 20:45 04-06-2007 | Исправлено: veronica b, 20:47 04-06-2007
    iamrecvezitor

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Qraizer
    мне пришлось немного переделать ваш текст, потому что когда я его применил у меня наотрез отказывался присваивать ссылке ptr->next(или current->next) указатель на предыдущий элемент. И ктому же он никогда не выходил из первого цикла

    Цитата:
    if(ptr != NULL)  

     
    На счет избыточности tail и проверки его внутри цикла согласен. А на счет избыточности current не совсем. По моему разумению head хранит голову списка(и поидее не должна изменяться, чтобы не забыть начало списка), а current это переменная, которая пробегает по текущему элементу страого списка.  
     

    Цитата:
    current = head;  
        current->next = NULL;

    Это пришлось добавить, т.к. он у меня в теле цикла не присваливал первому элементу списка current->next = NULL;
    На пустой список я его не проверял...

    Всего записей: 8 | Зарегистр. 31-05-2007 | Отправлено: 02:58 05-06-2007
    Qraizer



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

    Цитата:
    ...По моему разумению head хранит голову списка(и поидее не должна изменяться, чтобы не забыть начало списка), ...  
    И я том же. Когда список реверсирован, где будет его голова? А у тебя она в хвосте.
    Цитата:
    Это пришлось добавить, т.к. он у меня в теле цикла не присваливал первому элементу списка current->next = NULL;  
    Ты вообще невнимательно читал мой пост. Иначе бы не писал того, что я уже комментировал в своём прежнем посте.
     
    P.S. Проверил свой код. Работает. Что у тебя за проблемы - не имею представления.

    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 15:01 05-06-2007 | Исправлено: Qraizer, 16:42 05-06-2007
    Открыть новую тему     Написать ответ в эту тему

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