Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480

Ошибка при компиляции. В логике ошибок не замечено

29.03.2016, 21:35. Показов 719. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Среда разработки Dev-С++. При компиляции выдает ошибку "[Error] subscripted value is neither array nor pointer", которая, судя по логике программы произойти не может.

Подскажите, как обойти эту ошибку?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <windows.h>
#include <iostream>
#include <string>
#include <typeinfo>
 
using namespace std;
 
template<typename T>
BYTE* toBytes(T t)
{
    LPCSTR tcode = typeid(t).name();
    if (tcode[0] == 'P')                                        // если в функцию предан указатель
    {
        for (int i = 1; tcode[i]; i++)
        {
            if (tcode[i] == 'A')                                // Если многомерный массив
            {
                cout << "Error 1: it is a lot of massifs" << endl;
            }
            else                                            // Если одномерный массив
            {
                cout << "read: " << &tcode[i-1] << endl;
                // в следующей строке возникает описанная выше ошибка при передаче переменной y
                int size = sizeof(t[0]);    // но ведь по логике при y данное условие выполнено не будет!!!
                int sum = 0;
                for (int j=0; t[j]; j++) sum++;
                cout << "Quantity: " << sum << endl;
                if ((tcode[i] == 'c') || (tcode[i] == 'h') || (tcode[i] == 'w') || (tcode[i] == 'K'))
                {
                    cout << "Type: Chars" << endl;
                    cout << "size - " << sum * size << " bytes"<< endl;
                }
                else if ((tcode[i] == 'b') || (tcode[i] == 's') || (tcode[i] == 't') || (tcode[i] == 'i') || (tcode[i] == 'j') || (tcode[i] == 'l') || (tcode[i] == 'x') || (tcode[i] == 'm') || (tcode[i] == 'y'))
                {
                    cout << "Type: Integers" << endl;
                    if (size != size*sum)cout << "ERROR 2: size - " << sum * size << " bytes. Give me " << size << " bytes!!!"<< endl;
                }
            }
            break;
        }
    }
    else                                                    // если передана переменная
    {
        if (tcode[0] == 'i') cout << t << endl;
        cout << "no pointer" << endl;
    }
    return 0;
}
 
int main(int argc, char** argv)
{
    short x[10];
    x[0] = 2342;
    x[1] = 89854;
    toBytes(x);
 
    int y = 28633115;
    toBytes(y);
 
    return 0;
}
Как быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2016, 21:35
Ответы с готовыми решениями:

ошибок в компиляции нет, а при работе выходит ошибка, почему?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; const int n=2; struct a1{ //объявляем структуру char...

Ошибка №26 - Замечено несоответствие типов
Здравствуйте! Помогите справиться с ошибкой. Ошибка №26. Замечено несоответствие типов. Выделяет строку 6. uses wincrt; VAR...

При компиляции ошибок нет,но при запуске выдает ошибку. В чем причина?
вот код, скрин ошибки прилагаю unit UGraphEdit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...

5
 Аватар для stzer
140 / 110 / 60
Регистрация: 26.10.2013
Сообщений: 314
29.03.2016, 21:50
C++
1
2
3
4
5
int main()
{
        int a;
        a[1] = 9;
}
Этот пример взят отсюда, Ошибка компиляции "Subscripted value is neither array nor pointer nor vector".
Этот код вызывает 'subscripted value is neither array nor pointer'

C++
1
int size = sizeof(t[0]);
0
 Аватар для SolidCoder
19 / 19 / 14
Регистрация: 21.03.2016
Сообщений: 60
29.03.2016, 21:58
Во-первых, 89854 лежит за пределами short.

C++
1
2
3
    short x[10];
    x[0] = 2342;
    x[1] = 89854;
Во-вторых,
C++
1
                int size = sizeof(t[0]);   //но ведь по логике при y данное условие выполнено не будет!!!
По какой такой логике - хз, но это совсем не значит, что компилятор не будет это пытаться скомпилировать. Сначала работает препроцессор, потом лексический анализатор, который обнаружил ошибку синтаксическую, поэтому выбивает ошибку компиляции.

Далее по-идее работает оптимизатор, а потом транслятор, в конце линковщик.

Препроцессор раскрывает код BYTE* toBytes(T t) как BYTE *toBytes(int t), соответственно sizeof(t[0]); - некорректная запись => ошибка компиляции



Ошибка на этапе лексического анализа, так что по-логике тут все норм, что ошибку выбивает.

В-третьих, лично у меня еще тут ошибка:

C++
1
for (int j=0; t[j]; j++) sum++;
При вызове toBytes(y), потому что y - не массив.

Решение:

Объявить y как массив int y[1];

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, char** argv)
{
    short x[10];
    x[0] = 2342;
    x[1] = 89854;
    toBytes(x);
 
    int y[1] = {28633115};
    toBytes(y);
 
    return 0;
}
1
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
29.03.2016, 22:00  [ТС]
как оперативно
0
 Аватар для SolidCoder
19 / 19 / 14
Регистрация: 21.03.2016
Сообщений: 60
29.03.2016, 22:07
Serg_o_Grey, внимательно посмотрите. Я написал почему он ругается, во всяком случае, в обновленной версии поста.

Устранить? Только устранить несоответствие типов.

C++
1
2
    int y = 28633115;
    toBytes(reinterpret_cast<int*>(&y));

либо

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, char** argv)
{
    short x[10];
    x[0] = 2342;
    x[1] = 89854;
    toBytes(x);
 
    int y[1] = {28633115};
    toBytes(y);
 
    return 0;
}
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
30.03.2016, 10:27  [ТС]
Смысл функции в том, что в качестве параметра передаются как одномерные массивы/указатели так и переменнные. Т.е. приведение к иному типу вне функции не допускается

То почему он ругается итак понятно, это я, естественно, видел, и еще некоторые ошибки совершил при упрощении программы для поста..

Добавлено через 10 минут
Цитата Сообщение от SolidCoder Посмотреть сообщение
Препроцессор раскрывает код BYTE* toBytes(T t) как BYTE *toBytes(int t), соответственно sizeof(t[0]); - некорректная запись => ошибка компиляции
- а вообще это все объясняет, так что спасибо, создам внутри функции временный массив запишу в него данные и буду уже работать с ним.

Благодарю!

Добавлено через 11 часов 55 минут
создание вспомогательных переменных и указателей не помогло. Пришлось перегрузить функцию (одна для указателей, другая для переменных). Теперь все работает.

Структура примерно такая:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
using namespace std; 
 
template<typename T1>
char* toBytes(T1 t)
{
    return "pointer";
}
template<typename T2>
char* toBytes(T2* t)
{
    return "variable";
}
 
int main(int argc, char** argv) 
{
    int i1[5]; i1[0] = 123; i1[1] = 123;
    int i2 = 123;
    short i3 = 6453;
    char* c = "fsdfsdf";
    string s1 = "dsfssdf";
    string s2[2]; s2[0] = "asdsf"; s2[1] = "gjhjk";
    
    cout << "i1: \t" << toBytes(i1) << endl;        // i1:      variable
    cout << "i2: \t" << toBytes(i2) << endl;        // i2:      pointer
    cout << "i3: \t" << toBytes(i3) << endl;        // i3:      pointer
    cout << "c: \t" << toBytes(c) << endl;      // c:       variable
    cout << "s1: \t" << toBytes(s1) << endl;        // s1:      pointer
    cout << "s2: \t" << toBytes(s2) << endl;        // s2:      variable
    
    return 0;
}
Добавлено через 12 минут
В примере правда "variable" с "pointer" местами поменять надо, но суть от этого не меняется
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2016, 10:27
Помогаю со студенческими работами здесь

много ошибок при компиляции
Помогите найти ошибки #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main(){ int const n=3; double y={3.0,0.0,0.0}; ...

Множество ошибок при компиляции.
Блин. Извините, но будет ещё один вопрос. Так как новичёк, то много не знаю. Вот программный код: #include &lt;iostream.h&gt; int...

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

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

При компиляции много ошибок в коде
вот код программы. не могу запустить - много ошибок выбивает. запускаю через Dev C + + CKarkasView::CKarkasView() { rotates=0; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru