Дмитрий Королев, Вот этим
long alen = 0 - (a - strchr(a, '\0'));
вы что хотите получить?
Длина строки вычисляется с помощью strlen(a), учтите, что strlen не учитывает последний \0 байт .
Дмитрий Королев, Будет, но вы потеряете ранее выделенный буфер. А в конце вы пытаетесь освободить уже не буфер, выделенный малоком, а константу "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 и он будет откликаться на оба.
Что вы делаете этим кодом?