- 1
Именно поэтому я за «PHP» #8
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
Именно поэтому я за «PHP» #8
#1: https://govnokod.ru/26462 https://govnokod.xyz/_26462
#2: https://govnokod.ru/26827 https://govnokod.xyz/_26827
#3: https://govnokod.ru/26832 https://govnokod.xyz/_26832
#4: https://govnokod.ru/27539 https://govnokod.xyz/_27539
#5: https://govnokod.ru/28267 https://govnokod.xyz/_28267
#6: https://govnokod.ru/28443 https://govnokod.xyz/_28443
#7: https://govnokod.ru/28746 https://govnokod.xyz/_28746
+134
Товарищи, недавно у меня была возможность покодить на арестованных сях: синтаксис в принципе
не очень сложный, да и возможности широкие.
Так вот, у меня возник вопрос: стоит ли учить си-за-решеткой в противовес Delphi 8 (идет под .NET)?
Дело в том. что Си для меня язык новый, а с Delphi я более менее знаком.
Хочу заранее попросить: пожалуйста, никаких споров о преимуществах языков.
Вопрос стоит не о том, что лучше, а о том, сравним ли по возможностям компилятор Delphi 8 .NET с C#.
+1
* https://github.com/nwchemgit/nwchem/blob/8ac6bc6856d50954029cad01a751006851682398/src/nwpw/pspw/lib/psi/psi.F#L324
subroutine psi_sort_f_orb()
implicit none
#include "errquit.fh"
#include "bafdecls.fh"
#include "psi.fh"
logical value
integer i,j,ii,jj,ms
integer r1(2)
real*8 ei,ej
value = BA_push_get(mt_dcpl,npack1,'r1',r1(2),r1(1))
if (.not. value) call errquit(
> 'psi_sort_f_orb: out of stack memory',0,MA_ERR)
do ms=1,ispin
!*** Bubble sort ***
do ii=1,ne(ms)
do jj=ii+1,ne(ms)
i = ii + (ms-1)*ne(1)
j = jj + (ms-1)*ne(1)
ei = dbl_mb(eig(1)+i-1)
ej = dbl_mb(eig(1)+j-1)
!*** swap ***
if (ej.lt.ei) then
dbl_mb(eig(1)+i-1) = ej
dbl_mb(eig(1)+j-1) = ei
call Pack_c_Copy(1,dcpl_mb(psi1(1)+(i-1)*npack1),
> dcpl_mb(r1(1)))
call Pack_c_Copy(1,dcpl_mb(psi1(1)+(j-1)*npack1),
> dcpl_mb(psi1(1)+(i-1)*npack1))
call Pack_c_Copy(1,dcpl_mb(r1(1)),
> dcpl_mb(psi1(1)+(j-1)*npack1))
end if
end do
end do
end do
value = BA_pop_stack(r1(2))
if (.not. value) call errquit(
> 'psi_sort_f_orb: popping stack memory',1, MA_ERR)
return
end
Сортировка пузырьком на фортране из пакета квантовохимических вычислений "NWChem"
+135
#include <stdio.h>
typedef void(* file_handler_t)(FILE* fileHandle);
void using_file(FILE* fileHandle, file_handler_t fileHandler/*a*/)
{
if(!fileHandle)
return;
fileHandler(fileHandle);
fclose(fileHandle);
}
int main(void) {
using_file(fopen("myfile.txt","w"),
({void body(FILE* fileHandle) {
/*пишем в fileHandle;*/
}; body;})//b
);
return 0;
}
Постю код в защиту курочки от нападок Тараса про автодестукторы. Уникальные виды куриц нужно оберегать, сохранять и защищать.
Курочка об gnuцицизмы уже зашкварился так что будем стоять на своем до конца. Главное чтобы он свой не отстоял, а то потом не встанет.
http://ideone.com/2zRuK0
В позицию /*a*/ можно добавить параметр, деструктирующий объект должным образом. И соответственно оформить using_file как USING макросом, чтобы можно было деструктить объекты не только типа FILE* но и любых других. В макросе вполне при этом может понадобится гнутый typeof, но у нас и так зашквар, так что уже не важно. Так же для полной универсальности можно добавить параметр, определяющий неуспешность открытия объекта, чтобы вместо if(!fileHandle) был if(predicate(fileHandle)). Но конечно при этом лучше просто сделать 2 варианта макроса: обобщенный и с предикатом по умолчанию логическое отрицание.
Вместо некрасивой позиции //b лучше завести макрос, эмитирующий нормальную красивую человеческую лямбду.
+149
-
+60
for(int i=0;i<m;i++){
if(i>0 && a[i-1][j]>=a[i][j])continue;
if(i+1<n && a[i+1][j]>=a[i][j])continue;
if(j>0 && a[i][j-1]>=a[i][j])continue;
if(j+1<m && a[i][j+1]>=a[i][j])continue;}
Я так и не понял, в чем смысл этого цикла, ну да ладно.
+1
http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
1.14: Ну а если честно, на какой-нибудь реальной машине используются
ненулевые внутренние представления нулевых указателей или разные
представления для указателей разных типов?
О: Серия Prime 50 использует сегмент 07777, смещение 0 для нулевого
указателя, по крайней мере, для PL/I. Более поздние модели используют
сегмент 0, смещение 0 для нулевых указателей С, что делает
необходимыми новые инструкции, такие как TCNP (проверить нулевой
указатель С), которые вводятся для совместимости с уцелевшими
скверно написанными С программами, основанными на неверных
предположениях. Старые машины Prime с адресацией слов были печально
знамениты тем, что указатели на байты (char *) у них были большего
размера, чем указатели на слова (int *).
Серия Eclipse MV корпорации Data General имеет три аппаратно
поддерживаемых типа указателей (указатели на слово, байт и бит), два
из которых - char * и void * используются компиляторами С. Указатель
word * используется во всех других случаях.
Некоторые центральные процессоры Honeywell-Bull используют код 06000
для внутреннего представления нулевых указателей.
Серия CDC Cyber 180 использует 48-битные указатели, состоящие из
кольца (ring), сегмента и смещения. Большинство пользователей
(в кольце 11) имеют в качестве нулевых указателей код 0xB00000000000.
Символическая Лисп-машина с теговой архитектурой даже не имеет
общеупотребительных указателей; она использует пару <NIL,0> (вообще
говоря, несуществующий <объект, смещение> хендл) как нулевой
указатель С.
В зависимости от модели памяти, процессоры 80*86 (PC) могут
использовать либо 16-битные указатели на данные и 32-битные указатели
на функции, либо, наоборот, 32-битные указатели на данные и 16-битные
- на функции.
Старые модели HP 3000 используют различные схемы адресации для байтов
и для слов. Указатели на char и на void, имеют, следовательно,
другое представление, чем указатели на int (на структуры и т.п.),
даже если адрес одинаков.
Более поздние модели используют сегмент 0, смещение 0 для нулевых указателей С, что делает необходимыми новые инструкции, такие как TCNP (проверить нулевой указатель С), которые вводятся для совместимости с уцелевшими скверно написанными С программами, основанными на неверных предположениях.
Делать специальную инструкцию в процессоре для криво написанного сишного кода. Какой багор!
+21
#include <iostream>
using namespace std;
int main() {
for(int i = 0; i<((cout<<'c'), 5); ((cout<<'i'), ++i)) cout<<"b";
cout<<endl;
return 0;
}
38 летний программист справа написал зачем-то такой код и сказал, что проверяет себя.
http://ideone.com/zg6SFB
0
Тестовый оффтоп #1
Чтобы в «NGK» заблокировать все комменты из этого поста — нажмите на крестик справа от его номера.
+1
// https://habr.com/ru/company/oleg-bunin/blog/493242/
// Алгоритмы быстрой обработки HTTP-строк
// .....
// Как устроен парсер? Мы, как nginx, определяем массив байт и по нему
// проверяем входные данные — это пролог функции. Здесь мы работаем
// только с короткими сроками, используем likely, потому что branch misprediction
// для коротких строк болезненнее, чем для длинных. Выносим этот код наверх.
// У нас есть ограничение в 4 из-за последней строчки — мы должны написать
// достаточно мощное условие. Если будем обрабатывать больше 4 байт, то условие
// будет тяжелее, а код медленнее.
static const unsigned char uri_a[] __attribute__((aligned(64))) = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
...
// Branch misprediction is more crucial for short strings
if (likely(len <= 4)) {
switch (len) {
case 0:
return 0;
case 4:
c3 = uri_a[s[3]];
// fall through to process other chars
case 3:
c2 = uri_a[s[2]];
case 2:
c1 = uri_a[s[1]];
case 1:
c0 = uri_a[s[0]];
}
return (c0 & c1) == 0 ? c0 : 2 + (c2 ? c2 + c3 : 0);
}
// Основная петля и большой хвост. В основном цикле обработки мы делим
// данные: если они достаточно длинные, обрабатываем по 128, 64, 32 или
// по 16 байт. Имеет смысл обрабатывать по 128: мы параллельно используем
// несколько каналов процессора (несколько pipeline) и суперскалярность процессора.
for ( ; unlikely(s + 128 <= end); s += 128) {
n = match_symbols_mask128_c(__C.URI_BM, s);
if (n < 128)
return s - (unsigned char *)str + n;
}
if (unlikely(s + 64 <= end)) {
n = match_symbols_mask64_c(__C.URI_BM, s);
if (n < 64)
return s - (unsigned char *)str + n;
s += 64;
}
if (unlikely(s + 32 <= end)) {
n = match_symbols_mask32_c(__C.URI_BM, s);
if (n < 32)
return s - (unsigned char *)str + n;
s += 32;
}
if (unlikely(s + 16 <= end)) {
n = match_symbols_mask16_c(__C.URI_BM128, s);
if (n < 16)
return s - (unsigned char *)str + n;
s += 16;
}
... пиздец. Там еще в той статье пишут, что CloudFlare через AVX2 какое-то говно оптимизируют в говнопаринге http запросов.
Поэтому я за бинарную сериализацию, без всей этой хуйни человекочитаемой