Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6301
Последний выпуск: 19.06.2015

Переписываются значения массива / Почему?

41K
06 апреля 2009 года
Niaka
11 / / 03.02.2009
Написал тест, но столкнулся с тем, что переписывается массив, и значения из одного массива непонятным образом попадают в другой, интересует почему, и как это исправить
--------------------------------------------------------------
массив 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[];

------------------------------------------------------------------------

сижу третий день а так ничего и не придумал, проблему не выявил
479
07 апреля 2009 года
Ухух
142 / / 05.05.2006
а массив задекларировать как [6][1] не пробовали - там в цикле по моему получается что мы в него лезем с индексом 5 , а у него всего 4 максимальный.
41K
07 апреля 2009 года
Niaka
11 / / 03.02.2009
Цитата: Ухух
а массив задекларировать как [6][1] не пробовали - там в цикле по моему получается что мы в него лезем с индексом 5 , а у него всего 4 максимальный.



не , всё равно то же самое получается

массив переписывается

14K
08 апреля 2009 года
viva
27 / / 07.04.2006
[QUOTE=Niaka]массив int Examples[5][1]; должен содержать значения:
...
Memo1->Lines->Strings[it+1] = IntToStr(Examples[it][0]) + " * " + IntToStr(Examples[it][1])
[/QUOTE]
В данном случае массив должен быть int Examples[5][2];
41K
08 апреля 2009 года
Niaka
11 / / 03.02.2009
Цитата: viva
В данном случае массив должен быть int Examples[5][2];



Спасибо помогло

Можно скинуть в эту тему ссылки почему так получается, Это имеет отношение к переполнению буфера - или тут я ошибаюсь?

14
09 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Niaka
Спасибо помогло

Можно скинуть в эту тему ссылки почему так получается, Это имеет отношение к переполнению буфера - или тут я ошибаюсь?


Потому что размерность массива [1] в общем-то не имеет смысла. (Разве что для структур с членами переменной длины, но даже и не пытайтесь пока понять что это такое.) А так char a[1] и char a - по сути, одно и то же. То же и со вторыми индексами.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог