Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152

Проблема со структурой

25.04.2019, 20:34. Показов 2384. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После записи в поле структуры, это же поле структуры пустое

Вот код:

ion.h:
C++ (Qt)
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
using namespace std;
 
struct Ion_ret
{
    string ion;
    int size_ion;
};
class Ion
{
    public:
        Ion(char sim, string formula, int i);
        // Удалить
        string get_ion();
        //int size_list_ion();
    private:
        int index;
        //int size_list;
        string formula;
        list<string> listions;
        Ion_ret ion_return;
        char simvol;
        void get_list_ion();
        void write_ion_in_struct(string ion, int size_ion);
        //string array_ion[];
};
ion.cpp функция get_ion():
C++ (Qt)
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
string Ion::get_ion()
{
      get_list_ion();
      list<string>::iterator it;
      string ion;
      for (it = listions.begin(); it != listions.end(); it++)
      {
          ion = *it;
          int ion_size = ion.size();
          int index_in_ion = 0; // Индекс из иона
          bool a = false;
          for (int start = index; start < index + ion_size; start++) // Перебор символов из формулы
          {
              char simvol_in_ion = ion[index_in_ion];
              char simvol_in_formula = formula[start];
              if (simvol_in_formula != simvol_in_ion)
              {
                   a = true;
              }
              if (start == index + ion_size - 1 && a == false) // Все символы совпадают
              {
                   cout <<"Read: "<< ion_return.ion << endl; // Тут пусто даже если уже что то записывалось раньше
                    if (ion_return.ion.empty()) // Если пусто
                    {
                        //cout << "write_empty" << endl;
                        write_ion_in_struct(ion, ion_size);
                    }
                    else
                    {
                        //cout << "write_ion" << endl;
                        int size_ion_in_struct = ion_return.size_ion;
                        if (ion_size > size_ion_in_struct)
                        {
                            write_ion_in_struct(ion, ion_size);
                        }
                    }
              }
              index_in_ion++;
          }
      }
      return ion_return.ion;
}
void Ion::write_ion_in_struct(string ion, int size_ion)
{
    ion_return.ion = ion;
    ion_return.size_ion = size_ion;
    //cout << "write: " << ion_return.ion << endl;
}
После того как метод write_ion_in_struct записал значения в поля структуры, при чтении в методе get_ion выдает пустоту. Почему?

Уже была подобная проблема в С#, но как решал уже не помню.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2019, 20:34
Ответы с готовыми решениями:

Проблема с динамической структурой
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; struct Node { int num; char first; char final; int...

проблема со структурой и функциями
Задание: 1. Описать структуру с именем ZNAK, содержащую следующие поля: • фамилия, имя; • знак Зодиака; • день рождения (массив из...

Проблема со структурой (struct) при создании текстового файла
Здравствуйте! Столкнулся с проблемой при работе с созданным файлом. Создаю, записываю данные и вывожу. Но данные не записываются, не...

30
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
26.04.2019, 00:54  [ТС]
Студворк — интернет-сервис помощи студентам
А если все скину?

Добавлено через 10 минут
Я понял что вы имели в виду когда говорили что я выхожу из функции, не фига я не выхожу.
listions содержит как бы ионы начинающиеся на определенный символ в случае Cu(OH)2 это Cl, Cr Cu, а функция get_ion возвращает правильный ион из этих ионов и выводит его в консоль.

C++ (Qt)
1
2
Ion ion(simvol, formula, start);
cout << ion.get_ion() << endl;
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
26.04.2019, 00:59
Цитата Сообщение от Danil_2002 Посмотреть сообщение
А если все скину?
Давно пора, можно не все, а только то что нужно для теста функции, что бы скомпилировалось
0
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
26.04.2019, 01:06  [ТС]
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include "enumeration.h"
 
using namespace std;
 
string enter()
{
    string formula;
    cout << "Nicolas>";
    cin >> formula;
    return formula;
}
int main()
{
    Enumeration enumer;
    enumer.set_formula(enter());
    return 0;
}
enumeration.cpp:
C++ (Qt)
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
#include "enumeration.h"
 
using namespace std;
 
struct Skobka_struct
{
    int border[2]; // Начальный и конечный индекс скобки
    int koif; // Коэффицент скобки
};
 
void Enumeration::set_formula(string formul)
{
    formula = formul;
    seach();
}
void Enumeration::seach()
{
    for(int start = 0; start < formula.size(); start++)
    {
        char simvol = formula[start];
        //cout << simvol << endl;
        char s = seach_array_skobka(simvol);
        if (s != '0') // Значит скобка
        {
            Seach_skobka skobka_class(formula, s, start);
            int* pointer_array_info = skobka_class.get_skobka();
            int info_array[3];
            for (int start = 0; start < 3; start++)
            {
                info_array[start] = *(pointer_array_info + start);
                //cout << info_array[start] << endl;
            }
            Skobka_struct skobka_struct;
            skobka_struct.border[0] = info_array[0];
            skobka_struct.border[1] = info_array[1];
            skobka_struct.koif = info_array[2];
        }
        else if (isalpha(simvol) && isupper(simvol)) // Значит начало иона
        {
            Ion ion(simvol, formula, start);
            cout << ion.get_ion() << endl;
        }
        else {continue;}
    }
}
enumeration.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef ENUMERATION_H_INCLUDED
#define ENUMERATION_H_INCLUDED
#include<string>
#include <iostream>
#include <cctype>
#include "enumeration.h"
#include "seach_skobka.h"
#include "global_file.h"
#include "ion.h"
 
using namespace std;
 
class Enumeration
{
    public:
        void set_formula(string formul);
    private:
        string formula;
        void seach();
};
 
#endif // ENUMERATION_H_INCLUDED
seach_skobka.cpp:
C++ (Qt)
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
#include "seach_skobka.h"
//#include <cstdlib>
Seach_skobka::Seach_skobka(string formul, char t_type, int index)
{
    formula = formul;
    type = t_type;
    index_nach_skobka = index;
}
int* Seach_skobka::get_skobka()
{
    int* info = new int[3]; // 0 и 1 - нач и кон индексы 2 - это коэффицент скобок
    info[0] = index_nach_skobka;
    info[1] = seach_skobka_end(index_nach_skobka, type);
    info[2] = seach_koif(info[1], formula);
    return info;
}
int Seach_skobka::seach_skobka_end(int index, char type_skobka) // Ищет закрывающую скобку. Принимает тип скобки и индекс открывающей скобки
{
    int end_index; // Конечный индекс скобки
    char end_skobka; // Закрывающая скобка
    if (type_skobka == '(') { end_skobka = ')'; }
    if (type_skobka == '[') { end_skobka = ']'; }
    for(int start = index; start < formula.length(); start++)
    {
        char simvol = formula[start];
        if (simvol == end_skobka)
        {
            end_index = start;
            break;
        }
    }
    return end_index;
}
seach_skobka.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef SEACH_SKOBKA_H_INCLUDED
#define SEACH_SKOBKA_H_INCLUDED
#include <string>
#include <iostream>
#include <string>
#include "global_file.h"
 
using namespace std;
 
class Seach_skobka
{
    public:
        Seach_skobka(string formul, char t_type, int index);
        int* get_skobka();
    private:
        string formula;
        char type;
        int index_nach_skobka;
        int seach_skobka_end(int index, char type_skobka);
};
 
#endif // SEACH_SKOBKA_H_INCLUDED
ion.cpp:
C++ (Qt)
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
53
54
55
56
57
58
59
60
61
62
63
64
#include "ion.h"
 
Ion::Ion(char sim, string formul, int i)
{
    simvol = sim;
    formula = formul;
    index = i;
}
void Ion::get_list_ion()
{
    //list<string> listion;
    fstream list_ion_file;
    list_ion_file.open("C:\\Users\\bymi1\\OneDrive\\Рабочий стол\\Данил\\Разработка\\C++\\Nicolas-0.0.1\\ion_list.txt");
    string ion;
    while(getline(list_ion_file, ion))
    {
        if(ion[0] == simvol)
        {
            listions.push_back(ion);
        }
    }
}
string Ion::get_ion()
{
      get_list_ion();
      list<string>::iterator it;
      string ion;
      Ion_ret ion_return;
      for (it = listions.begin(); it != listions.end(); it++)
      {
          ion = *it;
          int ion_size = ion.size();
          int index_in_ion = 0; // Индекс из иона
          bool a = false;
          for (int start = index; start < index + ion_size; start++) // Перебор символов из формулы
          {
              char simvol_in_ion = ion[index_in_ion];
              char simvol_in_formula = formula[start];
              if (simvol_in_formula != simvol_in_ion)
              {
                   a = true;
              }
              if (start == index + ion_size - 1 && a == false) // Все символы совпадают
              {
                   cout <<"read1: "<< ion_return.ion << endl;
                    if (ion_return.ion.empty()) // Если пусто
                    {
                        cout << "ion: " << ion << endl;
                        ion_return.ion = ion;
                        ion_return.size_ion = ion_size;
                    }
                    cout <<"read2: "<< ion_return.ion << endl;
              }
              index_in_ion++;
          }
      }
      return ion_return.ion;
}
//void Ion::write_ion_in_struct(string ion, int size_ion)
//{
//    ion_return.ion = ion;
//    ion_return.size_ion = size_ion;
    //cout << "write: " << ion_return.ion << endl;
//}
ion.h:
C++ (Qt)
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
#ifndef ION_H_INCLUDED
#define ION_H_INCLUDED
#include <list>
#include <string>
#include <fstream>
#include <iostream>
#include <iterator>
 
using namespace std;
 
struct Ion_ret
{
    string ion;
    int size_ion;
};
class Ion
{
    public:
        Ion(char sim, string formula, int i);
        // Удалить
        string get_ion();
        //int size_list_ion();
    private:
        int index;
        //int size_list;
        string formula;
        list<string> listions;
        //Ion_ret ion_return;
        char simvol;
        void get_list_ion();
        void write_ion_in_struct(string ion, int size_ion);
        //string array_ion[];
};
 
#endif // ION_H_INCLUDED
global_file.cpp:
C++ (Qt)
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
#include "global_file.h"
 
using namespace std;
 
char seach_array_skobka(char simvol)
{
    char a = '0';
    char skobka_array[2] = {'(', '['};
    for (int start = 0; start < 2; start++)
    {
        char skobka_simvol = skobka_array[start];
        if(simvol == skobka_simvol)
        {
            a = simvol;
        }
    }
    return a;
}
int seach_koif(int end_index, string formula) // Читает коэффицент скобки или иона и возвращает этот коэффицент
{
    end_index++;
    string koif = "";
    for (int start = end_index; start < formula.length(); start++)
    {
        char simvol = formula[start];
        if ((!isdigit(simvol)) && start == end_index)
        {
            koif += '1';
            break;
        }
        else if (isdigit(simvol))
        {
            koif += simvol;
        }
        else
        {
            break;
        }
    }
    return atoi(koif.c_str());
}
global_file.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef GLOBAL_FILE_H_INCLUDED
#define GLOBAL_FILE_H_INCLUDED
#include <cstdlib>
#include <string>
#include <iostream>
 
using namespace std;
 
char seach_array_skobka(char simvol);
int seach_koif(int end_index, string formula);
 
#endif // GLOBAL_FILE_H_INCLUDED
Добавлено через 1 минуту
Записи в файле от куда читаем имеет вид:
Cu
OH
H
Cl
Na
H
т д
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
26.04.2019, 01:44
Danil_2002, Намудрил знатно. Итак, каждый раз в enumeration.cpp стр. 40-41 создается объект Ion и ищется совпадение, после чего объект разрушается, и так по кругу. Вопрос - чего ожидали вы?

Добавлено через 6 минут
И еще, вам ссылки знакомы?
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
26.04.2019, 10:17  [ТС]
Мои ожидания: gel_list_ion() находит совпадения по первому символу(Cu,Cl,Cr в моем случае), дальше get_ion() по символьно сравнивает символы из формулы и иона. После того, если у иона или атома все совпало он записывается в структуру.
Например полное совпадение у углерода (записываем return_ion.ion = "C", ion.return.ion_size = "1"), далее все совпало у Cu
мы извлекаем данные из ion.return.ion_size и сравниваем(ага, значит у Cu больше совпадений, значит помещаем в структуру его) и т.д. в конце возвращается return_ion.ion_size.

Добавлено через 54 секунды
но как вы видели я не могу сравнить так как структура каждый раз пустая
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
26.04.2019, 10:45
Лучший ответ Сообщение было отмечено Danil_2002 как решение

Решение

Danil_2002, попробуйте сделать переменную статической
C++
1
static Ion_ret ion_return;
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
26.04.2019, 11:29  [ТС]
Да, работает) Но почему без static не работает я все равно не понял. Спасибо
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
26.04.2019, 11:45
Danil_2002, не знаю, что у вас там работает, но задачку вы взялись решать не тривиальную, я бы сказал даже неподъемную для новичка. Одно дело распарсить на хим. элементы, другое на ионы - тут одними сравнениями не обойтись, даже если отбросить органику, то ионизацией целые разделы химии и физики занимаются. Просто подумайте, как ваш код разберет на ионы простейшую молекулу воды при обычных условиях (я уж не говорю про газовые разряды и высокотемпературную плазму)
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
26.04.2019, 11:58  [ТС]
У меня уже пытался написать такую программу на C#, поэтому опыт небольшой есть, к тому же увлекаюсь химией. Поэтому работая над этой программой я попутно изучаю и химию и C++ даже если ничего не получится даром это не пропадет)
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
26.04.2019, 12:01
Цитата Сообщение от Danil_2002 Посмотреть сообщение
ion.h:
Где все #include в представленном вами исходнике?

Без них не будет успешной компиляции.
Без компиляции код нельзя ни запустить,
ни отладить.

Можно только погадать на кофейной гуще,
и поиграть в "тест на внимательность".

Что и происходит сейчас в вашей теме.
0
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
26.04.2019, 12:23  [ТС]
eva2326, там все есть, посмотрите повнимательнее, потому что бы если бы не было, код не работал бы, а я уже все переделал и скомпилировал. Все работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2019, 12:23

После окончания работы со структурой, она будет почищена сборщиком. Что произойдет со структурой в неуправляемой памяти
Доброго времени суток. Прочитал закрепленный топик &quot;Класс Marshal, использование PInvoke, небезопасный код (unsafe)&quot;. Возник...

со структурой
Помогите разобраться, почему функция не считает средний балл учеников (функция float SrSum()). Инфу программа считывает с файла: Yagnukov...

Программа со структурой do while
Покупатель должен заплатить в кассу S рублей. У него имеются купюры достоинством 10,50,100,500,1000 и 5000р. Определить, сколько купюр...

Работа со структурой
Описать структуру с именем TRAIN, содержащую следующие поля: - название пункта назначения; - номер поезда; - время отправления. ...

программа со структурой
Имеется файл, состоящий из отдельных строк структуры. Нужно написать сортировку по выбираемому пользователем полю В файле 5 полей: ...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru