Guest |
Отправлено: 12.05.2005, 01:09 |
|
Не зарегистрирован
|
Имеется следующая структура
CODE |
struct STUDENT
{
char *NameStudent;
int Estimates[5];
int NumberBook;
};
|
CODE |
void OpenFileData(STUDENT*C)
{
AnsiString Path=ExtractFileDir(ParamStr(0))+"\DataStudent.txt";
AnsiString s,sl="";
int n=0;
int m=0;
TStringList *L= new TStringList;
L->LoadFromFile(Path);
SizeStruct=L->Count;
for(int i=0;i<L->Count;i++)
{
s=L->operator [](i);
n=0;
m=0;
for(int j=1;j<s.Length();j++)
{
if(n==2)
{
if(s[j]!=(char)' ')
C[i].Estimates[m]=StrToInt(s[j]);
m++;
}
else
{
if(s[j]!='*')
sl+=s[j];
else
{
if(n==0)
C[i].NameStudent=sl.c_str();
if(n==1)
C[i].NumberBook=StrToInt(sl);
sl="";
n++;
}
}
}
}
delete L;
}
|
проинициализированная переменная С[i].NameStudent в нутрии функции OpenFileData() почему-то меняет свое значения , хотя явно новая пере инициализация не происходила, где глюк?
|
|
AVC |
Отправлено: 12.05.2005, 08:18 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
char *NameStudent;
Вы храните указатель на строку который является локальным для функции OpenFileData. Или явно выделяйте место и копируйте в него строку или используйте AnsiString NameStudent. |
|
Guest |
Отправлено: 12.05.2005, 17:45 |
|
Не зарегистрирован
|
Если переменную NameStudent объявить как AnsiString то при инициализации C[i].NameStudent=sl; когда i==1 происходит ошибка, связанная с адресацией. |
|
AVC |
Отправлено: 13.05.2005, 08:11 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
CODE |
struct STUDENT { AnsiString NameStudent; };
void __fastcall OpenFileData (STUDENT* C)
{
TStringList *L= new TStringList;
try {
for (int i=0; i < 10; i++) L->Add("Студент " + AnsiString(i+1));
// Опасность. L->Count гарантировано должно быть меньше размера students
AnsiString sl;
for (int i=0; i < L->Count; i++)
{ sl = L->Strings[i];
C[i].NameStudent = sl;
}
} // TStringList *L= new TStringList;
__finally { delete L; }
}
//---------------------------------------------------------------------------
void __fastcall TF_List::Button7Click(TObject *Sender)
{
STUDENT students[20]; // опасное место
OpenFileData (students);
AnsiString text = "";
for (int i=0; i < 10; i++) text += students[i].NameStudent + "\n";
ShowMessage(text);
}
|
И как вы думаете, что мне показывает ShowMessage ?
|
|