Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
1

Ошибка в уровнях косвенного обращения

17.02.2015, 22:53. Просмотров 1759. Ответов 20
Метки нет (Все метки)

Доброе всем время суток! Пишу программку, все делю по частям и проверяю. возникла ошибка, а именно :
t: "double" отличается по уровням косвенного обращения от "double [2]". Если кто подскажет как исправить ошибку, а также подкорректирует все возможные недочеты по коду, буду очень благодарна
Собственно сам код программы:


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
/////Фаззификация
    //Необходимо ввести число, пусть это будет t время и сравнить его с элементами массива А[]
    double t=2;
    int i;
    
    if('t' <= A[0])
        double smfe[5]={1,0,0,0,0};
    else if ('t' >= A[4])
        double smfe[5]={0,0,0,0,1};
    else    if  ('t' <= A[i])
        for(int i=0; i<5; i++)
 
        {   
                double smfe[5]={0,0,0,0,0};
            ///Создаем сначала новый массив из двух элементом =0, затем  присваиваем второму элементу знаечние 1+('t'-A[i])/(g_osnovaniya*0.5)
                double smfe_temp[1][2]={0,};
                smfe_temp[0][1]=1+('t'-A[i])/(g_osnovaniya*0.5);
                //Находим в получившемся массиве max элемент
                    double max_faz=0;
                    max_faz = smfe_temp[0][0]; //пусть 1 элемент максимален
 
                    for (int i = 0; i < 1; i++)
                         { for (int j = 0; j < 1; j++)
                                    {if (smfe_temp[i][j] >= max) max = smfe_temp[i][j];}
                            }
 
                    //Присваиваем на каждом i ом шаге  максимальное значение
                
                    smfe[i]=max;                
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2015, 22:53
Ответы с готовыми решениями:

Конвертор из wchar_t to string. Ошибка косвенного обращения.
Вот код, Ошибки: Ошибка 3 error C2040: temp: &quot;std::string&quot; отличается по...

Уровни косвенного обращения
День добрый, что такое уровни косвенного обращения, как и для чего они...

error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream"
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt;...

Выдает ошибку c:\proect\8\8\8.cpp(60): error C2040: ==: "char [20]" отличается по уровням косвенного обращения от "int"
Программа должна выводить фамилии всех нападающих с датой рождения из основного...

Ошибка при использовании нескольких переменных с одним именем в разных уровнях вложенности циклов for
Почему когда создаешь цикл фор по 2 раза и больше раз,и объявляешь там одну и...

20
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 00:12  [ТС] 2
Если у кого-то ВДРУГ будет желание помочь и нормально разъяснить НОВИЧКУ, а не постебаться и посмеяться, то, пожалуйста, буду признательна.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
18.02.2015, 00:30 3
Vallentina, уберите апострофы с букв t: 't' --> t.

Добавлено через 39 секунд
И запятую в 16 строчке
0
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 00:33  [ТС] 4
я так изначально и делала, но тогда ошибка: несовместимые типы операндов ("double *" и "double")
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
18.02.2015, 00:38 5
Vallentina, у вас ошибки в определении массива нет? double* A[], например. должно быть без звездочки
0
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 00:43  [ТС] 6
Можно я Вам пришлю весь код, может я где -то выше намудрила. Еще немного изменила код и внесла условие if (t <= A[i]) в цикл, и теперь+ ругается на double smfe[i]=max. Вместо i здесь нужна константа. я же надеялась, что оно в цикле?и идет перебор

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
int _tmain(int argc, _TCHAR* argv[])
{
    ////Исходные параметры
 
    using namespace std;
    double numt=3;
    int munsyu=5;
    int numzv=5;
 
    double t[2]={-1, 1};
    int syu[2]={-1, 1};
    int szv[2]={-1, 1};
 
 
    ////Расчет центров функции принадлежности ЛП и ширины основания 
 
    double min=0;
    double max=0;
    double g_osnovaniya;
    
    double A[5]={0,}; //массив размерностью 1 на 3
 
    //Ищем min и  max из t[2]={-1, 1};
    min = t[0]; //пусть 1 элемент массива минимален
    max = t[0]; //пусть 1 элемент максимален
    for (int i = 0; i < 2; i++)
    { 
            if (t[i] <= min) min = t[i];  //проверяем на  min и  max
            if (t[i] >= max) max = t[i];
 
    }
    A[0]=min;  //присваиваем певрому элементу массива A[5]={0,} значение min
    A[4]=max;  //присваиваем последнему элементу массива A[5]={0,} значение max
 
    g_osnovaniya=(abs(A[4])+abs(A[0]))/(0.5*(5-1));//ширина основания
 
 
    //Начиная со 2 второго элемента до предпоследнего заполняем массив  A[]
    for (int i = 1; i < 4; i++)
        {
            A[i]=A[i-1]+0.5*g_osnovaniya;           
        }
        /*
    for (int i = 0; i < 5; i++)
        {
            cout << A[i] <<" ";
        }*/
 
 
 
    /////Формируем базу правил  модели 75 правил ???
 
    const int N=5;
    const int M=5;
    int Baza[N][M]={0,};
 
/*
    for (int i=0;i<N;i++) 
    {
        for (int j=0;j<M;j++) 
        {
             cout <<"  "<<  Baza[i][j];
             cout << endl;
            
        }
    }
    */
    
 
    /////Фаззификация
    //Необходимо ввести число, пусть это будет t время и сравнить его с элементами массива А[]
    double t=2;
    int i;
    
    if(t <= A[0])
        double smfe[5]={1,0,0,0,0};
    else if (t >= A[4])
        double smfe[5]={0,0,0,0,1};
    else    
        for(int i=0; i<5; i++)
 
        {
            if  (t <= A[i])
                double smfe[5]={0,0,0,0,0};
            ///Создаем сначала новый массив из двух элементом =0, затем  присваиваем второму элементу знаечние 1+('t'-A[i])/(g_osnovaniya*0.5)
                double smfe_temp[1][2]={0,};
                smfe_temp[0][1]=1+(t-A[i])/(g_osnovaniya*0.5);
                //Находим в получившемся массиве max элемент
                    double max_faz=0;
                    max_faz = smfe_temp[0][0]; //пусть 1 элемент максимален
 
                    for (int i = 0; i < 1; i++)
                         { for (int j = 0; j < 1; j++)
                                    {if (smfe_temp[i][j] >= max) max = smfe_temp[i][j];}
                            }
 
                    //Присваиваем на каждом i ом шаге  максимальное значение
                
                    double smfe[i]=max;             
            }
        
                    else        
    
    getch();
    return 0;
}
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
18.02.2015, 00:51 7
Vallentina, лень изучать код, но если в массиве инициализируете все элементы нулем, писать нужно так:
double A[5] = {0};

Не знаю, ошибочна ли запятая после нуля, но попробуйте удалить их
0
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 00:55  [ТС] 8
Спасибо большое) но проблема не решена...
0
S_el
2220 / 1682 / 354
Регистрация: 15.12.2013
Сообщений: 6,670
18.02.2015, 00:56 9
Vallentina, прокомментируйте каждую строчку своего кода.Чтобы было понятно что и зачем вы делаете.
0
Jewbacabra
Эксперт PHP
3517 / 2921 / 1307
Регистрация: 24.04.2014
Сообщений: 8,889
18.02.2015, 00:57 10
Vallentina, код кошмарный (просьба не обижаться) - куча переменных с неосмысленным названием, форматирование так себе. Рекомендую для начала привести код в порядок, желательно разбить на функции.

Какие ошибки заметил:
Цитата Сообщение от Vallentina Посмотреть сообщение
if *(t <= A[i])
* * * * * * * * double smfe[5]={0,0,0,0,0};
область видимости smfe ограничивается этими строчками
Если внутри if, for, while 1 строчка, все равно рекомендую ставить скобки

Цитата Сообщение от Vallentina Посмотреть сообщение
double smfe_temp[1][2]={0,};
какой в этом смысл?
C++
1
double smfe_temp[2]={0,};
Цитата Сообщение от Vallentina Посмотреть сообщение
double smfe[i]=max;
тип не нужен
1
GREGOR_812
26 / 26 / 5
Регистрация: 23.04.2014
Сообщений: 130
18.02.2015, 01:03 11
WTF?!?!?!
Цитата Сообщение от Vallentina Посмотреть сообщение
C++
1
double A[5]={0,}; //массив размерностью 1 на 3
Здесь можно использовать строгое неравенство
Цитата Сообщение от Vallentina Посмотреть сообщение
if (t[i] <= min) min = t[i]; *//проверяем на *min и *max
if (t[i] >= max) max = t[i];
Это полная жесть, а не код, что вообще за задача?

Добавлено через 1 минуту
Тебе нужно понять для начала, что такое массив и что такое его размерность. А затем понять, зачем ты влезла в программирование. Если этого не понять, то дальше всё будет бесполезно
0
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 01:13  [ТС] 12
C++
1
double A[5]={0,}; //массив размерностью 1 на 3
Это ошибочно написала размерность 1 на 3. Массив из пяти нулей, по поводу запятой после нуля, то все что нашла в инете в различных статьях

Добавлено через 53 секунды
На обоснованную критику не обижаюсь, я это понимаю, но по ходу пишу, придумываю и исправляю, вот так и получается

Добавлено через 7 минут
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Сообщение от Vallentina
if *(t <= A[i])
* * * * * * * * double smfe[5]={0,0,0,0,0};
область видимости smfe ограничивается этими строчками
Если внутри if, for, while 1 строчка, все равно рекомендую ставить скобки

Извините, я не поняла о чем вы(
0
GREGOR_812
26 / 26 / 5
Регистрация: 23.04.2014
Сообщений: 130
18.02.2015, 01:16 13
Цитата Сообщение от Vallentina Посмотреть сообщение
по ходу пишу, придумываю
Надо не придумывать, а следовать несложным правилам. Возьмите книгу какую-нибудь по основам языка, интернет же есть, неужели так трудно полистать нужные разделы?

Добавлено через 20 секунд
Vallentina, задача-то в чём состоит?
0
Jewbacabra
Эксперт PHP
3517 / 2921 / 1307
Регистрация: 24.04.2014
Сообщений: 8,889
18.02.2015, 01:24 14
Цитата Сообщение от Vallentina Посмотреть сообщение
Извините, я не поняла о чем вы(
C++
1
2
3
4
5
6
7
8
if(t <= A[0]) {
    // smfe доступна только внутри данного блока.
    double smfe[5]={1,0,0,0,0};
    printf("%x\n", smfe);
}
// printf("%lf", smfe[0]); будет ошибка, smfe тут не видна.
double smfe[5]; // это переменная не связана с объявленной в if
printf("%x\n", smfe); // может быть повезет, и адрес совпадет, но полагаться на это не следует
1
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 01:34  [ТС] 15
Задача: есть перекресток со следующими параметрами:время зеленого света для одного направления, количество машин для направления Север-Юг, количество машин для направления Запад-Восток. Четко заданы диапазоны изменения этих параметров. Необходимо на основе понятий нечеткой логики рассчитать оптимальное время зеленого света, чтобы на дорогах не образовывалось пробок со всех направлений.

По поводу моих знаний. Спасибо конечно за все советы, открыть книги, интернет и т.д. и стоит ли мне вообще программировать. НО я работала в matlabe и теперь мне надо переписать все в С++. Как такового четкого алгоритма у меня нет, потому что я придумываю его сама!!!! И поймите пожалуйста, знания накапливаю теперь в ходе своих же ошибок,но стараюсь сама же их исправить,вот решила попросить помощи....

Добавлено через 8 минут
Jewbacabra, спасибо большое) Ваши замечания я поняла и исправила. Только с одним не могу разобраться t: "double" отличается по уровням косвенного обращения от "double [2]"

C++
1
 double t=2;
Если уже сейчас пошлете, то тоже пойму))
0
GREGOR_812
26 / 26 / 5
Регистрация: 23.04.2014
Сообщений: 130
18.02.2015, 01:35 16
Vallentina, ну вот значит тебе в копилку: давай переменным понятные имена. Неважно, что они будут казаться длинноватыми, это только сейчас ты (и к слову, никто кроме тебя) помнишь, что означают эти отдающие коммунистическим прошлым аббревиатуры. Через неделю ты забудешь, а люди на форуме никогда и не поймут и скорее всего забьют, и никакой помощи ты не дождёшься. Названия желательно давать на английском языке, раз уж так сложилось, что синтаксис состоит из латинских букв.
0
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 01:38  [ТС] 17
Хорошо учту, спасибо
0
zss
Модератор
Эксперт С++
7412 / 6802 / 4302
Регистрация: 18.12.2011
Сообщений: 17,967
Завершенные тесты: 1
18.02.2015, 09:19 18
Я сделал Ваш исходный код компилируемым, может пригодится
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
#include<iostream>
#include <cstdlib>
using namespace std;
int main()
{
   double t=2.0,g_osnovaniya=0.1;
   int i; // не используется
   double smfe[5]={1.,0.,0.,0.,0.};
   double A[5]={1.,0.,0.,0.,0.};
   if(t >= A[4])
   {
       smfe[0]=0.;
       smfe[4]=1.;
   }else
//if  ('t' <= A[i]) i еще значение не присвоено
   for(int i=0; i<5; i++)
   {   
        smfe[0]=0.;
            ///Создаем сначала новый массив из двух элементом =0, затем  присваиваем второму элементу знаечние 1+('t'-A[i])/(g_osnovaniya*0.5)
        double smfe_temp[1][2]={0,}; // зачем он двумерный, если первый индекс только ноль?
        smfe_temp[0][1]=1+(t-A[i])/(g_osnovaniya*0.5);
                //Находим в получившемся массиве max элемент
        double max_faz=0;
        max_faz = smfe_temp[0][0]; //пусть 1 элемент максимален
 
    for (int j = 0; j <= 1; j++)
        {
                if (smfe_temp[0][j] >= max_faz) 
                    max_faz = smfe_temp[0][j];
        }
         //Присваиваем на каждом i ом шаге  максимальное значение
        smfe[i]=max_faz;                
    }
    system("pause");
    return 0;
}
0
Vallentina
0 / 0 / 0
Регистрация: 30.03.2013
Сообщений: 35
18.02.2015, 23:09  [ТС] 19
Спасибо большое всем за советы! Проблему решила. На всякий случай напишу каким образом. Вместо

C++
1
double t=2
я записала как массив

C++
1
double t[1]={2};
0
GREGOR_812
26 / 26 / 5
Регистрация: 23.04.2014
Сообщений: 130
23.02.2015, 19:30 20
Vallentina, молодец, что разобралась. А проблема, судя по всему, в том, что ты записывала число 2, а обращалась к нему как к элементу массива. А обращение к элементу массива - это то же самое, что обращение по указателю, а не напрямую к объекту. Т.е. запись
C++
1
double t[1] = 2;
равноценна записи
C++
1
2
double * t;
*t = 2;
Непонятно только, зачем создавать массив из одного числа
0
23.02.2015, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2015, 19:30

Ошибка обращения к нулевому адресу
int main(int argc, char* argv) { ifstream f...

Ошибка обращения к элементу массива
void sort(int *mas, int len) { int max = mas; int min = mas; for (int i...

Ошибка обращения к строке (нарушение прав доступа чтения)
Добрый всем день немогу разобраться что за ошибка и как ее локализовать код и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru