LINUX.ORG.RU

foo[1]-1 это сдвиг назад или вычитание элемента массива?

 


0

1

Язык С, что-то запутался. Надо порядок символов проверить, вычитаю foo[1]-1, это я из второго элемента 1 отнял или передвинулся на foo[0]?

★★★★★

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

из второго элемента 1 отнял

mbivanyuk ★★★★★
()

Это ты из 2 элемента отнял единицу.

karmich
()

Вот тогда интересно, почему:

if (nsymbol[0] == nsymbol[1]-1 && nsymbol[0] == nsymbol[2]-2)
                fprint ("coords is %i, %i", nsymbol[0]/3, i);

работает.

nsymbol[0] = 200
nsymbol[1]=201
nsymbol[2]=202

А вариант:

            for (symbol=0; symbol<=strlen(mystr); ++symbol)
            {
                if (nsymbol[0] == (nsymbol[symbol]-symbol))
                    exist = true;
                else
                {
                    exist = false;
                    break;
                }
            }
            if (exist == true)
                fprint ("coords is %i, %i", nsymbol[0]/3, i);

отказывается?

strlen(mystr) = 3

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

Потому, что условие должно быть «строго меньше»

symbol < strlen(mystr)
sjinks ★★★
()

Внести царя!

anonymous
()

Может таки учебник?

Си - язык простой как топор, а ты его уже какой тред изучаешь

Stil ★★★★★
()
Ответ на: комментарий от steemandlinux
symbol=0

Переменные i, j, k свыше 30-ти лет на рынке счётчиков.

symbol<=strlen(mystr);

На первое время просто запомни: циклы по длинне (массива, строки) всегда имеют строгое условие «меньше». Потом логику поймёшь.

                if (nsymbol[0] == (nsymbol[symbol]-symbol))
                    exist = true;

Зачем такое в цикле делать? Компилятор конечно заоптимизирует, но читать-то даже неудобно.

Я так понимаю тебе надо проверить арифметическую прогрессию вида x[n + 1] = x[n] + 1

Итого:

int i, exists;

for (i = 0, exists = 1; exists && mystr[i]; i++) {
    exists = mystr[i] == mystr[0] + i;
}

Пояснение: strlen нам как таковой не нужен, так как мы итак перебираем строку до конца. А как известно сишные строки заканчиваются на '\0'. остальное, недеюсь, по коду понятно.

В качестве «байтосовокупленческой» оптимизации еще можнно mystr[0] записать в переменную. Но тогда надо проверять mystr на NULL

KennyMinigun ★★★★★
()
Ответ на: комментарий от steemandlinux
for (symbol=0; symbol<=strlen(mystr); ++symbol)
            {
                if (nsymbol[0] == (nsymbol[symbol]-symbol))
                    exist = true;
                else
                {
                    exist = false;
                    break;
                }
            }
            if (exist == true)
                fprint ("coords is %i, %i", nsymbol[0]/3, i);


логика просто фееричная
anonymous
()
Ответ на: комментарий от KennyMinigun

Но тогда надо проверять mystr на NULL

В твоём коде тоже надо, если такая возможность подразумевается, конечно.

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

свыше 30-ти лет на рынке счётчиков

А на рынке базисов — так и вовсе не один век.

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

Нет, это намёк на то, что i,j,k в качестве счётчиков выглядят как-то очевиднее, чем symbol

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