Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108

Массив типа int после инкремента (приращения) другой переменной меняет свое значение .магия

02.11.2015, 20:32. Показов 869. Ответов 2

Студворк — интернет-сервис помощи студентам
Начну пожалуй с конца. Вся суть находится здесь, я её выделил ShowMessag'ами
...
C++
1
2
3
4
5
for (i = 0; i < 7; i++) {
    if (Zap->State[i]) {
        ShowMessage("1.1=" + IntToStr(pravila[1][1][2])+" w="+IntToStr(w));
        w=w+1;
        ShowMessage("1.2=" + IntToStr(pravila[1][1][2])+" w="+IntToStr(w));
...
50-54 строка кода в моем проекте), там также было w++, это уже потом изменил, но все равно значение массива в этом элементе pravila[1][1][2] меняется с 0 на 1.
Собственно делал лабу для продукционных правил. В интерфейсе есть CheckListBox в котором можно выбрать только 2 элемента остальные после выбора 2 блокируются и только после отжатия галочки у одного из них они активируются - это чтобы запросе к продукционной системе были проще) И да там она еще не доделана по понятным причинам)
Ну а теперь спойлеры) Глобальные переменные скажите если как то не так объявил) :
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
UnicodeString * zapk = new UnicodeString[20];
//string * otvet = new string[10];
UnicodeString * vse = new UnicodeString[30];
int pravila[2][1][20]; //1я размерность это количество условий с 'И' к правилу (Если (1) и (2) и (3))
                        //второй на 4 это ответы к части 'то' с 'И' соответственно
                        //и последний просто будет содержать номер правила куда это б можно было записать
int m,n,w;

Данные и правили забиваются в FormCreate для выбора и т.д. (с коментами):
Кликните здесь для просмотра всего текста
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
void __fastcall TZeka::FormCreate(TObject *Sender)
{
zapk[0]="Система условий";
zapk[1]="Представление знаний - модульное";
zapk[2]="Модель знаний логическая";
zapk[3]="Представление знаний - сетевые";
zapk[4]="Граф нагружен и ориентирован";
zapk[5]="Система интелелктуальна";
zapk[6]="Познание по аналогии";
zapk[7]="sdfgh";
zapk[8]="thtyr";
zapk[9]="rthtyj";
zapk[10]="rjkuyk";
zapk[11]="uilol";
zapk[12]="rtyert";
zapk[13]="34y6";
zapk[14]="45u67oi8";
int i;
for (i = 0; i < 12; i++) {
    vse[i]=zapk[i];
}
vse[21]="Продукционные правила"; //..................до 30
vse[22]="Представление знаний - поверхностное";
//теперь правила
//Правило №1
pravila[1][1][1]=1; //представление знаний - модульное
ShowMessage(IntToStr(pravila[1][1][1]));
pravila[2][1][1]=21; //Продукционные правила
pravila[0][1][1]=22; //Ответ: Представление знаний - поверхностное
//конец первого правила
//Правило №2
pravila[1][1][2]=0; //Система условий
ShowMessage(IntToStr(pravila[1][1][2]));
pravila[0][1][2]=21; //Ответ: Продукционные правила
//конец второго правила
//Правило №3
 
}

Вот события клика на CheckListBox, чтобы не больше двух. И да эти 2 выбранные еще потом отображаются в 2'х Edit'ах:
Кликните здесь для просмотра всего текста
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
void __fastcall TZeka::ZapClick(TObject *Sender)
{
//ShowMessage("1 " + IntToStr(pravila[1][1][2]));
int i=7;
w=0;
n=-1;
m=-1;
//ZapInOne->Text=Zap->Items->Strings[Zap->ItemIndex];
//Zap->ItemEnabled[Zap->ItemIndex]=false;
//Zap->State[Zap->ItemIndex]=false;
for (i = 0; i < 7; i++) {
    if (Zap->State[i]) {
        ShowMessage("1.1=" + IntToStr(pravila[1][1][2])+" w="+IntToStr(w));
        w=w+1;
        ShowMessage("1.2=" + IntToStr(pravila[1][1][2])+" w="+IntToStr(w));
        ShowMessage("1.3=" + IntToStr(pravila[1][1][1]));
        ShowMessage("1.4=" + IntToStr(pravila[2][1][1]));
        ShowMessage("1.5=" + IntToStr(pravila[2][1][20]));
        if (n==-1) {
            n=i;
            //ShowMessage("1.2 " + IntToStr(pravila[1][1][2]));
        }
        else
        {
            m=i;
            //ShowMessage("1.3 " + IntToStr(pravila[1][1][2]));
        }
    }
}
//ShowMessage("2 " + IntToStr(pravila[1][1][2]));
if (w==2) {
    for (i = 0; i < 7; i++) {
        Zap->ItemEnabled[i]=false;
        if (i==n || i==m) {
            Zap->ItemEnabled[i]=true;
        }
    }
}
else
{
    for (i = 0; i < 7; i++) {
        Zap->ItemEnabled[i]=true;
    }
}
//ShowMessage("3 " + IntToStr(pravila[1][1][2]));
//ZapInTwo->Text=IntToStr(n) + "=n ,, m=" + IntToStr(m);
if (n!=-1) {
    ZapInOne->Text=zapk[n];
}
else {ZapInOne->Text="";}
if (m!=-1) {
    ZapInTwo->Text=zapk[m];
}
else {ZapInTwo->Text="";}
}

ShowMessag'и не стал убирать так лучше видно что откуда я находил)
И собственно кнопка "дать ответ" с которой понеслось и вынеслось к выше описанному событию:
Кликните здесь для просмотра всего текста
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
void __fastcall TZeka::DayDushuClick(TObject *Sender)
{
int i=0;
bool otvet=true;
ShowMessage(IntToStr(pravila[1][1][2]));
while (otvet) //цикл поиска ответа
    {
        i++;
        //Haski->Text="1 ";
        //vse[pravila[1][1][i]];
        if (w==1) {
            if (i % 2==0) {
                ShowMessage("правило_ [1][1]["+IntToStr(i)+"]="+IntToStr(pravila[1][1][i]));
                if (pravila[1][1][i]==n) {
                    otvet=false;
                    ShowMessage("false");
                }
            }
        }
    }
//Haski->Text=Haski->Text+"допустим";
//if (s==1) {
    //for (i = 0; i < 20; i++) {
 
    //}
//}
Haski->Text=vse[pravila[0][1][i]];
}


Ну суть проблемы я в принципе описал, что после w++ непонятно почему меняется значение массива. В код можете в принципе не очень вникать, интересует только одна проблема - почему это происходит, а там зачем "Система условий" или "Граф нагружен и ориентирован" можете не вникать, это не важно.
Вот есть массив int трехмерный, он участвует только в определенных задачах, а как на него влияет задача в интерфейсе я вот никак в толк не возьму. Уже искал синтаксические ошибки или может я что не так объявил, но вроде даже если что то не так использовал, то в том то месте не должно быть ошибок, поэтому отметал иногда такие варианты, а оно вылазиет.
Вообщем помогите кто чем может)
Собственно ссылка вот на яндекс диск к проекту, но там еще использовались элементы AlphoControls, так что если у вас его нет, то будет ругаться перед запуском. Так что если кому лень это устанавливать, то спрашивайте отвечу что как настроено или еще что по проекту)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2015, 20:32
Ответы с готовыми решениями:

Массив не меняет свое значение и остается нулевым
int inter(double x, double x1, double h, double *c); void main() { double x, x1, k, h; double c={0}; scanf(&quot;%lf%lf%lf&quot;, &amp;x,...

Как присвоить значение одного из элементов массива типа char переменной типа int?
С++ начал буквально только что так что буду благодарен за терпение и понимание ) Сразу оговорюсь что уже искал ответ но на эту тему...

Значение переменной типа int
Я хочу присвоить переменной типа int значение 2147483648, а в gdb я посмотрел значение переменной и оно оказалось равным -2147483648, в чем...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
02.11.2015, 22:26
Давай начнем с того, что для массива описанного так:
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
int pravila[2][1][20];
, обращение к
Цитата Сообщение от КиберСталкер21 Посмотреть сообщение
pravila[1][1][2]
- это уже ошибка, независимо от того, что там где изменяется. Причину ошибки понимаешь?

CodeGuard, например, не дает возможности выполнить указанный код (тот, который в самом первом фрагменте). Так что включи его и попробуй еще раз запустить приложение.
1
4 / 4 / 2
Регистрация: 13.11.2014
Сообщений: 108
02.11.2015, 22:58  [ТС]
капец
я догадывался, что может что с массивом не так, но отладчик то молчал, да и CodeGuard по дефолту был настроен, ну повключал там еще кое что, но все равно эффекта не дало
И вот же исключал из-за этого ошибку с размерностью массива, думаю ведь остальные то выводит нормально, а тут... спасибо, а то я из-за не знания того, что и еще отладчик может по разному работать долго бы искал ошибку)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2015, 22:58
Помогаю со студенческими работами здесь

Максимальное значение переменной типа int
Если тип long в 2 раза больше чем int. Сколько максимум в int? В чём они измеряются в памяти? в цифрах вывода?

Как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной
Подскажите, пожалуйста, как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной ссылочного...

Невозможно переменной присвоить значение типа int
byte a = 100, b = 1, c; c = a*b/2; подскажите, пожалуйста, почему компилятор выдает здесь ошибку? спасибо.

Конвертировать значение переменной типа int в шестнадцатеричную СС
как я могу программно конвертировать : 1.значение переменной типа int в 16чную систему 2.значение переменной типа string в 16чную...

Присвоить переменной типа int значение, введенное в TextBox
как, куда и как прописать ToString ?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru