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

Передача указателя структуры в функцию, ошибка на этапе выполнения

23.06.2013, 01:08. Показов 2483. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобратся в чем ошибка. Ошибка вылетает на этапе выполнения.
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
struct book
{
        char * name;
        char price[6];
        static unsigned int CELL;
};unsigned int book::CELL = 0;
void book_init (book *);
void main (void)
{
    book a;
    book * b = NULL;
    book_init (&a);
    cout << a.CELL << endl << a.name << endl << a.price << endl;
    cout << endl;
    book_init (b);   //ошибка тут
    cout << b->CELL << endl << b->name << endl << b->price << endl;
};
void book_init (book * tmp)
{
    if(tmp == NULL)
    {
        tmp = new book [1];
        tmp->CELL++;
        {
            char * temp = new char [128];
            tmp->name = new char [128];
            cin.getline(temp,128);
            strcpy(tmp->name, temp);
        }
        strcpy(tmp->price, "19.99");
    }
    else
    {
        tmp->CELL++;
        {
            char * temp = new char [128];
            tmp->name = new char [128];
            cin.getline(temp,128);
            strcpy(tmp->name, temp);
        }
        strcpy(tmp->price, "19.99");
    }
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.06.2013, 01:08
Ответы с готовыми решениями:

Структуры и функции. Передача указателя на структуру в функцию
Всем привет, ребята! Вообще ничего не соображаю сейчас, так как ночь. А кофе нету. Короче, ближе к делу. Хочу написать функцию, которая...

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

Ошибка "cannot convert 'struct1 *' to 'struct1 *' (передача указателя на массив структур в функцию)
Добрый вечер! Уважаемые специалисты, помогите, пожалуйста, исправить ошибку. Код следующий: #include &quot;stdio.h&quot; ...

22
31 / 31 / 4
Регистрация: 15.04.2011
Сообщений: 81
23.06.2013, 01:40
что за ошибка, что пишет программа при ее возникновении?

Добавлено через 3 минуты
C++
1
book_init (b);
ты тут в функцию передаешь указатель на NULL, внутри функции выделяешь для него память, но наружу измененный указатель не передается. то есть после выхода из функции b так же будет NULL

Добавлено через 3 минуты
тебе надо либо выделить память до вызова book_init()
C++
1
2
book * b =  = new book [1];;
book_init (b);
либо либо передавать в book_init указатель на указатель
C++
1
2
3
4
void book_init (book **);
...........
 
book_init (&b);
но в этом случае с передачей a придется повозиться
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 01:59  [ТС]

Сразу отладка.
Суть в том, что бы в функцию передавать массив из структур, и модифицировать его по ходу работы программы. А прога крошится при попытке считать из структуры инфу.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 02:06
@p-314, выделите память под массив структур в main, а дальше передавайте каждую отдельную структуру в функцию init по ссылке, и вообще используйте их вместо указателей везде, где это только возможно. Вот он и результат обучения плюсам после чистого С.

Добавлено через 1 минуту
Кстати, почему не использовать классы и агрегацию? Написать класс Books, в нем использовать массив книг и писать методы для работы с ним?
Каково полное ТЗ?
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 02:10  [ТС]
Вообще, по идее, ну, как я понимаю:
book * b = NULL; - мы создаем пустой указатель
.
.
.
book_init(b); - мы передаем пустой указатель на структуру в функцию, нутри которой, происходит создание и инициализация структуры. Поскольку передается указатель, не каких доп шаманств не нужно делать, так как мы передаем адрес ...

Добавлено через 1 минуту
Дык сам вою, классами проще, там конструкторы создал и все, проблем нет. Но нужо сделать СТРУКТУРАМИ, и все действия функциями.
Вариант создания массива в мейне не совсем подходит, зарание неизвестно сколько эл. массива будет. потому и нужно что бы добавление эл. выполняла функция.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 02:31
Цитата Сообщение от p-314 Посмотреть сообщение
там конструкторы создал и все, проблем нет. Но нужо сделать СТРУКТУРАМИ
единственное отличие структур от классов в С++ - модификаторы доступа по-умолчанию (внутри класса и при наследовании public заместо private). Всё!

Цитата Сообщение от p-314 Посмотреть сообщение
Вариант создания массива в мейне не совсем подходит, зарание неизвестно сколько эл. массива будет.
Так а для чего по вашему придумали динамические массивы?

Добавлено через 23 секунды
Это просто потому, что STL контейнеры наверняка нельзя
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 02:40  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
единственное отличие структур от классов в С++ - модификаторы доступа по-умолчанию (внутри класса и при наследовании public заместо private). Всё!


Так а для чего по вашему придумали динамические массивы?

Добавлено через 23 секунды
Это просто потому, что STL контейнеры наверняка нельзя
Я в курсе разници между классами и структурами, требования к работе только структуры и функции.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 02:46
@p-314, ну так методы являются функциями. Оформить что-то типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Books
{
    Books() : b(nullptr), N(0) {}
    Books(const size_t sz) : b(new book[sz]), N(sz) {}
    ~Books() { delete [] b; }
    void printAll() const {}
    ...
  protected:
    book *b;
    size_t N;
};
 
struct Book
{
    Book() {}
    Book(...) {}
    void init() {...}
    void print() const {...}
  protected:
    ...
};
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
23.06.2013, 02:50
Цитата Сообщение от p-314 Посмотреть сообщение
Я в курсе разници между классами и структурами, требования к работе только структуры
ну если в курсе то и пиши класс
только напиши в начале struct
т.е у структуры тоже может быть конструктор( а так же деструктор)
Цитата Сообщение от p-314 Посмотреть сообщение
void book_init (book * tmp)
{
* * if(tmp == NULL)
* * {
* * * * tmp = new book [1];
ну и куда денется tmp после вызова из функции?
потеряется вот и утечка памяти
ты хоть возвращай её
C++
1
2
3
4
5
book * book_init (book * tmp)
{
....
return tmp;
}
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 02:59  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, выделите память под массив структур в main, а дальше передавайте каждую отдельную структуру в функцию init по ссылке, и вообще используйте их вместо указателей везде, где это только возможно. Вот он и результат обучения плюсам после чистого С.

Добавлено через 1 минуту
Кстати, почему не использовать классы и агрегацию? Написать класс Books, в нем использовать массив книг и писать методы для работы с ним?
Каково полное ТЗ?
Пользуясь случаем, хочу спросить, какой смысл юзать ссылки!?
int a = 0;
int & a1 = a;
std::cout << a1;
ИМХО, ссылка не нужный промежуток кода. Но, готов выслушать иное мнение...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 03:01
@p-314, здесь (в предложенном вами коде) абсолютно никакого смысла и альтернативного вариант ответа не ждите. А здесь:
C++
1
2
3
4
5
6
class Obj
{
...
};
 
void foo(const Obj &) {}
имеет смысл для экономии памяти. А также если нам нужно изменить объект внутри функции.
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:03  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, ну так методы являются функциями. Оформить что-то типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Books
{
    Books() : b(nullptr), N(0) {}
    Books(const size_t sz) : b(new book[sz]), N(sz) {}
    ~Books() { delete [] b; }
    void printAll() const {}
    ...
  protected:
    book *b;
    size_t N;
};
 
struct Book
{
    Book() {}
    Book(...) {}
    void init() {...}
    void print() const {...}
  protected:
    ...
};


нельзя!
даже так нельзя:
struct book
{
public: // так нельзя
.
.
.
.
};
явное указание поля, в не закона )
все что можно, это:
struct [имя]
{
[поле 1]
[поле 2]
[поле n]
}
и функции, вне структуры, которые работаю с ее полями.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
23.06.2013, 03:05
Цитата Сообщение от p-314 Посмотреть сообщение
ИМХО, ссылка не нужный промежуток кода.
простейший пример перредача параметров в функцию/из функции
C++
1
2
3
4
5
6
void swap(int &a,int& b)
{
a^=b;
b^=a;
a^=b;
}
Добавлено через 1 минуту
Цитата Сообщение от p-314 Посмотреть сообщение
даже так нельзя:
struct book
{
public: // так нельзя
а и не надо
у структур по умолчанию все публик
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:09  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
простейший пример перредача параметров в функцию/из функции
C++
1
2
3
4
5
6
void swap(int &a,int& b)
{
a^=b;
b^=a;
a^=b;
}
Добавлено через 1 минуту

а и не надо
у структур по умолчанию все публик


Может я не правильно выразился, структура должна использоватся исключительно как связь нескольких переменных под одним именем. В нутри нее, кроме переменных ни чего не должно быть.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 03:10
С чего это методы и модификаторы доступа нельзя? Это ТЗ или ваши предрассудки? Ну допустим спихнем мы все в паблик, но чем подход с применением функций лучше подхода с применением методов, или же членов-функций? Чем они хуже? Тем, что к ООП ближе? Все эти сишные С++ меня добивают, потом ведь так и будут классы с пабликом и обрабатывать все извне.
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:15  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
С чего это методы и модификаторы доступа нельзя? Это ТЗ или ваши предрассудки? Ну допустим спихнем мы все в паблик, но чем подход с применением функций лучше подхода с применением методов, или же членов-функций? Чем они хуже? Тем, что к ООП ближе? Все эти сишные С++ меня добивают, потом ведь так и будут классы с пабликом и обрабатывать все извне.
Ну задача так поставлена, вот препода током ударило, и захотелось ему что бы без методов, одним словом ни какого ООП. Если чесно, я только за ООП, проще в реализации, и кода в перспективе меньше ... но, нельзя )
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 03:18
Непонятно, т.е. должна быть структура с динамическими полями, но не должно быть конструктора, деструктора и методов?

Добавлено через 1 минуту
Ничего, если я суть решения на С напишу, а то у меня даже рука не поднимается данный код g++ обрабатывать заместо gcc?
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:32  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Непонятно, т.е. должна быть структура с динамическими полями, но не должно быть конструктора, деструктора и методов?

Добавлено через 1 минуту
Ничего, если я суть решения на С напишу, а то у меня даже рука не поднимается данный код g++ обрабатывать заместо gcc?
В точку! Ни конструкторов, ни деструкторов, ни методов.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 03:52
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 05:28  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
Ты наверное знаком с моим преподом ))
Только динамическая память.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2013, 05:28
Помогаю со студенческими работами здесь

Ошибка на этапе выполнения быстрой сортировки
Ошибка а не пойму в чем,код здеясь:#include&lt;iostream&gt; using namespace std; void main(){ setlocale(LC_ALL, &quot;Ukrainian&quot;); ...

Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute
В приложении ASP.NET MVC у меня есть xml файл с маршрутами типа: &lt;route url=&quot;Home/{par1}/{par2}&quot; controller=&quot;Home&quot;...

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Ошибка на этапе выполнения при том, что программа выполняется до конца
Есть матрица с заданным кол-вом столбцов и строк, которую надо сдвинуть, на выбор, во все 4 направления и наискосок. Программа, в принципе,...

Передача указателя в функцию
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять, что мне делать. Есть вот такой код: ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru