Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195

Как добавить дополнительный член в структуру?

28.07.2015, 04:33. Показов 1205. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте в wxDev C++ версия 7.3.1.3
Есть программа в ней структура из 4 элементов(членов), в один элемент созданной структуры присваевается значение функции с указателем в качестве параметра функции, в этой функции вычисляется другая функция её значение передается через указатель наружу. программа компилируеться, запускается все Ок, НО если добавить 5 элемент(член) в структуру, потом скомпилировать, то в момент когда выполняется функция, в которой параметр указатель, программа вываливаеться в ошибку виндовс, обнаружена ошибка Виндовс , отправить сообщение об ошибке.
Если в данной программе убрать вообще указатель то с 5 элементами(членами) программа нормально выполняется.

Увы тестировать/отлаживать софт в данной среде компиляции не умею и вообще не умею. Все же проблема в некорректном коде или в винде (ХР SP3) или компилятор?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.07.2015, 04:33
Ответы с готовыми решениями:

Как Добавить Дополнительный Реквизит Справочника?
Здравствуйте! Хочу в справочник добавить реквизит не через конфигурацию, а в пользовательском режиме. Подскажите, пожалуйста, как это...

Как добавить дополнительный компонент на Frame?
Всем привет. Помогите разобраться как добавить дополнительную анимированную фигуру на панель. Добавлять дополнительный метод отрисовки...

Borland C++ Builder 6: как добавить дополнительный h - файл к проекту?
Доброго времени суток! Сегодня впервые сел за Borland C++ Builder 6 и не могу понять, где в нем можно добавить заголовочный h - файл....

16
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
28.07.2015, 18:47
а код покажешь? не терпится насладиться кодом программы в которой структура в один элемент которой присваивается значение и т.д. ;-)
0
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
29.07.2015, 01:38  [ТС]
выполняеться с ошибкой. если убрать short int z без ошибки
C++
1
2
3
4
5
6
7
8
9
struct data 
    {
      
      short int yar;
      short int month;
      short int day;
      bool dx;
      short int z;
    };
выполняется без проблем даже если у переменной z тип bool но не int или short int
C++
1
2
3
4
5
6
7
8
9
struct data 
    {
      
      short int yar;
      short int month;
      short int day;
      bool dx;
      char z;
    };
Добавлено через 11 минут
Структура с суммой в 9 байт вызывает ошибку, если сумма 8 байт ошибки нет.
Выходит что структура в программе с 7 байтами и 8 байтами работает без ошибки, с 9 байтами и выше не хочет работать.

Можете доказать или опровергнуть?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.07.2015, 01:44
Цитата Сообщение от kuza84 Посмотреть сообщение
Можете доказать или опровергнуть?
Код покажи, который ошибку вызывает.

Добавлено через 1 минуту
Цитата Сообщение от kuza84 Посмотреть сообщение
Выходит что структура в программе с 7 байтами и 8 байтами работает без ошибки, с 9 байтами не хочет работать.
Есть ещё выравнивание, сделай sizeof(data) в одном и другом случае.
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
29.07.2015, 11:58
Ты покажи код этих функций "с указателем в качестве параметра функции, в этой функции вычисляется другая функция" и т.д.
0
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
29.07.2015, 15:07  [ТС]
В итоге оптимизировал код, смысл в указателе отпал, возможно неправильно работал с указателем, проблем с кодом не наблюдается пока.

Можете пояснить, указатель всегда имеет размер 4 байта?

Добавлено через 1 минуту
Цитата Сообщение от Praktolock Посмотреть сообщение
Ты покажи код этих функций "с указателем в качестве параметра функции, в этой функции вычисляется другая функция" и т.д.
позже, когда буду с указателем работать, опыта мало.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.07.2015, 16:15
Цитата Сообщение от kuza84 Посмотреть сообщение
Можете пояснить, указатель всегда имеет размер 4 байта?
На 32-битной платформе, да.
1
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
29.07.2015, 20:34  [ТС]
Передавал указатель по прототипу в функцию, на которой программа вылетала
C++
1
short int Day_f(short int (*poin), short int mon, bool li);
объявлял
C++
1
2
short int dm, dn; 
short int *p;
в функции присваивал
C++
1
2
3
4
5
....
short int day, ddm;   
....
*poin=ddm;  
.....
снаружи забирал из указателя
C++
1
 dm=*p;
Вот мне интересно, в сегменте данных сначала выделили память для переменных dm и dn, а потом ячейка, на которую ссылается указатель и сама ячейка памяти указателя, потом я объявлял структуру, правильно получается?
Поясните как выделяется память самого указателя и куда он ссылается в сегменте данных программы.

В структуре №1(с ошибкой) значение в указателе 0 сразу после объявления указателя, в структуре №2(рабочая) значение в указателе 0х7ffd000 и не меняется даже после выполнения функции.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.07.2015, 20:57
Цитата Сообщение от kuza84 Посмотреть сообщение
Вот мне интересно, в сегменте данных сначала выделили память для переменных dm и dn, а потом ячейка, на которую ссылается указатель и сама ячейка памяти указателя, потом я объявлял структуру, правильно получается?
Поясните как выделяется память самого указателя и куда он ссылается в сегменте данных программы.
Ты С++ с ассемблером не попутал?
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
29.07.2015, 21:27
Цитата Сообщение от kuza84 Посмотреть сообщение
short int (*poin)
Скобки можно убрать, если работаете с указателем на переменную.
Цитата Сообщение от kuza84 Посмотреть сообщение
В структуре №1(с ошибкой) значение в указателе 0 сразу после объявления указателя, в структуре №2(рабочая) значение в указателе 0х7ffd000 и не меняется даже после выполнения функции.
Пустой указатель обычно инициализирует нулем, если это не делается - он может указывать куда угодно.
Не совсем понятно, что вы хотите ? Если вы хотите изменить адрес на который указывает указатель в функции вы должны передавать либо ссылку на указатель либо адрес самого указателя. Если вы хотите менять просто значение по адресу то ваш код должен работать.
1
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
29.07.2015, 22:33  [ТС]
Цитата Сообщение от smartpointer Посмотреть сообщение
Пустой указатель обычно инициализирует нулем, если это не делается - он может указывать куда угодно.
Видимо когда была такая ситуация с кодом №1 программа висла т.к. указатель указывал неизвестно куда, т.е. некуда было передавать значение, но компилятор не ругался на это вообще.

добавил в код
C++
1
2
3
4
5
6
short int dm, dn, m; 
short int *p;
p=&m;
.......
//dm=*p;
dm=m;
проблема ушла.

Добавлено через 11 минут
Цитата Сообщение от lss Посмотреть сообщение
Ты С++ с ассемблером не попутал?
одно другому не мешает

Добавлено через 9 минут
---------------------------------------------
Возник вопрос, если в коде не указывать явно, куда указывает указатель, а скомпилированная программа сама находит куда указывать указателю, то проблема в компиляторе WxDev C++?
Т.е. код работает когда объявлен указатель, но когда добавил переменную в структуру (в моем примере) код стал ошибочным.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
29.07.2015, 23:07
Цитата Сообщение от kuza84 Посмотреть сообщение
а скомпилированная программа сама находит куда указывать указателю
Вы серьезно ? Куда указывать указателю определят только программист, указатели с искуственным интеллектом еще не придуманы, стдшные смартпоинтеры не в счет, ибо придуманы для слабаков , настоящие хардкорные программисты используют чистые указатели не обрачивая их в ООП. Работа с памятью эта работа программиста !
0
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
29.07.2015, 23:26  [ТС]
Цитата Сообщение от smartpointer Посмотреть сообщение
Вы серьезно ?
так я хотел выяснить, но путем тыканья как-то работало то, что не должно было бы работать. я передавал в указатель значение в никуда, но в одном случае программа работала.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.07.2015, 23:33
Цитата Сообщение от kuza84 Посмотреть сообщение
так я хотел выяснить, но путем тыканья как-то работало то, что не должно было бы работать. я передавал в указатель значение в никуда, но в одном случае программа работала.
Разыменование неинициализированного указателя - это UB.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
29.07.2015, 23:43
Цитата Сообщение от kuza84 Посмотреть сообщение
так я хотел выяснить, но путем тыканья как-то работало то, что не должно было бы работать. я передавал в указатель значение в никуда, но в одном случае программа работала.
Указатель обязан содержать валидный адрес - в этом случае его можно разыменовывать, то есть он либо содержит адрес какой-то переменной либо адрес первого байта выделенного в куче. Другого не дано - поэтому его всегда инициализируют нулем, если он никуда не указывает. И проводят проверки типа
C++
1
2
if(!ptr)
//никуда не указывает, разыменование запрещено
в противном случае получаете крэш программы. Исключением может быть только, если вы в функцию передаете ссылку на указатель либо адрес указателя и выделяете память в куче, либо инициализируете адресом нелокальной переменной.
1
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
30.07.2015, 01:03  [ТС]
Цитата Сообщение от smartpointer Посмотреть сообщение
либо адрес первого байта выделенного в куче.
Вот это интересно.

В моем случае указатель получал адрес из этой кучи, так получается, но когда я добавил переменную типа больше чем 1 байт в структуру, выделения адреса для указателя не произошло и крах программы пришел. Я был уставший тыкал в код, вот и дотыкался.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
30.07.2015, 02:49
Вот вам пример указателей в функции.
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
void test1(int* ptr)
{
    ptr = new int(rand()%6);
    std::cout<<"Функция test1, адрес на который указывает ptr: "<< ptr <<std::endl;//утечка, адрес не сохранится после работы функции!
}
 
void test2(int*& ptr)
{
    ptr = new int(rand()%6);
}
 
void test3(int** ptr)
{
    *ptr = new int(rand()%6);
}
 
 
int main()
{
    setlocale(LC_ALL,".1251");
    srand(time(0));
    int* ptr;//неинициализированный указатель
    std::cout<<"Адрес на который указывает ptr: "<< ptr <<std::endl;
    test1(ptr);
    std::cout<<"Адрес после работы функции test1: "<< ptr <<std::endl;
    //std::cout<< *ptr << std::endl;//если раскоментируем получим сегфолт
    //delete ptr;//тоже самое
 
    test2(ptr);
    std::cout<<"Адрес после работы функции test2: "<< ptr <<std::endl;
    std::cout<<"Значение по адресу после работы функции test2: " << *ptr <<std::endl;//это сработает т.к передавали указатель по ссылке
    delete ptr;//и это тоже
 
    test3(&ptr);
    std::cout<<"Адрес после работы функции test3: "<< ptr <<std::endl;
    std::cout<<"Значение по адресу после работы функции test2: "<< *ptr <<std::endl;//это сработает т.к передавали адрес указателя
    delete ptr;//и это тоже
 
    return 0;
}

В общем, что вам нужно запомнить, если передаете указатель на переменную типа int* в функцию - то можете изменять только значение записанное по этому адресу и то только в том случае, если указатель был проинициализирован, если нужно изменять адрес или значение то нужно передавать так int*& или так int**.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2015, 02:49
Помогаю со студенческими работами здесь

Как добавить один дополнительный элемент-заголовок в RecyclerView?
Как можно добавить первым (нулевым) элементом особенный, отличающийся от остальных элемент-шапку в список RecyclerView? Список...

Как правильно добавить дополнительный текст и выполнить команды в комбобоксе
Здравствуйте кто поможет? :) как выполнить строку в combobox пример в комбобоксе есть строки control regedit dxdiag так все...

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

Как добавить свою структуру?
Делаю приложение в Windows Form. Как и где можно объявить свои структуры и функции для работы с ними? Смогу ли я работать с ними также как...

Как добавить текстовые поля в структуру
Нужно добавить 2 поля и вывести их в дальнейшем, и считать транспорт и название страны я вроде-как добавил,но у меня вылетает не...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru