LINUX.ORG.RU
ФорумTalks

разбор foreach, предложенного procoder99-ом

 ,


0

4

вообще изумляюсь, как тут некоторые пытаются добится бана procoder99, вместо того, чтобы подробно разбирать его код (я серьезно, без иронии)

с другой стороны, г-н procoder99, я тебе напомню, что девелопмент — это не талксы, так что воздержись от своих филосовских излияний про ашотов, жизнь царей и прочее; кроме того, чтобы у тебя не было желания постить то, что всем уже *приелось*, вот краткая сводка твоих точек зрения и моих ответов на них:

А. «люди/преподы_в_вузах/... отвечают „делай как все“ вместо того, чтобы разобрать конкретный подход, указанный procoder99-ом» — да, такая проблема есть, но на лор-е имеются люди, которые именно разбирают подход (скажем, это я), так что прекрати свои жалобные стоны на эту тему

В. «procoder99-а не понимают, поскольку он гениален, а гениален он именно потому, что его не понимают» /сарказм/ — ну так прекрати стонать и демонстрируй свой код, мнение людей может измениться

С. если вдруг че-то у тебя потерли, не стесняйся посмотреть свой удаленный коммент, почистить его от рассказов про жизнь царей, ашотов и прочего, и запостить заново самое ценное из него (скажем, обоснование того, почему твой код будет работать быстрее, чем код оппонента)

теперь переходим к разбору твоего foreach

1. это вообще код не на си
2. твой код хуже чем for(... : ...), т.к. твой код МОЛЧА ломается от разумного использования
3. твой код хуже чем for(... : ...), т.к. твой код МОЛЧА ломается от данных, которые легко могут в него попасть, а for(... : ...) выдает диагностику

так что код, получается, у царей не ахти... впрочем, ты можешь предоставить исправленный вариант

твой код ( foreach в c++ (комментарий) ):

#include <stdio.h>
#include <stdint.h>

#define foreach(a, b)\
for(typeof(*(b)) * (a) = (b); (a) != ((b) + (sizeof((b))/sizeof(typeof(*(b))))); ++(a))
int main() {
  uint32_t vec[] = {123, 124, 125};
  foreach(it, vec)
    fprintf(stdout, "%u\n", *it);
  return 0;
}

1. это вообще код не на си, а на гнутых расширениях

$ gcc coder.c
coder.c: In function ‘main’:
coder.c:8: error: ‘for’ loop initial declarations are only allowed in C99 mode
coder.c:8: note: use option -std=c99 or -std=gnu99 to compile your code
$ gcc -std=c99 coder.c
coder.c: In function ‘main’:
coder.c:8: warning: implicit declaration of function ‘typeof’
coder.c:8: error: ‘it’ undeclared (first use in this function)
coder.c:8: error: (Each undeclared identifier is reported only once
coder.c:8: error: for each function it appears in.)


2. твой хуже чем for(... : ...), т.к. твой код МОЛЧА ломается от разумного использования

#include <stdio.h>
#include <stdint.h>

#define foreach(a, b)\
for(typeof(*(b)) * (a) = (b); (a) != ((b) + (sizeof((b))/sizeof(typeof(*(b))))); ++(a))
int main() {
  uint32_t vec[6][3] = {
      {10, 11, 12},
      {20, 21, 22},
      {30, 31, 32},
      {40, 41, 42},
      {50, 51, 52},
      {60, 61, 62},
  };
  int i=0, j=0;
  foreach(it, vec[++i]) {
    fprintf(stdout, "%u\n", *it);
    if( ++j>5 ) return 0; /// а иначе у тебя сегфолт
  }
  return 0;
}

$ gcc -std=gnu99 coder-er2.c 
$ ./a.out 
20
21
22
30
31
32

в то время как правильный результат это «20\n21\n22\n» ( http://ideone.com/JbO2Ns )

почему этот результат правильный, а твой нет — потому, что внутри своей реализации ты можешь хоть 1, хоть 2, хоть 100500 раз делать копирование, но снаружи твоего макроса это вообще не должно быть видно


3. твой хуже чем for(... : ...), т.к. твой код, т.к. твой код МОЛЧА ломается от данных, которые легко могут в него попасть, а for(... : ...) выдает диагностику (диагностика g++ 4.7 на http://ideone.com/0vQk95 )

#include <stdio.h>
#include <stdint.h>

#define foreach(a, b)\
for(typeof(*(b)) * (a) = (b); (a) != ((b) + (sizeof((b))/sizeof(typeof(*(b))))); ++(a))
int main() {
  uint32_t vec[] = {123, 124, 125};
  uint32_t *ptr = vec;
  foreach(it, ptr)
    fprintf(stdout, "%u\n", *it);
  return 0;
}

$ gcc -std=gnu99 coder-er3.c
$ ./a.out
123

Перемещено Pinkbyte из development

★★★★★

Последнее исправление: www_linux_org_ru (всего исправлений: 2)

я после typeof даже читать не стал, а отвечать ему смысла нет - в его частном случае все работает, остальное его не волнует

wota ★★
()

Забавно. Но если контейнер в куче, то все сдыхает сразу же? Я не говорю про какие то изощренные вещи типа списка;-)

AIv ★★★★★
()
Ответ на: комментарий от wota

а отвечать ему смысла нет - в его частном случае все работает, остальное его не волнует

не отвечать ему — это тоже возможная позиция, но я в основном предлагаю решение для для тех, кто ему все же отвечает

я после typeof даже читать не стал

ну меня у любопытство — можно ли так сделать на стандартной сишке, пусть даже с11

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Пардон, хотел проверить, заменяются ли вложенные лапки автоматом, как двойные кавычки.. Вместо предпросмотра - запостил.

anonymous
()
Ответ на: комментарий от AIv

Забавно. Но если контейнер в куче, то все сдыхает сразу же? Я не говорю про какие то изощренные вещи типа списка;-)

эта вещь позиционируется только для случаев, когда длина известна статически

а для обхода списков в ядре линукса есть (были по крайней мере раньше) другие макросы

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от geekless

Предлагаю удалить тред и не позориться. ( netcat)
Удваиваю.

и в чем вы видите мой «позор»?

(если че, то я лично считаю это говнокодом, но не вижу ничего позорного в том, чтобы найти в нем ошибки — наоборот, это полезно)

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Даже если длина известна статически, мне не нравится например что я не знаю позицию в многомерном статическом массиве. Т.е. на variadic template можно сделать то же самое, но оно будет типобезопасно и гораздо более дуракоустойчиво (потому как не будет читерства с указателями).

AIv ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

ну меня у любопытство — можно ли так сделать на стандартной сишке, пусть даже с11

Если нет auto или decltype, то невозможно без указания типа. Typeof гнутое расширение => невозможно.

quiet_readonly ★★★★
()
Ответ на: комментарий от tailgunner

Обсуждение того foreach? Рили?

ну мне понравилось размяться и найти ошибку из п.2, да

а кто-то может не знает про подлянку sizeof из п.3

но вообще согласен, что все это детский сад

www_linux_org_ru ★★★★★
() автор топика
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от quiet_readonly

Typeof гнутое расширение => невозможно.

между прочим, в с11 есть компайл-тайм диспатч по типам (_Generic)

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от AIv

Даже если длина известна статически, мне не нравится например что я не знаю позицию в многомерном статическом массиве.

тут поподробнее

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Ну смотри. Захожу я в ту тему и читаю комментарии прокодера99. Все они полны термоядерного хамства.

Как жешь сложно говорить с анскильными неосиляторами.

Я не хочу даже смотреть на твой щит.

И это только два комментария.
О чем можно вообще говорить с таким человеком?
Однако, может быть он компенсировал свое хамство и быдлизм гениальным решением? Нет.
Так давайте же создадим тред специально для него!
Тебе делать больше нечего, кроме как на такое г эту личность время тратить?

netcat ★★
()
Последнее исправление: netcat (всего исправлений: 1)
Ответ на: комментарий от netcat

Все они полны термоядерного хамства.

когда этот чувак *меня* хоть *чуть-чуть* задевает, я ему быстренько напоминаю, что мое решение с экспонентой даже без sse отработало за 38 тактов, а он бесславно слился

может, тебе стоит применить похожую тактику?

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от netcat

компенсировал свое хамство и быдлизм

Будто что-то плохое и есть что компенсировать.

гениальным решением? Нет.

А это вот плохо.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

Мне в голову не придет с такими людьми разговаривать. Это все равно, что вилкой в тухлом винегрете ковыряться.

netcat ★★
()
Ответ на: комментарий от www_linux_org_ru

ВОт у меня типовая задачка - есть массив

double weights[4][4];
или даже
double weights[4][4][4];
мне его надыть пройти в цикле че то творя, но при этом я должен знать ix, iy, iz.

AIv ★★★★★
()
Ответ на: комментарий от netcat

Мне в голову не придет с такими людьми разговаривать. Это все равно, что вилкой в тухлом винегрете ковыряться.

*тебе* да, но ведь вопрос был в том, чтобы *МНЕ* не позорится

а я че-то не помню, чтобы он мой код назвал щитом... но даже если так случится, то я только поржу

правда, мне это очень весело

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

А еще он становится шелковым, когда намекаешь ему что больше не будешь с ним общацца;-) У него явно дефицит общения. Но это наверное один из самых забавных персонажей на ЛОР-е.

AIv ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

вопрос был в том, чтобы *МНЕ* не позорится

Так я о чем и говорю - удали тред и забудь про это юное дарование.

правда, мне это очень весело

Ну как знаешь. Между прочим, над убогими смеяться нехорошо.

netcat ★★
()
Последнее исправление: netcat (всего исправлений: 1)
Ответ на: комментарий от AIv

мне его надыть пройти в цикле че то творя, но при этом я должен знать ix, iy, iz.

а как это должно выглядеть синтаксически?

и да, есть еще вариант «векторного» кода, типа как в blitz

Index I(1,N-1), J(1,N-1);
u(I,J)=A*u[I,J]+B*(u[I+1,J]+u[I,J+1]+.....);
www_linux_org_ru ★★★★★
() автор топика
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от AIv

да, персонаж забавен, и скрашивает своими прикольными выкриками наши нудные разговоры :-)

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от netcat

Между прочим, над убогими смеяться нехорошо.

почему нехорошо? а если учесть, что он, по-твоему, хамит, то тоже нехорошо?

кстати, возможно он втихую меня заигнорил, т.к. че-то не видно его реакции

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Вполне возможно, что он такой в силу жизненных обстоятельств (в детстве уронили, например), следовательно, он не виноват. А если нет, то все равно меру надо соблюдать.

netcat ★★
()
Ответ на: комментарий от netcat

то все равно меру надо соблюдать.

ну вот я и стараюсь эту меру соблюдать — например, взял и серьезно ответил на тему его ошибок, предложив выкатить исправленный вариант

www_linux_org_ru ★★★★★
() автор топика

Давайте лучше ему на новый комп скинемся, пусть дальше в игры играет.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

WTF blitz? Емнип цпп такого как u[I,J] не позволяет? Или они запятую перегрузили О_О (а кстати мысль;-))?

а как это должно выглядеть синтаксически?

double weights[4][4][4];
for(int ix=0; ix<4; ix++)
    for(int iy=0; iy<4; iy++)
       for(int iz=0; iz<4; iz++){
           ... weights[ix][iy][iz] = horrible(ix, iy, iz); ...
       }

вот так мне не нрав.

AIv ★★★★★
()
Ответ на: комментарий от geekless

Ты вроде адекватный чувак, не опускайся до уровня «дискуссии» с этим организмом.

тема «опускания» не раскрыта — я указал чуваку на его ошибки и предложил выкатить исправленный вариант, че тут позорного для меня?

см., кстати, дискуссию выше по треду с netcat

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от AIv

WTF blitz?

ты по своим занятиям просто *должен* знать это слово, google://blitz++ — потом мне расскажешь самое интересное :-)

Емнип цпп такого как u[I,J] не позволяет? Или они запятую перегрузили О_О (а кстати мысль;-))?

не позволяет, да перегрузили, но по-другому

у них код будет u(I,J)=A*u(I,J)+B*(....), а запятая нужна, чтобы писать u=1,2,3,4

че я не в курсе — можно ли в блице подставить свою реализацию массива (похоже что нет, хотя там можно его перемешивать с другими, фортранить и т.п.)

www_linux_org_ru ★★★★★
() автор топика
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от netcat

О чем можно вообще говорить с таким человеком?

Во-во, с ним вообще бестолку общаться, он упоротый.

ЗЫ. Его уже чуть ли не месяц мурыжат, а он вроде только две тухлые портянки кода выдавил из себя :)

false ★★★★★
()
Последнее исправление: false (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

Гы... ничего я не должен. У меня своя такая;-)

Таких либ вагон и маленькая тележка. Сайт у них не айс, а вот это

Features

    * Supports Array up to 11-dimensions
    * Matrix, Tensors and Vectors
    * Arbitrary ordering including C-style and Fortran-style
    * Array Boundary checks supported
    * Random Number Generators
    * Slicing
просто вышибло слезу.

ЗЫ доки от version 0.9, 24 March 2006 - оно сдохло, или сайт сдох? Но в любом случае, без поддержки документации это ненужно.

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от AIv

становится шелковым, когда намекаешь ему что больше не будешь с ним общацца

конечно становится, ведь для тролля потерять аудиторию -> слова в пустоту, кого же троллить?

anonymous
()

это что вообще за бред уровня мыльной оперы?

+1 к netcat
не позорься

q11q11 ★★★★★
()
Ответ на: комментарий от AIv

Гы... ничего я не должен. У меня своя такая;-)

ну а кто же тебе запретит велосипед изобретать? правильно, никто, но хотя бы названия-то других велосипедов знать-то надо, не?

доки от version 0.9, 24 March 2006 - оно сдохло, или сайт сдох? Но в любом случае, без поддержки документации это ненужно.

я не утверждал, что оно тебе *нужно*

а документация ставится в дебиане вместе с либой

Таких либ вагон и маленькая тележка.

и ты, надеюсь, даже проводил сравнения их фич? так поделись

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

тема «опускания» не раскрыта — я указал чуваку на его ошибки и предложил выкатить исправленный вариант, че тут позорного для меня?

Да в общем-то ничего, ты просто теряешь своё время. Ладно-ладно, ты прав: каждый может сходить с ума как хочет. Особенно вечером воскресенья.

geekless ★★
()
Последнее исправление: geekless (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

и ты, надеюсь, даже проводил сравнения их фич? так поделись

Я от тебя в первый раз о них услышал сейчас. Но сразу могу сказать, что у меня размерность массива не ограничена;-)

КРоме того, у меня ориентация на связку питон+цпп, ряд нестандартных контейнеров и средства визуализации.

А так погляжу, любопытно.

AIv ★★★★★
()
Ответ на: комментарий от AIv

а вот это <...> * Slicing — просто вышибло слезу.

да?

ну так поделись либой, которая умеет эффективно использовать sse для, скажем, сложения чисел в слайсах (хотя бы в слайсах с шагом 1, но невыровненных по 16 байт)

(я, кстати, не говорю, что blitz это умеет — я не в курсе)

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Моя тоже не умеет, но правильно готовить SSE - это особый дзен.

AIv ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

умеет эффективно использовать sse для, скажем, сложения чисел в слайсах (хотя бы в слайсах с шагом 1, но невыровненных по 16 байт)

И ты же сам знаешь, что это невозможно.

AIv ★★★★★
()
Ответ на: комментарий от AIv

И ты же сам знаешь, что это невозможно.

почему вдруг?

я, *конечно*, не утверждаю что это будет так же быстро, как для выровненных, но с *минимальными* потерями по времени — можно

но правильно готовить SSE - это особый дзен.

согласен

а где об этом почитать?

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

почему вдруг?

Ну у тебя подготовка вектора съест весь профит. ИМНО.

а где об этом почитать?

ХЗ. Я знаю у кого спросить, мне этого хватает;-)

AIv ★★★★★
()
Ответ на: комментарий от anonymous

(dolist (i '(1 2 3)) (print i)) Вот и весь форыч.

а теперь, пожалуста, добавьте сюда sse-интринсики и чтобы можно было удобно пользоваться чем-то похожим на OpenMP

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Полезно решать надуманные проблемы? Ты издеваешься?

Хотя это было бы полезно на работе, если убедить начальство, что это важно

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.