- 1
- 2
- 3
- 4
- 5
- 6
- 7
#if __BYTE_ORDER == __BIG_ENDIAN
struct DWstruct { Wtype high, low;};
#elif __BYTE_ORDER == __LITTLE_ENDIAN
struct DWstruct { Wtype low, high;};
#else
#error Unhandled endianity
#endif
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+133
#if __BYTE_ORDER == __BIG_ENDIAN
struct DWstruct { Wtype high, low;};
#elif __BYTE_ORDER == __LITTLE_ENDIAN
struct DWstruct { Wtype low, high;};
#else
#error Unhandled endianity
#endif
glibc, sysdeps/wordsize-32/divdi3.c
+110
int strnlen(const char *s, int size)
{
int i;
for(i=0; i<size; i++) if(!*s) break;
return i;
}
+118
void dwflt_to_str(DWORD dw, char *pch, int &nsmb)
{
DWORD dw_a = dw;
char ch_a;
char tbldec[] = "0123456789";
nsmb = 0;
if (dw_a == 0) { pch[0] = '0'; nsmb++; goto lab2; }
while (dw_a != 0)
{
pch[nsmb] = tbldec[dw_a%10]; dw_a /= 10; nsmb++;
}
dw_a = nsmb/2;
while (dw_a)
{
ch_a = pch[nsmb - dw_a]; pch[nsmb - dw_a] = pch[dw_a - 1]; pch[dw_a - 1] = ch_a; dw_a--;
}
lab2:
pch[nsmb] = 0;
}
const int n_fr2 = 7; // - эта константа определяет фиксированное число цифр после точки в выводимой строке, представляющей float.
void float_to_str(float flt, char *pchar, int &nsmb)
{
int i, deg, ns_int, ns_frac;
double frac_dbl;
DWORD dw_f, mant, intg, fract;
DW_FL f_flt;
char szfl_int[16], szfl_frac[16];
f_flt.fl = flt;
dw_f = f_flt.dw;
if (dw_f == 0) { pchar[0] = '0'; pchar[1] = '.'; pchar[2] = '0'; pchar[3] = 0; nsmb = 3; return; }
if (dw_f & 0x80000000) { pchar[0] = '-'; } else { pchar[0] = '+'; }
deg = int((dw_f & 0x7F800000) >> 23) - 127;
mant = (dw_f & 0x007FFFFF) | 0x00800000;
if (deg == 0) { intg = 1; fract = dw_f & 0x007FFFFF; goto lab_1; }
if (deg > 0) { intg = mant >> (23 - deg); fract = ((dw_f & 0x007FFFFF) << deg) & 0x007FFFFF; goto lab_1; }
if (deg < 0) { intg = 0; fract = ((dw_f & 0x007FFFFF) | 0x00800000) >> (-deg); }
lab_1:
frac_dbl = double(fract)*1.1920928955078125;// 1.1920928955078125 = 10^n_fr2 / 2^23 = 10^7 / 2^23
fract = (int)frac_dbl;
dwflt_to_str(intg, szfl_int, ns_int);
nsmb = 1; i = ns_int; while (i) { pchar[i + 1] = szfl_int[i]; i--; } pchar[1] = szfl_int[0];
nsmb += ns_int; pchar[nsmb] = '.'; nsmb++;
dwflt_to_str(fract, szfl_frac, ns_frac); szfl_frac[n_fr2] = 0;
i = ns_frac; while (i) { szfl_frac[6 - ns_frac + i] = szfl_frac[i - 1]; i--; }
i = n_fr2 - ns_frac; while (i) { szfl_frac[i - 1] = '0'; i--; }
i = n_fr2 - 1; while (i) { pchar[nsmb + i] = szfl_frac[i]; i--; } pchar[nsmb] = szfl_frac[0];
nsmb += n_fr2; pchar[nsmb] = 0;
}
void float_to_str_exp(float flt, char *pchar, int &nsmb)
{
int i, deg, poli, ns_int, ns_frac, ns_poli;
double frac_dbl;
DWORD dw_f, mant, intg, fract;
DW_FL f_flt;
char szfl_int[16], szfl_frac[16];
f_flt.fl = flt;
dw_f = f_flt.dw;
if (dw_f == 0) { pchar[0] = '0'; pchar[1] = '.'; pchar[2] = '0'; pchar[3] = 0; nsmb = 3; return; }
if (dw_f & 0x80000000) { pchar[0] = '-'; } else { pchar[0] = '+'; }
deg = int((dw_f & 0x7F800000) >> 23) - 127;
mant = (dw_f & 0x007FFFFF) | 0x00800000;
if (deg == 0) { intg = 1; fract = dw_f & 0x007FFFFF; goto lab_1; }
if (deg > 0) { intg = mant >> (23 - deg); fract = ((dw_f & 0x007FFFFF) << deg) & 0x007FFFFF; goto lab_1; }
if (deg < 0) { intg = 0; fract = ((dw_f & 0x007FFFFF) | 0x00800000) >> (-deg); }
lab_1:
frac_dbl = double(fract)*1.1920928955078125;// 1.1920928955078125 = 10^n_fr2 / 2^23 = 10^7 / 2^23
fract = (int)frac_dbl;
dwflt_to_str(intg, szfl_int, ns_int);
dwflt_to_str(fract, szfl_frac, ns_frac); szfl_frac[n_fr2] = 0;
if (intg != 0)
{
nsmb = 1; i = ns_int; while (i) { pchar[i + 2] = szfl_int[i]; i--; } pchar[1] = szfl_int[0];
pchar[2] = '.'; nsmb += ns_int + 1; poli = ns_int - 1;
}
else
{
i = ns_frac - 1; while (i) { pchar[2 + i] = szfl_frac[i]; i--; } pchar[1] = szfl_frac[0];
pchar[2] = '.'; nsmb = 3;//nsmb += ns_frac + 1;
poli = ns_frac - n_fr2 - 1; goto lab_2;
}
i = ns_frac; while (i) { szfl_frac[6 - ns_frac + i] = szfl_frac[i - 1]; i--; }
i = n_fr2 - ns_frac; while (i) { szfl_frac[i - 1] = '0'; i--; }
i = n_fr2 - 1; while (i) { pchar[nsmb + i] = szfl_frac[i]; i--; } pchar[nsmb] = szfl_frac[0];
lab_2:
nsmb += n_fr2; pchar[nsmb] = 'E';
int_to_str(poli, &pchar[nsmb + 1], ns_poli);
nsmb += ns_poli + 1; pchar[nsmb] = 0;
}
оттуда
+129
static int multipart_buffer_eof(multipart_buffer *self TSRMLS_DC)
{
if ( (self->bytes_in_buffer == 0 && fill_buffer(self TSRMLS_CC) < 1) ) {
return 1;
} else {
return 0;
}
}
+137
GePolygon newPoly;
int c_ai = 0, n_pi = 0;
int fac[GE_MAX_POLY_VERTEX];
newPoly.n = 0;
Pt diff = ccpSub(end, bgn);
int f = 0;
do
newPoly.p[newPoly.n] = ai[c_ai] == (n_pi - 1) ? (f = 1, a[c_ai++]) : (f = 0, inp->p[n_pi++]),
fac[newPoly.n++] = f ? 0 : (ccpCross(ccpSub(newPoly.p[newPoly.n - 1], newPoly.p[newPoly.n - 2]), diff) > 0 ? 1 : -1 );
while(n_pi < inp->n);
if(c_ai < ac)
newPoly.p[newPoly.n] = a[c_ai], fac[newPoly.n++] = 0;
Из личной коллекции. Не помню, что конкретно делает, что-то вроде классификации точек полигона относительно линии...
+135
#include <stdio.h>
#include <malloc.h>
#include <sys/time.h>
#include <pthread.h>
#define MAXPRIME 10000001
char sieve[MAXPRIME];
typedef struct {
int id, min, max, step;
unsigned long long result;
} Task;
void primes() {
printf("Searching prime numbers ...\n");
sieve[0] = sieve[1] = 1;
for (int i=2; i<MAXPRIME; i++)
sieve[i] = 0;
int i = 2;
while (1) {
while (i<MAXPRIME && sieve[i])
i++;
if (i >= MAXPRIME)
break;
for (int j=i*2; j<MAXPRIME; j+=i)
sieve[j] = 1;
i++;
}
}
double utime() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec / 1000000.0;
}
unsigned long long calc(int thread, int min, int max, int step) {
unsigned long long sum = 0;
double start = utime();
int nextshow = max+1;
for (int n=max; n>=min; n-=step) {
if (!sieve[n]) {
sum += 1;
continue;
}
if (n <= nextshow && n > min) {
double elapsed = utime() - start, eta = elapsed/(max-n)*(n-min);
printf("Thread %d: current=%d elapsed=%lfs eta=%lfh\n", thread, n, elapsed, eta/3600);
nextshow = n < 10000 ? 0 : n - 10000;
}
int b;
asm("movl %1, %%ecx\n"
"1: dec %%ecx\n"
"movl %%ecx, %%eax\n"
"imull %%eax\n"
"idivl %1\n"
"cmpl %%ecx, %%edx\n"
"jnz 1b\n"
"movl %%ecx, %0"
: "=g"(b)
: "r"(n)
: "%eax", "%ecx", "%edx");
sum += b;
}
return sum;
}
void * thread(void *arg) {
Task *task = arg;
printf("Thread %d: working from %d to %d step %d\n", task->id, task->min, task->max, task->step);
task->result = calc(task->id, task->min, task->max, task->step);
printf("Thread %d: partial result is %llu\n", task->id, task->result);
return NULL;
}
int main() {
primes();
int threads = 4;
int max = 10000000;
pthread_t tid[10];
Task tasks[10];
for (int i=0; i<threads; i++) {
tasks[i].id = i;
tasks[i].min = 1;
tasks[i].max = max-i;
tasks[i].step = threads;
pthread_create(&tid[i], NULL, thread, &tasks[i]);
}
unsigned long long sum = 0;
for (int i=0; i<threads; i++) {
pthread_join(tid[i], NULL);
sum += tasks[i].result;
}
printf("Result: %llu\n", sum);
return 0;
}
Мое ужасное решение вот этой задачки: http://projecteuler.net/problem=407
В день, когда математика упорно не желает вспоминаться...
на помощь приходят брутальные и бессердечные ассемблер и мультитрединг.
model name: Pentium(R) Dual-Core CPU E5400 @ 2.70GHz
real 286m45.890s
user 545m44.926s
+111
for(p=first; p!=NULL; p=p->next)
free(p);
Освобождаем память всех элементов списка.
+135
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 512
typedef struct word
{
char wordBody[MAXSIZE];
int count;
struct word* next;
} Word;
Word* alloc(char* incomeWord)
{
Word* ret;
ret = (Word*)malloc(sizeof(Word));
ret->count=1;
ret->next=NULL;
strcpy(ret->wordBody, incomeWord);
}
void insert(Word **n, char* incomeWord)
{
Word** p_p_n;
int h=0;
if(*n==NULL)
{
*n = alloc(incomeWord);
return;
}
for(p_p_n = n; *p_p_n!=NULL; p_p_n = &(*p_p_n)->next)
{
if((strcmp(incomeWord,&(*p_p_n)->wordBody))==0)
{
(*p_p_n)->count++;
return;
}
}
for(p_p_n = n; *p_p_n!=NULL; p_p_n = &(*p_p_n)->next)
{
Word* ins = alloc(incomeWord);
Word* temp = *p_p_n;
Word** tt;
int is=0;
tt=p_p_n;
ins->next=temp;
*p_p_n = ins;
break;
}
}
void print(Word* n)
{
while(n!=NULL) {
if(n->count > 1)
{
printf("%s %d\n", n->wordBody, n->count);
}
n=n->next;
}
}
int main(void)
{
char buf[MAXSIZE]={'\0'};
FILE *fr;
Word* sez=NULL;
fr=fopen("Text1.txt", "r");
while(!feof(fr))
{
fscanf(fr,"%s",buf);
insert(&sez,buf);
}
print(sez);
printf("\n%d\n", sizeof(sez));
fclose(fr);
return 0;
}
Считаем сколЬко раз каждое слово встречается в текстовом файле. Программа выполняется 6.5 минут с файлом размером 850 килобайт.
+132
Было:
typedef struct {
int range; /*enabled flag*/
union {
struct {
unsigned str_length;
};
struct {
long i_min;
long i_max;
};
struct {
double d_min;
double d_max;
};
/* ... */
};
} wlp_range_t;
#define WLP_NO_RANGE() { .range = FALSE }
#define WLP_STRING_LENGTH(length) { .range = TRUE, .str_length = length}
#define WLP_INT_RANGE(min, max) { .range = TRUE, .i_min = min, .i_max = max }
#define WLP_FLOAT_RANGE(min, max) { .range = TRUE, .d_min = min, .d_max = max }
Стало:
typedef struct {
int range; /*enabled flag*/
struct {
struct {
unsigned str_length;
};
struct {
long i_min;
long i_max;
};
struct {
double d_min;
double d_max;
};
/* ... */
};
} wlp_range_t;
#define WLP_NO_RANGE() { B_FALSE, { {0} } }
#define WLP_STRING_LENGTH(length) { B_TRUE, { {length} } }
#define WLP_INT_RANGE(min, max) { B_TRUE, { {0}, {min, max} } }
#define WLP_FLOAT_RANGE(min, max) { B_TRUE, { {0}, {0, 0}, {min, max} } }
#define WLP_SIZE_RANGE(min, max) { B_TRUE, { {0}, {0, 0}, {0.0, 0.0}, {min, max} } }
/* ... */
Такая вот бяка получилась при портировании проекта с GCC на Visual C. А все потому, что:
1. ISO C++03 8.5.1[dcl.init.aggr]/15:
| When a union is initialized with a brace-enclosed initializer,
| the braces shall only contain an initializer for the first member of the union.
2. Visual C не поддерживает designated initializers
+136
i = 0;
while ((p_c = strchr(&str[i], c)) != NULL) {
k = p_c - str;
for (j = 0; j < k - i; j++)
putchar(' ');
putchar('*');
i = k + 1;
}
putchar('\n');
очень простой способ подчеркнуть определённые символы в массиве знаков