-
+66.9
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// Компилировать: g++ -o test reghead.cpp object1.cpp regtail.cpp main.cpp
//================== object.h: ==================
struct Object {
const char *name;
unsigned char props[0];
};
extern Object *head, *tail;
enum {PROPTYPE_BYTE = 0x40, PROPTYPE_WORD = 0x80};
enum {PROP_DESC = 1, PROP_LASTSTRING, PROP_COLOR, PROP_MASS, PROP_END = 0};
#define DECLARE_OBJECT(name) \
extern Object Object_##name, *name##_reg; \
Object *name##_reg __attribute__((section("oreg"))) = &Object_##name;\
Object Object_##name = {#name}; \
namespace name##_props {
#define PROP_BYTE(id, value) unsigned char id##_1 = id | PROPTYPE_BYTE, id##_2 = value;
#define PROP_WORD(id, value) unsigned char id##_1 = id | PROPTYPE_WORD, id##_2[2] = {value & 0xff, value >> 8};
#define PROP_STRING(id, value) unsigned char id##_1 = id; unsigned char id##_2[] = value;
#define END_PROPS unsigned char final = PROP_END; }
//================== reghead.cpp: ==================
#include "object.h"
Object *head __attribute__((section("oreg"))) = 0;
//================== regtail.cpp: ==================
#include "object.h"
Object *tail __attribute__((section("oreg"))) = 0;
//================== object1.cpp: ==================
#include "object.h"
DECLARE_OBJECT(object1)
PROP_BYTE(PROP_COLOR, 14)
PROP_WORD(PROP_MASS, 300)
PROP_STRING(PROP_DESC, "description")
END_PROPS
//================== main.cpp: ==================
#include <stdio.h>
#include <string.h>
#include "object.h"
int main()
{
Object **obj = &head;
while (++obj <= &tail) {
if (*obj == NULL)
continue;
printf("Object: %s\n", (*obj)->name);
unsigned char *props = (*obj)->props;
int id;
while ((id = *props) != PROP_END) {
if (id < PROP_LASTSTRING) {
char *value = (char *)props+1;
props = (unsigned char *)value + strlen(value) + 1;
switch (id) {
case PROP_DESC:
printf(" Description: %s\n", value);
break;
}
} else {
int value;
switch (id >> 6) {
case 1:
value = *((unsigned char *)(props+1));
props += 2;
break;
case 2:
value = *((unsigned short *)(props+1));
props += 3;
break;
}
switch (id & 63) {
case PROP_COLOR:
printf(" Color: %d\n", value);
break;
case PROP_MASS:
printf(" Mass:%d\n", value);
break;
}
}
}
}
}
Прошу прощения за длинный пример, но не мог не поделиться. Написано по мотивом кода из того же ZDaemon – примерно так там задаются и обрабатываются свойства объектов. Работает только с компилятором GCC. Если вы поняли, как это работает, а также почему подобный говнокод работает с gcc версии 3.2 и может зависать с более поздними версиями – можете по праву гордиться собой.
Arseniy,
13 Февраля 2010
-
+135.2
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
inline void clearbufshort (void *buff, unsigned int count, WORD clear)
{
if (!count)
return;
SWORD *b2 = (SWORD *)buff;
if ((int)b2 & 2)
{
*b2++ = clear;
if (--count == 0)
return;
}
do
{
*b2++ = clear;
} while (--count);
}
Наткнулся на такой вот шедевр в коде ZDaemon. Это аналог memset, только заполняет не байтами, а словами.
Кстати, там же рядом есть функция, запполняющая двойными словами:
inline void clearbuf (void *buff, int count, SDWORD clear)
{
SDWORD *b2 = (SDWORD *)buff;
while (count--)
*b2++ = clear;
}
Arseniy,
13 Февраля 2010
-
+137.6
- 1
w = (GtkWidget*)(*((int*)(lw->data)));
Объект для медитаций
mutanabbi,
13 Февраля 2010
-
+68.1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
void TInputTID::AvWnd(GtkWidget* w, char* name, int bOut, void (*cb) (int wnd, int data))
{
// Тут объявления локальных переменных и не относящиеся к делу манипуляции
if(((int)cb) != -1) // Шедевр
{
gtk_signal_connect ((GtkObject*)hButOK,
"clicked",GTK_SIGNAL_FUNC(cb),hOutWndBox);
}
}
Вечное сияние чистого разума. Новое слово в арифметике указателей.
mutanabbi,
13 Февраля 2010
-
−112.9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
NSString *s_diskUsage = [NSString localizedStringWithFormat:@"Unavailable"];;
float f_vaultUsage = 0;
if (inData == NULL || inData.loggedIn != 0)
{
[s_diskUsage release];
s_diskUsage = [NSString localizedStringWithFormat:@"Unavailable"];
f_vaultUsage = (float)0;
}
Продолжение эпопеи с проектом на Objective-C. Я не знаю, может это стандарт кодирования такой, когда нужно как можно чаще переинициализировать переменные одними и теми же значениями... на случай если им надоест и они самоуничтожатся...
Highlander,
13 Февраля 2010
-
−357.8
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
-(bool)hasInternetConnection
{
return true;
}
-(void)checkInternetConnection
{
NSLog(@"checking connection");
mTmp.loggedIn = ([self hasInternetConnection]==YES) ? 0 : -1;
}
Мой начальник-тимлид, американский индус по происхождению, узнав, что я уже несколько часов потратил на попытки неизвращенной реализации нужного нам "простого" функционала, сказал, что поможет мне, хоть я и не просил.
Уже через несколько минут я увидел у себя вот эти строки...
P.S. если кто не знает, то код на Objective-C
Highlander,
13 Февраля 2010
-
+162.5
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
$s_name=$_POST['s_name'];
$f_name=$_POST['f_name'];
$m_name=$_POST['m_name'];
$login=$_POST['login'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$post_id=$_POST['post'];
$query="SELECT person.login as login FROM person ORDER BY ID";
$res=Select($query);
$flag=false;
While(OCIFetch($res))
{
$login_base=text($res,'LOGIN');
if ($login==$login_base)
{
$flag=true;
break;
}
}
If($flag)
{
echo "</br><center><h3>Такой логин уже существует...придумайте еще что-нибудь!</center></h3></br>";
?>
<center><h4><a href="index.php?menu=reg">Назад</a></h4><center>
<?
}
if (!$flag)
{
if ($password1==$password2)
{
If (($login!='') and ($password1!='') and ($s_name!='') and ($f_name!='') and ($m_name!=''))
{
.... Ну и дальше добавение и все такое))
ммм.. альтернативные способы защиты от инъекций в запросах???)))
1_and_0,
12 Февраля 2010
-
+153.6
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
var xmlhttp
var dlid;
function showHint(id)
{
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
{
alert ("Your browser does not support XMLHTTP!");
return;
}
dlid="dl"+id;
var url="download.php";
xmlhttp.onreadystatechange=stateChanged;
xmlhttp.open("GET",url+"?update="+id,false);
xmlhttp.send(null);
window.location=url+"?id="+id;
}
function stateChanged()
{
if (xmlhttp.readyState==4)
{
document.getElementById(dlid).innerHTML=xmlhttp.responseText;
}
}
function GetXmlHttpObject()
{
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
return new XMLHttpRequest();
}
if (window.ActiveXObject)
{
// code for IE6, IE5
return new ActiveXObject("Microsoft.XMLHTTP");
}
return null;
}
Разбираюсь с AJAX
ko4epblzka,
12 Февраля 2010
-
+137.5
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
void TWindowTID::SetStyle(GtkWidget* widget, const char *form, gint Red_, gint Green_, gint Blue_)
{
struct _GtkStyle *style;
GdkColor bg;
style=gtk_style_new();
bg.red = Red_;
bg.blue = Blue_;
bg.green = Green_;
if (form=="TEXT")
{
style->fg[GTK_STATE_NORMAL]=bg; //TEXT
}
else
if (form=="BORDER")
{
style->base[GTK_STATE_NORMAL]=bg; //BORDER
}
else
if (form=="ALL")
{
style->bg[GTK_STATE_NORMAL]=bg;
style->base[GTK_STATE_NORMAL]=bg; //BORDER
style->fg[GTK_STATE_NORMAL]=bg; //TEXT
}
else
if (form=="button")
{
style->bg[GTK_STATE_PRELIGHT]=bg;
style->base[GTK_STATE_PRELIGHT]=bg; //BORDER
style->bg[GTK_STATE_SELECTED]=bg;
style->base[GTK_STATE_SELECTED]=bg; //BORDER
}
else
{
style->bg[GTK_STATE_NORMAL]=bg;
}
style->font = gdk_font_load("-adobe-helvetica-*-r-*-*-12-*-*-*-*-*-*-*");
if ((GtkWidget *)widget!=NULL) gtk_widget_set_style((GtkWidget *)widget, style);
}
Сравнение строк умиляет
mutanabbi,
12 Февраля 2010
-
+107.2
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
procedure TFormMoneyToBag.AMEditVirtualKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Field : string;
Value : integer;
begin
if (Key = 16) or (Key = 13) then begin
with ADOHardCash.FieldByName('Dengi') do begin
if AsString = '500 грн' then Field := '[500hrn]'
else if AsString = '200 грн' then Field := '[200hrn]'
else if AsString = '100 грн' then Field := '[100hrn]'
else if AsString = '50 грн' then Field := '[50hrn]'
else if AsString = '20 грн' then Field := '[20hrn]'
else if AsString = '10 грн' then Field := '[10hrn]'
else if AsString = '5 грн' then Field := '[5hrn]'
else if AsString = '2 грн' then Field := '[2hrn]'
else if AsString = '1 грн' then Field := '[1hrn]'
else if AsString = '1 грн монета' then Field := '[1hrnCoin]'
else if AsString = '50 коп' then Field := '[50kopCoin]'
else if AsString = '25 коп' then Field := '[25kopCoin]'
else if AsString = '10 коп' then Field := '[10kopCoin]'
else if AsString = '5 коп' then Field := '[5kopCoin]'
else if AsString = '2 коп' then Field := '[2kopCoin]'
else if AsString = '1 коп' then Field := '[1kopCoin]'
end;
UpdateIncassationCurrentValue.Parameters.ParamByName('@IncassationId').Value := IncassationId;
UpdateIncassationCurrentValue.Parameters.ParamByName('@Field').Value := Field;
if AMEditVirtual.Text = '' then Value := 0 else Value := StrToInt(AMEditVirtual.Text);
UpdateIncassationCurrentValue.Parameters.ParamByName('@Value').Value := Value;
ExecStoredProc(UpdateIncassationCurrentValue);
RequeryADO(ADOHardCash);
RequeryADO(ADOCashDeskInfo);
ButtonStatus;
AMEditVirtual.Visible := false;
end;
end;
Сие Чудо техники заполняет параметры для выполнения хранимой процедуры на сервере.
Написал Большой Мудила, хотя в целом он хороший человек.
cruelwizard,
12 Февраля 2010