Переписываются значения массива / Почему?
--------------------------------------------------------------
массив int Examples[5][1]; должен содержать значения:
3,2
8,1
8,5
6,8
7,2
но после выполнения цикла:
for (it = 0;it<=5;it++)
{
Memo1->Lines->Strings[it+1] = IntToStr(Examples[it][0]) + " * " + IntToStr(Examples[it][1]) + " = " + IntToStr(Answers[it]);
Memo1->Lines->Strings[it+2] = "Examples[" + IntToStr(it) + "][" + 0 + "]" + " Examples[" + IntToStr(it)+ "][" + 1 + "]";
}
получаются значения:
3 , 8
8 , 8
8 , 6
6 , 7
7 , 1
----------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#pragma hdrstop
#include <time.h>
#include <string.h> // подключает возможность работы со строками //
#include <stdlib.h> // предпологается что с этой библиотекой используется функция atoi //
#include "File1.h" // подключение глобальных переменных для всех форм //
#include "Unit1.h"
#include "Unit2.h"
#include "Unit4.h" // форма ответов //
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
int a = 0, b =0, c = 0;
int in = 0, it = 0;
AnsiString TempText; // применяю как строку в связке с фукцией atoi(); //
char *stringn; // объявление строки, тоесть массива char, для работы с функцией atof //
Examples[5][1]={0,0}; // масив примеров //
Answers[] = {0}; // Правильные ответы масив //
User[] = {0}; // ответы пользователя //
int Estimation = 0; // Оценка //
//int Answers[];
//int User[];
//int Examples[][1];
int check [][1] = {0,0};
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
// Печать масива //
for(int i = 0; i <=5; i++)
Memo1->Lines->Strings[i+10] = IntToStr(Examples[0]) + " , " + IntToStr(Examples[1]) + " | Examples [" + IntToStr(i) + "] [" + 0 + "]" + " Examples[" + IntToStr(i)+ "][" + 1 + "]";
m:
// srand( time( NULL ) ); // Задание случайных значений для примера //
rand();
a = 1 + rand() % 9;
b = 1 + rand() % 9;
// проверка на повтор знчений //
check [0][0] = a;
check [0][1] = b;
for(int i = 0 , j = 0; i<=5; i++)
{
if (Examples[0] == check [0][0]&& Examples[1] == check [0][1])
{
if(Examples[0] == 0 && Examples[1] == 0) // Ограничние на случайность //
goto m;
} // прыжок на m: выбор новых чисел для примера //
}
Examples[in][0] = check [0][0]; // Запоминание примеров в масив ответов //
Examples[in][1] = check [0][1];
//- от сюда начинатся ошибка //
//----------------------------------------------------------------------//
Label1 -> Caption = IntToStr(a) + " * " + IntToStr(b) + " = "; // запись картинки //
Label2 -> Caption = IntToStr(Examples[in][0]) + " * " + IntToStr(Examples[in][1]) + " = "; // запись масива, должна быть такой же как и запись картинки //
//------ Блок запоминания Ответов --------------- //
c = a*b;
Answers[in] = c; // Правильные ответы, этот масив вносит ошибку //
stringn = MaskEdit1->Text.c_str(); // делает из строки Ансистринг объект типа чар //
User[in] = atoi(stringn);
if( User[in] == c) // определение правильного ответа //
Estimation++;
// Answers[in] = 0; // - тут ощибка заканчивается //
//вывод в Тмемо //
//Form4->Show();
//for (it = 0;it<=5;it++)
{
Memo1->Lines->Strings[in +1] = IntToStr(Examples[in][0]) + " * " + IntToStr(Examples[in][1]) + " = " + IntToStr(Answers[in]);
Memo1->Lines->Strings[in+2] = "Examples[" + IntToStr(in) + "][" + 0 + "]" + " Examples[" + IntToStr(in)+ "][" + 1 + "]";
Memo1->Lines->Strings[in+3] = "in = " + IntToStr(in) ;
}
Label3 -> Caption = IntToStr(Examples[in][0]) + " * " + IntToStr(Examples[in][1]) + " = "; // запись масива, должна быть такой же как и запись картинки //
in++; // прибавить строку в масивы: Ответы, пользователь, примеры //
if (in == 6) // открытие формы ответов //
{
//Form2->Hide();
for (it = 0;it<=5;it++)
{
Memo1->Lines->Strings[it+1] = IntToStr(Examples[it][0]) + " * " + IntToStr(Examples[it][1]) + " = " + IntToStr(Answers[it]);
Memo1->Lines->Strings[it+2] = "Examples[" + IntToStr(it) + "][" + 0 + "]" + " Examples[" + IntToStr(it)+ "][" + 1 + "]";
}
// Печать масива //
for(int i = 0; i <=5; i++)
Memo1->Lines->Strings[i+10] = IntToStr(Examples[0]) + " , " + IntToStr(Examples[1]);
Form4->ShowModal();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormActivate(TObject *Sender)
{
//Form1->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
// Обнуление массива //
for (int i = 0; i<=10; i++)
{
Examples[0]=0;
Examples[1]=0;
}
}
//---------------------------------------------------------------------------
Хидер
extern int Examples[5][1];
extern int Estimation;
extern int Answers[];
extern int User[];
------------------------------------------------------------------------
сижу третий день а так ничего и не придумал, проблему не выявил
а массив задекларировать как [6][1] не пробовали - там в цикле по моему получается что мы в него лезем с индексом 5 , а у него всего 4 максимальный.
Цитата: Ухух
а массив задекларировать как [6][1] не пробовали - там в цикле по моему получается что мы в него лезем с индексом 5 , а у него всего 4 максимальный.
не , всё равно то же самое получается
массив переписывается
...
Memo1->Lines->Strings[it+1] = IntToStr(Examples[it][0]) + " * " + IntToStr(Examples[it][1])
[/QUOTE]
В данном случае массив должен быть int Examples[5][2];
Цитата: viva
В данном случае массив должен быть int Examples[5][2];
Спасибо помогло
Можно скинуть в эту тему ссылки почему так получается, Это имеет отношение к переполнению буфера - или тут я ошибаюсь?
Цитата: Niaka
Спасибо помогло
Можно скинуть в эту тему ссылки почему так получается, Это имеет отношение к переполнению буфера - или тут я ошибаюсь?
Можно скинуть в эту тему ссылки почему так получается, Это имеет отношение к переполнению буфера - или тут я ошибаюсь?
Потому что размерность массива [1] в общем-то не имеет смысла. (Разве что для структур с членами переменной длины, но даже и не пытайтесь пока понять что это такое.) А так char a[1] и char a - по сути, одно и то же. То же и со вторыми индексами.