-
+132
- 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
struct
{
unsigned char * low; //младшая часть адреса
unsigned char * high; //страшая часть адреса(только младших 3 бита)
} padr;
void filladdr(unsigned int * addr) //подготовка адресных ног МК
{
padr.low = (unsigned char *)addr;
padr.high = padr.low + 1;
PORTB = *padr.low;
PORTE &= 0x8;
PORTE |= *padr.high;
}
unsigned char readFromSRAM(unsigned int * adrss)
{
char outD;
TRISD = 0xFF;
filladdr(adrss);
PORTA &= 0xFC;
NOP(); // задержка на время доступа
outD = PORTD;
PORTA |= 0x7;
return outD;
}
void writeToSRAM(unsigned int * adrss, unsigned char * data)
{
TRISD = 0x0;
filladdr(adrss);
PORTD = *data;
PORTA &= 0xF8;
NOP(); // задержка на время доступа
PORTA |= 0x7;
PORTD = 0x0;
}
говнокод для работы с 2кб внешней SRAM памяти для микроконтролеров pic
nice_penguin,
02 Января 2011
-
+141
- 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
char *nvram_get(int index, char *name)
{
/* Initial value should be NULL */
char *recv = NULL;
//LIBNV_PRINT("--> nvram_get\n");
nvram_init(index);
recv = nvram_bufget(index, name);
//btw, we don't return NULL anymore!
if (!recv)
recv = "";
//Always need close nvram
nvram_close(index);
return recv;
}
char *nvram_bufget(int index, char *name)
{
int idx;
/* Initial value should be NULL */
static char *ret = NULL;
//LIBNV_PRINT("--> nvram_bufget %d\n", index);
LIBNV_CHECK_INDEX("");
LIBNV_CHECK_VALID();
idx = cache_idx(index, name);
if (-1 != idx) {
if (fb[index].cache[idx].value) {
//duplicate the value in case caller modify it
//Tom.Hung 2010-5-7, strdup() will cause memory leakage
//but if we return value directly, it will cause many other crash or delete value to nvram error.
ret = strdup(fb[index].cache[idx].value);
LIBNV_PRINT("bufget %d '%s'->'%s'\n", index, name, ret);
//btw, we don't return NULL anymore!
if (!ret)
ret = "";
return ret;
}
}
//no default value set?
//btw, we don't return NULL anymore!
LIBNV_PRINT("bufget %d '%s'->''(empty) Warning!\n", index, name);
return "";
}
Кусочек кода из библиотеки работы с nvram для железок на SoC Ralink. Китайцы плакали, кололись о утечки памяти, но продолжали настойчиво мешать указатели на статические строки с указателями на динамически выделенные в куче...
NiTr0man,
27 Декабря 2010
-
+162
- 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
// © Код Арсения
#include <stdio.h>
#include <conio.h>
#define N 100
int n,kol=1; //одекватен до 6!
void SAW(int *a,int *b)
{
*a-=*b;
*b+=*a;
*a=*b-*a;
kol=kol+1;
}
void deduction(int A[])
{
int i;
printf(" %5d : ",kol);
for (i=0;i<n;i++)
printf(" %d ",A[i]);
printf("\n");
if (kol%290==0)
getch();
}
void Shift(int A[], int k)
{
int i;
if(k<2)return;
for (i=0;i<k-1;i++)
{
Shift(A, k-1);
if (!(i>=2 && k%2==0))SAW(&A[k-1],&A[0]);
else SAW(&A[k-1],&A[i-1]);
deduction(A);
}
Shift(A, k-1);
}
void main()
{
int A[N],i;
printf("vvedite n\n");
scanf("%d",&n);
for (i=0;i<n;i++)
A[i]=i+1;
deduction(A);
Shift(A,n);
printf("\n %d \n",kol);
}
Классический вариант быдлокода в программе, которая печатает всевозможные комбинации перестановок цифр заданной длины. Для того чтобы поменять два значения местами используется отдельная функция SAW, которой передаются указатели на переменные (автор думает, что это круто), в самой же функции производится обмен значений, на которые указывают указатели без помощи дополнительной переменной (опять же автор считает, что это круто), причем, стоит обратить внимание, каким образом это делается (видимо операция XOR этому кодеру пока не известна). Далее классический стиль написания быдлокодера прослеживается буквально в каждой строчке, включая названия функций. Стоит также обратить внимание на оригинальную реализацию рекурсивной процедуры, проницательный читатель сразу же поймет смысл комментария в строке: int n,kol=1;//одекватен до 6!
jkoff,
25 Декабря 2010
-
+134
- 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
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
int main(int argc, char ** argv)
{
//...
time_t time0=time(NULL);
//...
if ((f=fopen(argv[1],"r"))==NULL)
{
//...
}
while ((fscanf(f,"%i %s",&tim[i],buffer[i]))!=EOF)
{
i++;
if (i>=n)
{
n=i+10;
tim=(int*)realloc(tim,n*sizeof(int));
buffer=(char**)realloc(buffer,n*sizeof(char*));
for (k=k; k<n; k++)
{
buffer[k]=(char*)realloc(buffer[k],256*sizeof(char));
}
}
}
if (fclose(f)==-1)
{
//...
}
//------------finished reading input file-------------------
//------------sorting (bubble =) )--------------------------
while (flag)
{
flag=0;
for (j=0; j<=i-2; j++)
{
if (tim[j]>tim[j+1])
{
tmpi=tim[j];
tim[j]=tim[j+1];
tim[j+1]=tmpi;
tmpc=buffer[j];
buffer[j]=buffer[j+1];
buffer[j+1]=tmpc;
flag=1;
}
}
}
//-----------executing------------------------------
k=0;
while(k<=i-1)
{
if (tim[k]==(int)(time(NULL)-time0))
{
if(!(pid=fork()))
{
execv(buffer[k],NULL);
}
else
{
k++;
}
}
}
//...
return 0;
}
Читает из файла таймер до запуска и имя программы. Я плакалъ...
krems,
25 Декабря 2010
-
+141
- 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
void array_random_input(int *array, unsigned int *array_size)
{
unsigned register int i, j;
for(i=0; i<(*array_size); i++)
for(j=0; j<(*array_size); j++)
*(array + (*array_size) * i + j) = rand()%100;
}
void array_recombination(int *array, unsigned int *array_size)
{
unsigned register int i, j, tmp;
for(i=0; i<(*array_size)/2; i++)
for(j=0; j<(*array_size)/2; j++)
{
tmp = *(array + (*array_size) * i + j);
*(array + (*array_size) * i + j) = *(array + (*array_size) * ((*array_size)/2 + i) + ((*array_size)/2 + j));
*(array + (*array_size) * ((*array_size)/2 + i) + ((*array_size)/2 + j)) = tmp;
}
for(i=0; i<(*array_size)/2; i++)
for(j=(*array_size)/2; j<(*array_size); j++)
{
tmp = *(array + (*array_size) * i + j);
*(array + (*array_size) * i + j) = *(array + (*array_size) * ((*array_size)/2 + i) + (j - (*array_size)/2));
*(array + (*array_size) * ((*array_size)/2 + i) + (j - (*array_size)/2)) = tmp;
}
}
//ardent greetings to my teacher F.S.V.! :)
Условие задачи: необходимо создать динамический двумерный массив размерностью 2n и сделать перестановку крест накрест его четвертей. В качестве параметров все функции принимают указатели. Для пущего brainfuck'а доступ к элементам массива осуществлялся с использованием одномерной адресации (по другому никак не получалось :)
Для сокращения привожу только функции наполнения массива случайными значениями и перестановки элементов.
mr_visor,
23 Декабря 2010
-
+144
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
for (i=0; i<n1; i++)
for (j=0; j<n; j++)
for (l=0; l<m; l++)
{
printf ("Введите в матрицу № %d строку №[%d][%d] \n", i+1,j+1,l+1);
while((h<k) && (*(*(*(*(mt+i)+j)+l)+h-1)!='\n')) //цикл для последовательного ввода всех элементов символьной строки;
{
fflush(stdin);
*(*(*(*(mt+i)+j)+l)+(h++)) = getchar(); //ввод элемента символьной строки;
}
if (*(*(*(*(mt+i)+j)+l)+h-1)='\n') //удаление из конца введённой строки символа переноса \n;
{ *(*(*(*(mt+i)+j)+l)+h-1)='\0';}
else
{ *(*(*(*(mt+i)+j)+l)+h)='\0';}
h = 0;
}
heil pure c
stasoft,
15 Декабря 2010
-
+145
- 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
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
case 90:
if (w!=2) {
ptr_step[ptr_loop]=91;
if (Set_Play(90)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 91:
if (w!=2) {
ptr_step[ptr_loop]=92;
if (Set_Play(91)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 92:
if (w!=2) {
ptr_step[ptr_loop]=93;
if (Set_Play(92)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 93:
if (w!=2) {
ptr_step[ptr_loop]=94;
if (Set_Play(93)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 94:
if (w!=2) {
ptr_step[ptr_loop]=95;
if (Set_Play(94)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 95:
if (w!=2) {
ptr_step[ptr_loop]=96;
if (Set_Play(95)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 96:
if (w!=2) {
ptr_step[ptr_loop]=97;
if (Set_Play(96)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 97:
if (w!=2) {
ptr_step[ptr_loop]=98;
if (Set_Play(97)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 98:
if (w!=2) {
ptr_step[ptr_loop]=99;
if (Set_Play(98)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
}
case 99:
if (w!=2) {
ptr_step[ptr_loop]=191;
if (Set_Play(31)==-1) {
Result=-1;
delta_time=1;
break;
}
break;
программа управления редкими ISDN платами, обработчик встроенного скриптового языка.
case делается по ptr_step[ptr_loop]
delta_time = 1 скорее всего означает "ты переключись на другую задачу, но вернись ко мне поскорее"
пока ещё до конца не разобрался
funny_falcon,
13 Декабря 2010
-
+137
- 1
- 2
- 3
- 4
if (MACaddress == 0)
MACaddress = pAdapterInfo->Address [5] + pAdapterInfo->Address [4] * 256 +
pAdapterInfo->Address [3] * 256 * 256 +
pAdapterInfo->Address [2] * 256 * 256 * 256;
xynta,
12 Декабря 2010
-
+141
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
static int16_t have_upper_dot(cell *c)
{
cell *cc;
int16_t H;
H=my_bases.ps;
cc=c->prev;
if ((cc->flg & c_f_dust) &&
(c->w>4 && cc->h>=2 && cc->w>=2 &&
(abs(cc->h-cc->w)<=H/6 || cc->h<cc->w && cc->w-cc->h<=H/4) &&
cc->col+1>=c->col && cc->col+cc->w-5<=c->col+c->w ||
c->w<=4 && abs(c->col-cc->col+(c->w-cc->w)/2)<=2) &&
cc->row+cc->h-2<=my_bases.b2)
return 1;
cc=c->next;
if ((cc->flg & c_f_dust) &&
(c->w>4 && cc->h>=2 && cc->w>=2 &&
(abs(cc->h-cc->w)<=H/6 || cc->h<cc->w && cc->w-cc->h<=H/4) &&
cc->col+1>=c->col && cc->col+cc->w-5<=c->col+c->w ||
c->w<=4 && abs(c->col-cc->col+(c->w-cc->w)/2)<=2) &&
cc->row+cc->h-2<=my_bases.b2)
return 1;
return 0;
}
Из одной OCR программы.
f0ma,
12 Декабря 2010
-
+146
- 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
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
// man sendfile
int main (int argc, char **argv, char **envp) {
while(
(
argc < 0 // true if all ok, false on first iter
||
(
argc != 2 // true if error
&&
(printf("usage %s filename\n", argv[0]) && 0 == (argc = 0))// show error (true)
) // true if error, and argc == 0
||
(
((argc = open(argv[1], O_RDONLY) * -1) < 0) // false if error
||
(printf("cannot open %m\n") && 0 == (argc = 0))// show error (true)
)
) // true if all ok, also argc != 0
&&
(
argc < 0 // if open success this is true
&&
(read(argc * -1, memset(envp[1], 0, 1025), 1024) > 0 && printf("%s", envp[1])) || (close(argc * -1))
)
) ;
}
работает и под linux и под cygwin (gcc какие были под рукой)
затрудняюсь определить парадигму :)
Anonimous,
09 Декабря 2010