Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11

Динамические массивы как вселенское зло

23.11.2013, 02:20. Показов 1270. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня задача - вывести повторяющиеся слова и количество повторений, вроде все должно работать, но куда там)
Мне кажется ошибка в работе с памятью динамических массивов(на это указывают ошибки, в которых скащано о несоотвествии считываемой и занятой памяти), но осознать что не так у меня не выходит. Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 int nst1,c=0,**c_mass;
 char **ws;
 AnsiString t1,t2;
 nst1 = ComboBox1->ItemIndex;
 String st1 = ComboBox1->Items->Strings[nst1];
 int len=st1.Length();
 if (len<=0) return;
 ws=new char*[len];
 int n;
 c_mass=new int*[n];
 len=n=0;
 int i=2,pos=1,k=0,check=0;
 if (st1[1]!=' ')i=1;
 for (i=1;i<=st1.Length();i++)
 {
  check++;
  k=0;
  pos=i;
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
        if (check%2!=0)
         {
          t1=st1.SubString(pos,k);
         }
          else
           {
            t2=st1.SubString(pos,k);
           }
            if (t1==t2)
             {
             c++;
             ws[len]=new char[len];
             c_mass[len]=new int[n];
             ws[len]=t1.c_str();
             c_mass[n]=&c;
             len++;
             n++;
             }
  }
 }
 for (i=0;i<=c;i++)
 {
  Memo1->Lines->Add(AnsiString(ws[i])+IntToStr(c_mass[i]));
 }
 delete []ws;
 delete []c_mass;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2013, 02:20
Ответы с готовыми решениями:

Как использовать динамические массивы?
При создании массива количество элементов приписывается заранее. Что делать, если в дальнейшем мне понадобится добавь ещё элементы? Читал...

Как сделать динамические массивы из статических
Здравствуйте, мне дали задание сгенерировать квадратную матрицу, на промежутке от а до b, и поменять местами первую строку и последний...

Как реализовать динамические массивы из Fortran?
Как можно сконвертировать этот код из Fortran в C++? Пробовал искать, но, к сожалению, попытки не увенчались успехом. Полагаю, плохо искал....

15
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 11:22
Зачем возиться с динамическими указателями на массивы char, если можно запоминать указатель на класс, где есть AnsiString и целое? Это какое-то требование или религия не позволяет?
0
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
23.11.2013, 19:36  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Зачем возиться с динамическими указателями на массивы char, если можно запоминать указатель на класс, где есть AnsiString и целое? Это какое-то требование или религия не позволяет?
Это незнание) Если не сложно, распиши подробнее.

Добавлено через 7 минут
если под классом вы имеете ввиду структуру(не кидайтесь тапками, в моем понимании класс - int char double и т.д.), то я пытался, но оказалось не так просто
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 21:03
Хорошо, пусть не класс. Структура, если так понятнее.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct
{
  AnsiString S;
  int I;
} TMyStruct;
 
// динамический массив структур
// описали в классе формы, например
class TForm1 : public TForm
{
  ...
  private:
    std::vector<TMyStruct> vArray;
  ...
};
 
// добавляем в коде функции новый элемент
TMyStruct Item;
Item.S = t1;
Item.I = c; // непонятно, зачем &c
vArray.push_back( Item );
1
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
23.11.2013, 21:13  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Хорошо, пусть не класс. Структура, если так понятнее.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct
{
  AnsiString S;
  int I;
} TMyStruct;
 
// динамический массив структур
// описали в классе формы, например
class TForm1 : public TForm
{
  ...
  private:
    std::vector<TMyStruct> vArray;
  ...
};
 
// добавляем в коде функции новый элемент
TMyStruct Item;
Item.S = t1;
Item.I = c; // непонятно, зачем &c
vArray.push_back( Item );
&c поставил ибо билдер орал о неприводимости типов int* и int
сейчас попробую, спасибо

Добавлено через 6 минут
что это значит?
C++
1
2
3
4
5
6
{
  ...
  private:
    std::vector<TMyStruct> vArray;
  ...
};
для меня основная проблемма сформировать массив значений структуры. по сути добавление структуры меняет только то, что массив теперь будет 1
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 21:29
Вектор - это динамический массив. Сколько раз сделаешь vArray.push_back, столько элементов нём и будет. И ничего не надо выделять или уничтожать.
C++
1
2
3
4
5
for ( i=0; i < vArray.size(); i++ )
 {
  TMyStruct Item = vArray[ i ];
  Memo1->Lines->Add( Item.S + IntToStr( Item.I ) );
 }
Так понятнее?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
23.11.2013, 21:33
Тогда уж сразу std::map...
0
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
23.11.2013, 21:51  [ТС]
Поставлю вопрос иначе:
Как к этому коду прикрутить занесение значений в массив
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
typedef struct
{
  AnsiString S;
  int I;
} OutInf; //структура, в которую нужно заносить значения
 int nst1,c=1;
 AnsiString t1,t2;
 nst1 = ComboBox1->ItemIndex;
 String st1 = ComboBox1->Items->Strings[nst1];
 int i=2,pos=1,k=0,check=0;
 if (st1[1]!=' ')i=1;
 for (i=1;i<=st1.Length();i++)
 {
  check++;
  k=0;
  pos=i;
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
        if (check%2!=0)
         {
          t1=st1.SubString(pos,k);
         }
          else
           {
            t2=st1.SubString(pos,k);
           }
            if (t1==t2)
             {
             c++;
             // тут нужно заносить значения в массив
             }
  }
 }
  for (i=0;i<=c;i++)
 {
  Memo1->Lines->Add(AnsiString(OutInf.S)+" "+IntToStr(OutInf(I)); // вывод "слово"+"кол-во повторений"
 }
Добавлено через 2 минуты
Цитата Сообщение от c0rvax Посмотреть сообщение
Вектор - это динамический массив. Сколько раз сделаешь vArray.push_back, столько элементов нём и будет. И ничего не надо выделять или уничтожать.
C++
1
2
3
4
5
for ( i=0; i < vArray.size(); i++ )
 {
  TMyStruct Item = vArray[ i ];
  Memo1->Lines->Add( Item.S + IntToStr( Item.I ) );
 }
Так понятнее?
проблема не вывести, проблема записать значения в этот массив. Ввиду того что я первокурсник с кое-какой методичкой я не знаю и половины синтаксиса =/

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
{
private:
    std::vector<OutInf> OutInfArr;
};
}
такую запись билдер ругает
[C++ Error] Unit1.cpp(20): E2188 Expression syntax
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 22:03
Пипец...
1) Открываешь form1.h [или как он там у тебя называется]
2) Там, где у тебя описан класс формы, вставляешь вектор [я же сказал выше куда добавить, почему ты тулишь это в конструктор?]
3) Там, где ты написал "тут нужно заносить значения в массив", вставляешь из моего примера код после комментария "добавляем в коде функции новый элемент"
4) Включаем соображалку, ибо становится скучновато...

Добавлено через 5 минут
Проблема не вывести, говоришь? Вот здесь
C++
1
2
3
4
for (i=0;i<=c;i++)
 {
  Memo1->Lines->Add(AnsiString(OutInf.S)+" "+IntToStr(OutInf(I)); // вывод "слово"+"кол-во повторений"
 }
полный бред написан. Что такое OutInf? Зачем одно и то же значение выводить несколько раз? Зачем AnsiString( OutInf.S )? Это и так AnsiString. Что такое OutInf(I)? Полная бредятина....
0
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
23.11.2013, 22:06  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Пипец...
1) Открываешь form1.h [или как он там у тебя называется]
2) Там, где у тебя описан класс формы, вставляешь вектор [я же сказал выше куда добавить, почему ты тулишь это в конструктор?]
3) Там, где ты написал "тут нужно заносить значения в массив", вставляешь из моего примера код после комментария "добавляем в коде функции новый элемент"
4) Включаем соображалку, ибо становится скучновато...

Добавлено через 5 минут
Проблема не вывести, говоришь? Вот здесь
C++
1
2
3
4
for (i=0;i<=c;i++)
 {
  Memo1->Lines->Add(AnsiString(OutInf.S)+" "+IntToStr(OutInf(I)); // вывод "слово"+"кол-во повторений"
 }
полный бред написан. Что такое OutInf? Зачем одно и то же значение выводить несколько раз? Зачем AnsiString( OutInf.S )? Это и так AnsiString. Что такое OutInf(I)? Полная бредятина....
OutInf- структура
OutInf(I) - не так написал, извини
вывожу одно и то же, т.к. это потом заменить нужно на массив этих самых значений(который я никак не могу сформировать), или я ради прикола цикл написал?
[я же сказал выше куда добавить, почему ты тулишь это в конструктор?]
C++
1
2
3
4
5
6
7
class TForm1 : public TForm
{
  ...
  private:
    std::vector<TMyStruct> vArray;
  ...
};
для меня не очевидно месторасположение этой штуки, вот и написал туда, где оно мне мешать не будет
когда впихал в *.h
[C++ Error] Unit1.h(36): E2316 'vector' is not a member of 'std'
[C++ Error] Unit1.h(36): E2040 Declaration terminated incorrectly
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 22:13
Чувствую, дело вообще стухнет, поэтому все описания в теле одной функции [т.е., доступа к вектору будет только внутри этой функции]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
typedef struct
{
  AnsiString S;
  int I;
} OutInf; //структура, в которую нужно заносить значения
std::vector<OutInf> vArray;
 int nst1,c=1;
 AnsiString t1,t2;
 nst1 = ComboBox1->ItemIndex;
 String st1 = ComboBox1->Items->Strings[nst1];
 int i=2,pos=1,k=0,check=0;
 if (st1[1]!=' ')i=1;
 for (i=1;i<=st1.Length();i++)
 {
  check++;
  k=0;
  pos=i;
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
        if (check%2!=0)
         {
          t1=st1.SubString(pos,k);
         }
          else
           {
            t2=st1.SubString(pos,k);
           }
            if (t1==t2)
             {
             c++;
             // тут нужно заносить значения в массив
             OutInf Item;
             Item.S = t1;
             Item.I = c;
             vArray.push_back( Item );
             }
  }
 }
  for (i=0;i<vArray.size();i++)
 {
  OutInf Item = vArray[ i ];
  Memo1->Lines->Add(Item.S + " " + IntToStr(Item.I); // вывод "слово"+"кол-во повторений"
 }
Добавлено через 1 минуту
Блин, и не забудь ради Бога
C++
1
#include <vector>
а то опять начнётся...
1
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
23.11.2013, 22:26  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Чувствую, дело вообще стухнет, поэтому все описания в теле одной функции [т.е., доступа к вектору будет только внутри этой функции]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
typedef struct
{
  AnsiString S;
  int I;
} OutInf; //структура, в которую нужно заносить значения
std::vector<OutInf> vArray;
 int nst1,c=1;
 AnsiString t1,t2;
 nst1 = ComboBox1->ItemIndex;
 String st1 = ComboBox1->Items->Strings[nst1];
 int i=2,pos=1,k=0,check=0;
 if (st1[1]!=' ')i=1;
 for (i=1;i<=st1.Length();i++)
 {
  check++;
  k=0;
  pos=i;
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
        if (check%2!=0)
         {
          t1=st1.SubString(pos,k);
         }
          else
           {
            t2=st1.SubString(pos,k);
           }
            if (t1==t2)
             {
             c++;
             // тут нужно заносить значения в массив
             OutInf Item;
             Item.S = t1;
             Item.I = c;
             vArray.push_back( Item );
             }
  }
 }
  for (i=0;i<vArray.size();i++)
 {
  OutInf Item = vArray[ i ];
  Memo1->Lines->Add(Item.S + " " + IntToStr(Item.I); // вывод "слово"+"кол-во повторений"
 }
Добавлено через 1 минуту
Блин, и не забудь ради Бога
C++
1
#include <vector>
а то опять начнётся...
спасибо, про существование #include <vector> я не знал даже)

Добавлено через 12 минут
C++
1
2
3
4
5
6
 typedef struct
{
  AnsiString S;
  int I;
} OutInf;
 std::vector<OutInf> OutInfArr;
обязательно глобально объявлять надо, судя по ругне компилятора)
Но выполнять свою функцию программа не стала =(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void __fastcall TForm1::ComboBox1Click(TObject *Sender)
{
 int nst1,c=1;
 AnsiString t1,t2,t3="Все слова в стоке одинаковы";
 nst1 = ComboBox1->ItemIndex;
 String st1 = ComboBox1->Items->Strings[nst1];
 int i=2,pos=1,k=0,check=0;
 if (st1[1]!=' ')i=1;
 for (i=1;i<=st1.Length();i++)
 {
  check++;
  k=0;
  pos=i;
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
        if (check%2!=0)
         {
          t1=st1.SubString(pos,k);
         }
          else
           {
            t2=st1.SubString(pos,k);
           }
         if (t1==t2)
         {
             c++;
             t3=t2;//исключение неправильной работы при всех одинаковых словах в стрке
         }
          else
          {   OutInf Item;
              Item.S = t3;
              Item.I = c;
              OutInfArr.push_back( Item );
          }
  }
 }
 for (i=0;i<=OutInfArr.size();i++)
 {
  OutInf Item = OutInfArr[ i ];
  Memo1->Lines->Add(Item.S + " " + IntToStr(Item.I));
 }
}
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 23:35
Проработай алгоритм. Реализуй его не сразу весь, а постепенно. Для начала, реализуй выделение всех слов из строки, без всякого анализа.
0
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
23.11.2013, 23:37  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Проработай алгоритм. Реализуй его не сразу весь, а постепенно. Для начала, реализуй выделение всех слов из строки, без всякого анализа.
вывод всех слов осуществляется если вот это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
        if (check%2!=0)
         {
          t1=st1.SubString(pos,k);
         }
          else
           {
            t2=st1.SubString(pos,k);
           }
         if (t1==t2)
         {
             c++;
             t3=t2;
         }
          else
          {   OutInf Item;
              Item.S = t3;
              Item.I = c;
              OutInfArr.push_back( Item );
          }
  }
 }
 for (i=0;i<=OutInfArr.size();i++)
 {
  OutInf Item = OutInfArr[ i ];
  Memo1->Lines->Add(Item.S + " " + IntToStr(Item.I));
 }
заменить на это
C++
1
2
3
4
5
6
7
8
9
10
11
  for (i;i<=st1.Length();1)
  {
  if (st1[i]==' ')break;
  i++;
  k++;
  }
  if(st1.SubString(pos,1)!=' ')
  {
          Memo1->Lines->Add(st1.SubString(pos,k));
  }
 }
0
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
23.11.2013, 23:43
Ну и зачем ты каждый раз добавляешь в массив очередное выделенное слово? Выделил слово, проверил, есть ли оно уже в массиве. Если есть, то просто увеличиваешь счётчик этого слова на 1, если нет, то добавляешь слово в массив, счётчик устанавливаешь в 1.
0
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 11
24.11.2013, 00:40  [ТС]
Цитата Сообщение от c0rvax Посмотреть сообщение
Ну и зачем ты каждый раз добавляешь в массив очередное выделенное слово? Выделил слово, проверил, есть ли оно уже в массиве. Если есть, то просто увеличиваешь счётчик этого слова на 1, если нет, то добавляешь слово в массив, счётчик устанавливаешь в 1.
попробую, уже устал перечитывать этот код(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.11.2013, 00:40
Помогаю со студенческими работами здесь

Как сделать динамические вложенные массивы?
Всем привет!!! Мне надо реализовать примерно такой код: ... for i:=0 to 4 do begin for j:=0 to 4 do 4 begin ...

Динамические массивы и функции. Динамические массивы.
Дана матрица 6х8 целого типа. Создать одномерный массив, содержащий элементы матрицы, кратные числу, введенному с клавиатуры.

Динамические массивы. Имя массива как указатель
Заданием с использованием динамических массивов, вводя размер массива с клавиатуры и используя имя массива как указатель, применить...

Динамические массивы. Имя массива как указатель
Написать программу, в соответствии с заданием с использованием динамических массивов, вводя размер массива с клавиатуры и используя имя...

Как лучше задавать многомерные динамические массивы?
Прошу прощения за глупые вопросы, ибо новичок, но всё же: как лучше задавать многомерные (возьмём конкретно сейчас двумерные) динамические...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru