Страница: 1 | 2 | 3 | 4 | 5 |
Вопрос: VC++ Help Please ! (задачка)
Добавлено: 08.11.05 23:06
Автор вопроса:
HACKER
Ответы
Всего ответов: 67
Номер ответа: 31
Автор ответа: vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #31
Добавлено: 11.11.05 10:34
HOOLIGAN Я попробую объснить о static.
Если не прав поправь.
Для простоты:
/* Так можно организовать счетчик вызовов функции. */
static int callCount = 0;
// Здесь что-то делается...
return ++callCount;
}
Если бы мы не объявили callCount ее как static то при каждом возврате мы бы теряли ее значение, оно бы просто затиралось.
В отношении фуекций это тоже верно, к тому же позволяет экономить память, так как создается только один экземляр и создается в момент запуска программы(сложнехонько).
К примеру в классах к функции объявленной как ststic можно обрашаться еще до создания класса.
Те это можно рассматривать как некое константное значение для памяти,которое выделяется в момент запуска программы и больше не меняется.
Естесвенно это не значит, что нельзя изменить значение переменной.
Поэкспериментирую с примером , вызывай функцию много раз. отмени ststic. Обнаружишь, что значение будет затерто.
Номер ответа: 32
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #32
Добавлено: 11.11.05 18:56
а... т.е. эти функции доступны в пределах этого модуля? Тогда всё понятно...
Номер ответа: 33
Автор ответа: vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #33
Добавлено: 11.11.05 19:14
HACKER
Да(это общее определение и оно верно), и говоря проще, данные функции, переменные будут хранить свои значения, а не терять их. Поэтому и названы статическими.
Номер ответа: 34
Автор ответа: Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #34
Добавлено: 11.11.05 20:29
Кстати, насчет Static: такое и в VB имеется.
Номер ответа: 35
Автор ответа: vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #35
Добавлено: 11.11.05 21:30
Отличный аналог!
Dim count As Integer
count = asd
End Sub
'----------------------------------------------------
Function asd() As Integer
Static c As Integer
c = c + 1
asd = c
End Function
Если мы не объявим g как static то счетчика вызовов не получиться.
Переменная будет каждый раз создаваться снова.
Правда здесь есть выход объявить ее как глобальную. В С это не пройдет, даже объявляя ее как глобальную мы должны использовать static, чтобы быть уверенными в том, что значение сохраниться.
Номер ответа: 36
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #36
Добавлено: 12.11.05 18:33
всё я понял, про в VB Static давно знаю... Всем спасибо!
Номер ответа: 37
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #37
Добавлено: 13.11.05 14:43
ещё просьба
Необходма ф-цыя которая шифрует текст перестановкой соседних бит.
и ещё...
char Crypt (char* text){
char txt;
for (int i=0;i<strlen(text);i++){
strcat(txt, chr(ord(text[i] + 1));
}
return txt;
}
Что я делаю не правельно? Ругается на chr and ord, я так понимаю я какой-то инклуд забыл?
Номер ответа: 38
Автор ответа: GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #38
Добавлено: 13.11.05 15:04
Данный код (если бы он работал) заменял бы каждую букву на следующую по алфавиту.
Кстати, что char txt - это один байт, не смущает?
Номер ответа: 39
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #39
Добавлено: 13.11.05 15:19
Ну это понятно, собственно это и было задание...
смущает, наверно надо сделать указателем, но я незнаю как динамически память выделить чтобы в массив вмещалась любой кол-во символов, ну короче в переменную строку любой длинны...
Номер ответа: 40
Автор ответа: HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #40
Добавлено: 13.11.05 15:41
что за ord? В MSDN я такого не нашёл.
И касательно strcat(txt....) : txt у тебя char (просто один байт), а strcat требует char* - указатель на байт (или на начало строки).
Если хочешь дополнять строку txt, по объяви её как char* txt. Под эту строку надо выделить либо заведомо достаточное количество памяти, либо постоянно проверять длину txt, и при достижении выделенного предела делать realloc.
Номер ответа: 41
Автор ответа: HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #41
Добавлено: 13.11.05 16:22
Можно вообще не выделять ничего, а саму строку шифровать по месту, т.к. от перестановки бит размер не меняется. Примерно так (по простому):
char temp;
int i=0;
while (string[i]{
temp = string[i];
*((char*) (string+i)) = 0;
string[i] = string[i] | ((temp & 128)>>1);
string[i] = string[i] | ((temp & 64)<<1);
string[i] = string[i] | ((temp & 32)>>1);
string[i] = string[i] | ((temp & 16)<<1);
string[i] = string[i] | ((temp & 8)>>1);
string[i] = string[i] | ((temp & 4)<<1);
string[i] = string[i] | ((temp & 2)>>1);
string[i] = string[i] | ((temp & 1)<<1);
i++;
}
}
И вызывать :
MessageBox ( NULL, sss, NULL, NULL );
Crypt(sss);
MessageBox ( NULL, sss, NULL, NULL );
Crypt(sss);
MessageBox ( NULL, sss, NULL, NULL );
Одна и та же ф-ция будет и шифровать, и расшифровывать.
Номер ответа: 42
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #42
Добавлено: 13.11.05 16:45
Ну... я конечно может не прав, но вроде
chr - из символа ASCII код
ord - наоборот, ищ ASCII кода символ
про Crypt...
а что значит ((temp & 128)>>1
>> и << как нам объясняли это сдвиг на n число бит в право или влево соответсовенно.
а что значт, что даёт temp & 128
P.S> Я извиняюсь за глупые вопросы, с Си имею дело относительно недавно, а разобраться быстро неполучается, т.к. как я понял язык не прост в понимании... (для меня)
Номер ответа: 43
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #43
Добавлено: 13.11.05 16:51
Вообщ прокоментируй плиз пару строчек...
string[i] = string[i] | ((temp & 64)<<1);
string[i] = string[i] | ((temp & 32)>>1);
string[i] = string[i] | ((temp & 16)<<1);
string[i] = string[i] | ((temp & 8)>>1);
string[i] = string[i] | ((temp & 4)<<1);
string[i] = string[i] | ((temp & 2)>>1);
string[i] = string[i] | ((temp & 1)<<1);
Номер ответа: 44
Автор ответа: HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #44
Добавлено: 13.11.05 18:34
Берется байт из строки и сохраняется в temp (temp = string
Затем это место в строке обнуляется, чтобы был чистый символ *((char*) (string+i)) = 0;
string = string | ((temp & 128)>>1); - это по VB-шному
string(i) = string(i) Or ((temp And 128)\2);
В чистую ячейку строки начинаем прописывать биты.
У сохраненного байта (temp) выделяется старший (седьмой) бит при помощи (temp & 128) и затем этот бит сдвигается вправо на 1 разряд >>1 и становится шестым. Затем при помощи "|" этот бит заносится в шестой бит ячейки string. Аналогично берется шестой бит сохраненного (temp & 64) и сдвигается влево на один разряд и заносится как седьмой в string. Так меняются местами шестой и седьмой биты.
Аналогично обмениваются остальные три пары битов, нечетные сдвигаются вправо, четные влево, и получившиеся биты накладываются на ячейку string.
Цикл повторяется до тех пор, пока в исходной строке не окажется нулевой байт - признак конца строки - while (string).
Номер ответа: 45
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #45
Добавлено: 13.11.05 23:38
Ещё одно, я наверно достал тебя уже
но всё же...
как реализовать replace ? (подобно VB-шному) ...