Array subscript has type char

Когда я запускаю свою программу с помощью gcc -Wall , я получаю

Пожалуйста, помогите мне, где это происходит. Предупреждение говорит об этом по строке 20: 7 и 21: 7. Как я могу избавиться от предупреждения?

c string arrays char gcc-warning

3 ответа

Проблема в том, что строки могут содержать символы из набора символов, отличного от нас (любая кодировка помимо us-ascii).

Которые представлены как отрицательные значения. Я думаю, что доступ к массиву с отрицательным индексом — это не совсем то, что вы ожидаете.

Обработка этого как:

Будет подавлять предупреждение, но все равно будет иметь проблемы.

Добавление следующего цикла проверки в цикл завершает цикл в случае, когда значение символа совершенно неожиданно:

Где countof определяется как:

0 Rob [2015-02-14 04:09:00]

Компиляторы причины дают такое предупреждение, что часто при выполнении x[index] где index является символьным типом, часто является ошибкой программирования.

Если это то, что вы намереваетесь, просто принудийте преобразование в int . Например, в вашем коде count1[(int)str1[i]]++; ,

Имейте в виду, что символ, который печатает цифру ‘1’ , не имеет число, равное численно 1 . Забыв об этом и предположив, что это так, является одной из распространенных ошибок, которые вызовет предупреждение компилятора.

Компилятор дает вам предупреждение об индексации для строк 20 и 21, которые

и подозрительная индексация исходит из аргументов функции.

Обратите внимание, что они указывают на тип char , который по умолчанию подписан. Поэтому, если один элемент массива, который вы используете для индексации в count1[] имеет значение в диапазоне от 0x80 до 0xFF что приведет к использованию отрицательного индекса, который, очевидно, не находится в диапазоне массива count1[] .

Читайте также:  Gyproc или knauf что лучше

Хотя count1[] и count2[] имеют только 123 элемента, поэтому вы не ожидаете индексов, которые на самом деле будут отрицательными числами, все же лучше сделать массивы переданными unsigned char , поэтому функция будет объявлена как

Тогда вы всегда получите положительный индекс. Что касается предупреждения, MSVC не дает мне одного, но если вы затем указали индекс на int как указано ниже вашего вопроса, это должно позаботиться об этом.

Когда я запускаю свою программу с gcc -Wall , я получаю

Пожалуйста, помогите мне, где это идет не так. В предупреждении говорится, что в строке 20: 7 и 21: 7. Как я могу избавиться от предупреждения?

3 ответа

Проблема в том, что строки могут содержать символы из набора символов, отличных от us (любая кодировка, кроме us-ascii).

Которые представлены как отрицательные значения. Я думаю, что доступ к массиву с отрицательным индексом не совсем то, что вы ожидаете.

Обрабатывать это как:

Подавит предупреждение, но все равно будет выходить за границы вопроса.

Добавление следующей проверки в цикл for завершит цикл в случае, если значение символа будет совершенно неожиданным:

Где countof определяется как:

Компилятор выдает предупреждение об индексации для строк 20 и 21, которые

и подозрительное индексирование происходит из аргументов функции.

Обратите внимание, что они указывают на тип char , который подписан по умолчанию. Поэтому, если один элемент массива, который вы используете для индексации в count1[] имеет значение в диапазоне от 0x80 до 0xFF что приведет к использованию отрицательного индекса, который, очевидно, не находится в диапазоне массива count1[] .

Хотя count1[] и count2[] имеют только 123 элемента, так что вы не ожидаете, что индексы на самом деле будут отрицательными числами, но все же лучше, чтобы массивы передавались unsigned char , поэтому функция будет объявлена как

Читайте также:  Телефон с ручкой как называется

Тогда вы всегда получите положительный индекс. Что касается предупреждения, MSVC не дает мне одного, но если вы затем приведете индекс к int как прокомментировано ниже вашего вопроса, это должно позаботиться об этом.

Причина, по которой компиляторы дают такое предупреждение, заключается в том, что часто при выполнении x[index] где index является типом char, часто возникает ошибка программирования.

Если это то, что вы намереваетесь, просто форсируйте преобразование в int . Например, в вашем коде count1[(int)str1[i]]++; ,

Имейте в виду, что символ, который печатает цифру ‘1’ , не имеет числового значения, равного 1 . Забыть это и предположить, что это так, является одной из распространенных ошибок, которые выдает предупреждение компилятора.

When I am running this program I am getting warning "array subscript has type ‘char’". Please help me where is it going wrong. I am using code::blocks IDE

1 Answer 1

or to just a plain (u)int

-Wchar-subscripts Warn if an array subscript has type char. This is a common cause of error, as programmers often forget that this type is signed on some machines. This warning is enabled by -Wall.

The compiler doesn’t want you to inadvertantly specify a negative array index. And hence the warning!