LINUX.ORG.RU

Стандарт оказался неудобным, i j

 ,


0

1

Во всех примерах когда нужно использовать два вложенных цикла используют изначально букву «i», а во внутреннем - «j». Я поступаю также. У меня одного возникают проблемы с этими буквами в большом коде, когда перепутав буквы местами, просто не замечаю этого??? А какие буквы используете вы? И да, пишу на C++ / java , но кажется это неважно.

★★★

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

Иногда использую i и j. Никогда не путаю. В чём проблема - не понимаю. Ты часто путаешь в словах на русском И и Й?

blexey ★★★★★
()

Использую i и j, иногда путаю, но быстро замечаю

alix ★★★★
()

Никогда такого не было. Чесслово, ни разу не перепутал.

Ну раз путаешь, используй i и k. Или j и k. Тогда не перепутаешь. Кстати, k — тоже стандарт де-факто.

DeVliegendeHollander ★★
()

это из математической записи идёт, а по сабжу - поменяй шревты, чтобы i и j лучше различались

Harald ★★★★★
()

И да, это не стандарт, а традиция

esandmann
()

Первый раз узнаю о таком стандарте. Я то обычно использую в качестве счётчиков циклов переменные a, b ...

rezedent12 ☆☆☆
()
Ответ на: комментарий от rezedent12

Первый раз узнаю о таком стандарте.

Я тоже не слышал об этом как «Стандарт!». Но на хабре, или на stackoverflow.com постоянно вижу такое.

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

а по сабжу - поменяй шревты, чтобы i и j

Да мне проще наверное будет выбрать другие буквы, потому что даже сейчас использую две IDE (Qt , android studio)

В чём проблема - не понимаю. Ты часто путаешь в словах на русском И и Й?

На моем мониторе j от i отличается примерно на 3 пикселя(хвостик снизу у «j»).

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

На моем мониторе j от i отличается примерно на 3 пикселя

Может тогда сменить род занятий на дворника? Дворник хоть может себе позволить монитор получше 14" ЭЛТ 640х480. Уж на что я слеп на оба глаза, но не могу представить, как эти две буквы можно перепутать.

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

FullHD 24".

не могу представить, как эти две буквы можно перепутать.

Я не обратил внимание. Код работал неправильно, где-то была ошибка, примерно 50 строк, оказалось что я при копировании одного куска кода в другой, забыл поменять там букву. Периферийным зрением это было плохо заметно.

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

Когда что-либо используется много-много лет, то об этом говорят «стандарт де-факто». Нигде не записано кровью, что i и j непременно должны быть счётчиками цикла, тем не менее, почти все используют именно эти идентификаторы.

Кстати, где-то читал, что помимо i, j, k вполне нормально использовать m и n (l не рекомендуется, поскольку похож и на 1, и на i :-)). Так что выбор достаточно широкий, можно подобрать совершенно непохожую комбинацию даже для трёх вложенных циклов.

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

Ну m и n тоже похожие. Самому выбирать не хочется. Выбрать более правильный вариант все равно не смогу. Так что подожду пока тут что-то скажут. Вариант с k хороший, вот только какую вторую букву взять?

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

Ну пиши counter.

Боюсь в таком случае, через год я уже буду участвовать в срачах на тему «почему 21:9 мониторы самые лучшие для программистов».

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

Можно же ещё: i и m, j и m, i и n, j и n, k и m, k и n... н и так далее :-)

А каким способ пользуешься ты?

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

Тащемта если у тебя много вложенных циклов (>3), то в буквах уже запутаешься. А если меньше, то бери k, m, n. Хотя если у тебя i и j сливаются, то m и n тоже могут. m, o, p?

vurdalak ★★★★★
()

иногда i,j иногда row col, если двумерный массив иногда c или count.

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

а чего никто русские буквы не предлагал ;)

#!/bin/bash -x

function src() {
cat <<EOF
#include <stdio.h>
int main() {
  int и, жи;
  for(и=0;и<3;и++)
    for(жи=0;жи<3;жи++)
      printf("%i %i\n",и,жи);
  return 0;
}
EOF
}

rm -rf a.out 2>/dev/null
src |
clang++ -x c++ -
if [ -f a.out ]; then
  ./a.out
fi

function decode() {
  perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;'
}

rm -rf a.out 2>/dev/null
src | decode |
g++ -x c++ -fextended-identifiers -std=c++11 -
if [ -f a.out ]; then
  ./a.out
fi
anonymous
()

ИМХО для циклов с большими телами следует использовать осмысленные имена. Вообще это относиться ко всем переменным - чем ближе определение к использованию тем меньше смысла можно вкладывать.

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

Опять же — выше писал: никогда не путал i и j — вот ими и пользуюсь. Если есть третий вложенный цикл, то добавляется k. Если вложенных циклов больше трёх, то добавляются m и n (но таких случаев у меня на практике было раз-два и обчёлся).

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

НЯЗ это не то что стандарт, но негласное правило, а так ты можешь использовать что хочешь.

Deleted
()
Ответ на: комментарий от abs

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

Копипаста — зло. Бездумная копипаста — зло в кубе.

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

следует использовать осмысленные имена

Например? В моем случае у меня есть массив «бактерий»(просто координаты, и пару биологических параметров). И я в цикле их перебирают. А во внутреннем цикле снова их всех перебирают для поиска столкновения между ними.

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

Копипаста — зло. Бездумная копипаста — зло в кубе.

Я свой код копировал, а не чужой, если вы об этом.

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

а чего никто русские буквы не предлагал ;)

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

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

Например OverallItem и CollisionItem.

Вот я посмотрел на это, и не понял о чем это. Только посмотрев ответ на какой комментарий осознал. Не очень понятно. Да и проблема в размерах(шириной) такого кода появится.

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

Чаще всего использую x и y, иногда a и b.

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

При чём здесь свой/чужой код? Повторное использование кода путём копирования почти всегда признак плохой программы.

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

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

Я вырезал, а не скопировал)

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

ijk идут из математики, притом именно в такой последовательности: сначала i, потом j, потом k. То, что ты их не знаешь говорит о том, что ты не учил векторную алгебру/аналитическую алгебру и не решал матрицы (в матрицах i и j используются, k уже не для матриц, которые очень похожи по записи на массивы, только для них определены специфические функции и операции, например транспорирование или умножение матриц на матрицу/число, а также элементарные преобразования матриц, да и смысловое значение их несколько иное, а по аналогии k используют для трёхмерных массивов, тем более что в объёме приняты обозначения ijk для единичных векторов, лежащих на осях координат в Евклидовом трёхмерном пространстве, начало этих векторов в точке начала координат и длинна в 1 единицу). Если совсем не можешь запомнить, то учи английскй алфавит: A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z.
По теме: используй хорошие шрифты, где эти буквы различаются, например droid sans mono (модификация с перечёркнутым нулём или нулём с точкой). Ну и если видишь плохо, то шрифт сделай побольше.
Если ты будешь использовать массивы большей размерности чем 3 (очень редко надо на практике) или глубина цикла будет больше, то используй ijklmn...

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

На моем мониторе j от i отличается примерно на 3 пикселя(хвостик снизу у «j»).

Настрой свой редактор так, чтобы он раскрашивал разные переменные разными цветами.

В kdevelop такое из коробки: http://i.imgur.com/JkZRBLK.png.

NeXTSTEP ★★
()

Нафиг надо эти j и i, это просто негласное правило,как для примеров foo и bar, юзай осмысленные переменые даже для счётчиков если тебе так удобнее. типа count_foo и count_bar .

Dron ★★★★★
()

Стараюсь не спользовать однобуквенные переменные в таких случаях, в крайнем случае x, z. В плюсах есть итераторы и с этим проще, можно сразу давать осмысленные короткие названия переменным. Итерирование по индексу ближе к простому си.

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

Настрой свой редактор так, чтобы он раскрашивал разные переменные разными цветами

ВАУ! чертовски круто.

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

То, что ты их не знаешь говорит о том, что ты не учил векторную алгебру/аналитическую алгебру и не решал матрицы

Но я учил. Делаете выводы из-за того что раньше я говорил что несовершеннолетний? Ну круто.

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

Не очень понятно.

Потому что их я придумал. Придумал бы ты, было бы понятнее. А так:

for(int OverallIndex=0;OverallIndex<ARRSIZE; OverallIndex++) {
  for(int CollisionIndex=0;CollisionIndex<ARRSIZE; CollisionIndex++) {
    if (OverallIndex != CollisionIndex) {
      CheckCollision(Bacteria[OverallIndex], Bacteria[CollisionIndex]);
    }
  }
}

Да и проблема в размерах(шириной) такого кода появится.

Где ты видишь проблему?

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

при копировании одного куска кода в другой

В этом пожалуй и проблема. Абстрацируй, а не копируй. (Если кусок кода используется более одного раза, его следовало бы обернуть в функцию.) А Copy-Paste — это хреновый метод, ведущий в частности именно к таким ошибкам.

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

Где ты видишь проблему?

Использую разделение кода на две области, это чуть меньшее 960 пикс на каждый код. С учетом табов, и таких длинных переменных будут проблемы.

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

Я же уже ответил выше, «Я вырезал, а не скопировал». Просто я хотел описать проблему где я перепутал i и j.

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

Переходи на отступ в два пробела.

С одной стороны меньший размер кода. С другой будет непривычно. В Qt creator были случаи когда путался и не мог по табам понять что во что вложено. На android studio рисуются линии, вроде проще.

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

Не знаю я сколько Вам лет, да и вообще может Вы на филолога учились, откуда я знаю? Но запомнить ijk надо было еще с конца школы, ну на крайний случай с первого курса института. Да и как там запутаться в трёх буквах? Разве что от мелкого шрифта, тогда рекомендую монитор от 24 дюймов с разрешением не ниже 1920x1080 и размером шрифта от 13 при правильном DPI. Извиняюсь, если ненароком обидел.

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

Делай вообще GNU стиль отступов, там всё понятно и достаточно удобно, ИМХО, хотя да, длинновато всё же. Но неужели широкий монитор - плохо или слишком дорого для разработки?

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

Но запомнить ijk надо было еще с конца школы

Сейчас именно он. И я знаю что в матрицах используется ij, только не вижу связи с моей проблемой.

тогда рекомендую монитор от 24 дюймов с разрешением не ниже 1920x1080

Именно 24" и 1920*1080 )) Напомню что перепутал я, при просмотре периферическим зрением.

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

Делай вообще GNU стиль отступов

Очень привык, и более того, очень люблю K&R. Вообще не понимаю смысла других отступов.

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