Дмитрий Королев, Будет, но вы потеряете ранее выделенный буфер. А в конце вы пытаетесь освободить уже не буфер, выделенный малоком, а константу "33". А константа хранится не в куче.
Все строковые литералы (константы) присутствуют в памяти и имеют свои адреса. Только они находятся не в куче и освободить эту память с помощью free нельзя. Но получить адрес можно.
И еще указатель - это обычная переменная, похожая на int. И строку указателю присвоить нельзя. Указателю присваивается указатель на строку.
да, для строк не memcpy, а strcpy лучше подойдет.
Но memcpy то же сделает что нужно, просто strcpy ориентировани именно на работу со строками, он определяет конец копирования по символу \0 в конце входной строки.
memcpy - более универсальная, ею можно копировать любой участок памяти, только нужно самому позаботится о том что бы передать правильный размер в функцию.
Вот так строки в Си не присваиваются:
ptr[0] = "1001.01\0";
ptr[1] = "11.1\0";
Если вам нужно эти строки скопировать в буфер, который вы выделили вызовами malloc для ptr[0] и ptr[1], то нужно использовать memcpy:
memcpy(ptr[0], "1001.01", 7 );
И в конце строковых литералов не нужно принудительно выставлять \0 - он там автоматически поставится компилятором, просто надо учитывать наличие этого 0 в конце строк.
Вот этим:
ptr[0] = "1001.01\0";
ptr[1] = "11.1\0";
вы теряете буфер, который выше выделили mallocом и потом передаете адрес константы во free, который от этого факта сходит с ума :-)
Собственно, подтвердилось мое предположение в первом посте.
Дмитрий Королев, Ошибка как минимум тут:
ptr = (char**)malloc(3);
Сразу бросилось в глаза.
С чего вы взяли, что указатель имеет размер 1 байт.
Если что в malloc передается размер в байтах памяти, которую нужно выделить.
У вас массив из трех элементов, каждый элемент имеет размер: sizeof(*ptr)
Вызов малок должен быть таким:
ptr = (char**)malloc(sizeof(*ptr) * 3);
Возможно что вы во free передаете что-то, что не было возвращено mallocом.
Возможно у вас где-то в коде выход за границы и вы перекрываете ptr чем-то другим. Потом при вызове free с не правильным указателем поведение не предсказуемо.
Recardo_Recoly, Значит создавайте его в том же потоке.
Можете создавать его непосредственно в WndProc, либо перехватывать еще и создание окна там создавать Awesomium. Тогда он будет создан в том же потоке, что и окно игры. Как-то так, имхо.
Вообще при наличии исходников проще поправить код, чем писать такой костыль с хуками. Если WndProc достаточно большая, то в своей процедуре вам нужно будет повторить весь функционал - это может быть достаточно не тривиально.
Expodes, Еслибы условие было такое:
if (strcmp(surname, en.surname) == 0 || en.meanMark==5)
то было бы так как говорит препод, но у вас условие:
if (strcmp(surname, en.surname) == 0 && en.meanMark==5)
двойка преподу.
Но это то же самое, что и объединение условий через логическое И.
Для доказательства своей правоты просто внутри if выводите сообщение на экран перед записью: фамилию и оценку. И убедитесь сами и убедите препода, что другие варианты не проходят. В файле должны быть варианты, которые бы сработали по варианту препода.
Expodes, Почитайте уже что-нибудь по логическим операциям.
У вас в if двойное условие:
1.strcmp(surname, en.surname) == 0 - проверяет что en.surname==surname
2.en.meanMark==5 - проверяет оценку
Объединяются 2 условия логическим И (&&), это значит что операторы в теле if выполняются только когда оба условия истинны (т.е. когда оба условия одновременно выполняются), что вам и нужно.
Про смену позиции это всего лишь предположение, т.к. я не знаю структуру файла. Сменить позицию в файле можно с помощью fseek или fsetpos, узнать текущую - ftell.
Expodes, у вас в условии запятая, а нужно &&, как сказал Александр Ананьев
И еще, вам нужно перед записью переместить позицию в файле назад на sizeof(ENROLLEE) байт, иначе записью вы затрете следующего студента в файле.
Oopss, Честно говоря, никогда не пользовался этой фишкой, всегда была возможность поставить WSUS, поэтому не знаю от каких служб/настроек зависит этот функционал. Думаю стоит поискать в поддержке микрософта.
Darkzenon, тогда лучше и оставить ее на сайте, только причесать единообразно. А в ексел можно просто выгрузку сделать, чтоб начальству показать, но оно, начальство, может и на сайте посмотреть, наверное.
PHPjedi, Что 1 - не вариант совсем? Жестко забито в код? Иногда даже в исполняемом файле можно подкорректировать какие-то строки в шестнадцитиричном редакторе.
2.Любой сетевой интерфейс компа может иметь несколько адресов. Просто добавьте к 125 адресу 222 и он будет откликаться на оба.
lojcin, UEFI как правило поддерживает загрузку в обоих режимах, обычно в настройке БИОС это можно указать. Загрузка с MBR в UEFI BIOS обычно завется "legacy boot".
Если система загрузилась в EFI режиме, то винда будет ставиться только с GPT. Статья по этому поводу.
Сергей Этот вариант сработает только для паролей пользователей, которые были реально залогинены (т.е. их пароли вводились с клавиатуры и сохранены в памяти процесса lsass) до перехода в режим гибернации, имхо.
А тут несколько иная задача - пользователи не залогинены и паролей не знают.
Как-то играл с mimikatz - потрясающая вещь :-) Не знаю, работает ли она до сих пор или может мелкософт что-нибудь предпринял.
Как в сети резолвятся имена компов (DNS/WINS/NETBIOS)?
Когда не можете получить доступ по имени, можно ли получить доступ по IP адресу?
Например, если ваш \\server имеет адрес 192.168.1.10, то можно подключиться к нему так:
\\192.168.1.10\
Обычно, если сеть ... ну больше 10 компов, например, и/или есть выделенный сервер, то есть смысл развернуть службу каталога. Active Directory - служба каталога от микрософт, встроена в винду. Для ее развертывание необходимо наличие Windows Server в сети. С ее помощью можно централизовать управление сетью/пользователями/компами/правами доступа и т.п. В общем в большой/средней сети это вещь крайне полезная. Эта тема очень обширная, если вам требуется АД, то рекомендую почитать какую-либо литературу про нее, а потом уже разворачивать в сети.
Для нормальной работы сетевого окружения и общего доступа нужно:
1.включить обнаружение сети, общий доступ к файлам и принтерам, защиту паролем, если в сети есть компы с ВинХР, то нужно выбрать шифрование 40-56 бит, если нет - 128.
2.Все компы сети должны находится в одной рабочей группе.
3.Для нормального преобразования имени компов в IP адрес лучше всего развернуть DNS сервер. Если развернуть динамический DNS, то компы сами будут прописывать себя в DNSе, это избавит от ручного поддержания актуальности DNSа.
Вместо DNSа можно использовать WINS.
Оба варианта потребуют прописывания адресов DNS/WINS серверов на всех рабочих станциях.
Автоматизировать процесс прописывания адресов (IP, маски, DNS, WINS и много чего другого) можно с помощью DHCP сервера и включения динамического получения адреса на компах. Но пока с этим можно не заморачиваться.
Если в сети есть Windows Server, то DNS, WINS, DHCP службы есть в его составе. Если Windows Server нет, то можно развернуть какой-нибудь линукс и настроить эти службы там (кроме WINS).
4.Если в сети нет Windows Server, то нужно решить вопрос с master browser на всех компах в сети. Или если в сети несколько Windows Server, но нет АД, то вопрос с master browser нужно решить на только на них. Погуглите на эту тему.
Все строковые литералы (константы) присутствуют в памяти и имеют свои адреса. Только они находятся не в куче и освободить эту память с помощью free нельзя. Но получить адрес можно.
И еще указатель - это обычная переменная, похожая на int. И строку указателю присвоить нельзя. Указателю присваивается указатель на строку.