C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Struct AND char *
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 ?

Вернуться в Вопросы программирования в C++Builder