Поиск:

Ответ в темуСоздание новой темы Создание опроса
> char поле структуры и StringGrid, структура в StringGrid 
V
    Опции темы
wolver17
  Дата 30.3.2013, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



Помогите пожалуйста считать информацию со StringGrid в массив типа struct. Не могу понять как считывается тип char моего поля структуры...
Вот набросок кода:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
struct Sklad
{
  int kod_material;
  char Name[20];
  int count;
  char Name_ed[20];
};
Sklad *x,*y;
int n;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x=new Sklad[n];
y=new Sklad[n];
for(int i=0;i<n;i++)
    for(int j=0;j<2;j++)
    if (j==0)
    {
        x[i].kod_material=StrToFloatDef(Form1->StringGrid1->Cells[j][i],'*'); 
    }
    else
    {
        y[i].Name= ???  (Form1->StringGrid1->Cells[j][i]); //вот тут не получается записать в масив х или y  
    }
Form1->StringGrid2->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid2->RowCount = n;                   
StringGrid2->ColCount = 2;
}
//---------------------------------------------------------------------------

 

PM MAIL   Вверх
wolver17
Дата 31.3.2013, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



Всё, разобрался сам, методом тыка  smile 
Если кому надо, вот изменения:

Код

for(int i=1;i<=n;i++)
{
    x[i].kod_material=StrToFloatDef(Form1->StringGrid1->Cells[0][i],'*'); 
    strcpy(x[i].Name, (Form1->StringGrid1->Cells[1][i].c_str()));
    x[i].count=StrToFloatDef(Form1->StringGrid1->Cells[2][i],'*');
    strcpy(x[i].Name_ed, (Form1->StringGrid1->Cells[3][i].c_str()));
}

PM MAIL   Вверх
wolver17
Дата 31.3.2013, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



Возникла другая проблема, при записи в файл инфы с массива, критует Access Violance'ом, иногда записывая инфу в файл и крит в самом конце работы проги, при закрытии формы, а иногда вообще при попытки открытия файла.
Всё тем же методом тыка проверил где проблема (debug не выявил глюк), оказалось что проблема из-за этих 2-х строк
Код

strcpy(x[i].Name, (Form1->StringGrid1->Cells[1][i].c_str()));
...
strcpy(x[i].Name_ed, (Form1->StringGrid1->Cells[3][i].c_str()));


хоть они и записывают по дебагу инфу в массив, но и являются причиной крита(
Подскажите где проблема?

вот последняя версия кода:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <stdio.h>
#include <dos.h>
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
struct Sklad
{
  int kod_material;
  char Name[20];
  int count;
  char Name_ed[20];
};
Sklad *x,*y;
int n;
void ToFile();
void FromFile();
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x=new Sklad[n];
for(int i=1;i<=n;i++)
{
    x[i].kod_material=StrToFloatDef(Form1->StringGrid1->Cells[0][i],'*'); //çàïîëíÿåò ìàññèâ èç StringGrid, åñëè íå ââåëè ÷èñëî òî '*'
    strcpy(x[i].Name, (Form1->StringGrid1->Cells[1][i].c_str()));
    x[i].count=StrToFloatDef(Form1->StringGrid1->Cells[2][i],'*');
    strcpy(x[i].Name_ed, (Form1->StringGrid1->Cells[3][i].c_str()));
}
Form1->StringGrid1->Enabled=false;
ToFile();
FromFile();
delete []x;
}
//---------------------------------------------------------------------------
void ToFile()
{
FILE *file;
  if((file = fopen("1.txt", "w"))==NULL)
  {
  fprintf(stderr, "Cannot open input file.\n");
  sleep(5);
  exit(1);
  }
  int i=1;
  //while (scanf ("%d%s%d%s", (&x[i].kod_material), x[i].Name, &(x[i].count), &(x[i].Name_ed)) != EOF)
  for(i=1;i<=n;i++)
  {
    fprintf(file, "%d %s %d %s\n", x[i].kod_material, x[i].Name, x[i].count, x[i].Name_ed);
//    i++;
  }
  fclose(file);
}
//---------------------------------------------------------------------------
void FromFile()
{
/*while(fscanf(file, "%s%u%f", (&x[i].kod_material), x[i].Name, &(x[i].count), &(x[i].Name_ed)) != EOF)
  {
    printf("%s %u %.2f\n", x[i].kod_material, x[i].Name, x[i].count, x[i].Name_ed);
    i++;
  }
  fclose(file);*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->ColCount = 4;
StringGrid1->Cells[0][0] = "Êîä ìàòåðèàëà";
StringGrid1->Cells[1][0] = "Íàèìåíîâàíèå";
StringGrid1->Cells[2][0] = "Êîëè÷åñòâî â íàëè÷èè";
StringGrid1->Cells[3][0] = "Åäèíèöû èçìåðåíèÿ";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
n=StrToInt(Form1->Edit1->Text);
StringGrid1->RowCount = n+1;                   //óñòàíîâêà ðàçìåðîâ StringGrid1
StringGrid1->Height=24*(n+1)+15;               //äèíàìè÷åñêîå èçìåíåíèå ðàçìåðà StringGrid1
}
//---------------------------------------------------------------------------



PM MAIL   Вверх
wolver17
Дата 31.3.2013, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



В гугле нашёл что-то вроде этого для работы с c_str():

Код

char *c = new char[(Form1->StringGrid1->Cells[1][i].Length())+1];
strcpy(c, (Form1->StringGrid1->Cells[1][i].c_str()));


в результате в переменной с будет  содержаться то что мне надо, считанное с грида, но опять же вопрос ,как запихнуть мне это в мой массив?
если делать после этого вот так:
Код

strcpy(x[i].Name, c);

выдаст опять ту ошибку Access violance...

Help!
PM MAIL   Вверх
artsb
Дата 31.3.2013, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(wolver17 @  30.3.2013,  22:16 Найти цитируемый пост)
char Name[20];


Цитата(wolver17 @  31.3.2013,  00:16 Найти цитируемый пост)
strcpy(x[i].Name, (Form1->StringGrid1->Cells[1][i].c_str()));


Вы должны быть уверены, что Form1->StringGrid1->Cells[1][i] не содержит больше 19 символов, т.к. у вас буфер 20 символов, плюс ещё завершающий ноль.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
wolver17
Дата 31.3.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



Цитата(artsb @ 31.3.2013,  14:07)


Вы должны быть уверены, что Form1->StringGrid1->Cells[1][i] не содержит больше 19 символов, т.к. у вас буфер 20 символов, плюс ещё завершающий ноль.


всмысле? я ж ввожу слово в 5-6 символов, по дебагу оно всё прекрасно считывается.
PM MAIL   Вверх
ChihPih
Дата 31.3.2013, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: 1
Всего: 22



Цитата(wolver17 @  1.4.2013,  01:46 Найти цитируемый пост)
всмысле? я ж ввожу слово в 5-6 символов, по дебагу оно всё прекрасно считывается.

Имелось ввиду, что может быть переполнение буфера. Поэтому лучше использовать strncpy вместо strcpy.


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
wolver17
Дата 1.4.2013, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



нет, strncpy абсолютно не помогло исправить ошибку. 
по дебагу как передавало корректно данные в массив, так и передаёт с этой ф-цией тоже, но критует всё равно(((
PM MAIL   Вверх
artsb
Дата 1.4.2013, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(wolver17 @  31.3.2013,  01:39 Найти цитируемый пост)
x=new Sklad[n];
for(int i=1;i<=n;i++)
{
    x[i].kod_material

Вы выходите за пределы массива. Массив имеет индексы от 0 до (n-1), а в цикле i меняется от 1 до n.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
wolver17
Дата 13.4.2013, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



artsb, огромное спс, недоглядел, сбивши себя нумерацией строк стринггрида (1-я строка у мня заголовки, т.е. нумерацию начал не с 0 а с 1 - вот и в for влепил тоже с 1).
вопрос решён.
PM MAIL   Вверх
Avazart
Дата 15.4.2013, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Может проще было бы без структуры сразу из SG записывать в файл ?

Код

#include <memory>
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{  // Сохранить
std::auto_ptr<TStringList> SL(new TStringList);
 
for(int i=0;i<StringGrid1->RowCount;i++)
 {
  StringGrid1->Rows[i]->Delimiter=L';'; // Разделитель
  SL->Add(StringGrid1->Rows[i]->DelimitedText);
 }
SL->SaveToFile("1.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // Загрузить
std::auto_ptr<TStringList> SL(new TStringList);
 
SL->LoadFromFile("1.txt");
 
for(int i=0;i<SL->Count;i++)
 {
  StringGrid1->Rows[i]->Delimiter=L';';
  StringGrid1->Rows[i]->DelimitedText= SL->Strings[i];
 }
}
//---------------------------------------------------------------------------




Да и зачем использовать сишный стиль записи в файл  и возиться с сишным char* ?

Это сообщение отредактировал(а) Avazart - 15.4.2013, 00:48
PM MAIL   Вверх
wolver17
Дата 15.4.2013, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

Репутация: 1
Всего: 1



я помогал другу делать прогу, оценивать качество и целесообразность поставленного задания -  меня не интересовало, нужен был результат так как поставлен был вопрос, я это сделал, а с тем где немного сбился, мне помогли разобраться, чего пока от вас,  Avazart, я не заметил, ни в этом ни в другом топике.
эта тема решена и закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.