Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 01:08     передача указателя структуры в функцию, ощибка на этапе выполнения #1
Помогите разобратся в чем ошибка. Ошибка вылетает на этапе выполнения.
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");
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 01:08     передача указателя структуры в функцию, ощибка на этапе выполнения
Посмотрите здесь:

Передача указателя на метод в функцию C++
C++ Передача указателя на функцию
Передача указателя в функцию C++
Передача в функцию указателя C++
C++ Передача указателя в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ksandro
31 / 31 / 1
Регистрация: 15.04.2011
Сообщений: 81
23.06.2013, 01:40     передача указателя структуры в функцию, ощибка на этапе выполнения #2
что за ошибка, что пишет программа при ее возникновении?

Добавлено через 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 придется повозиться
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 01:59  [ТС]     передача указателя структуры в функцию, ощибка на этапе выполнения #3
передача указателя структуры в функцию, ощибка на этапе выполнения
Сразу отладка.
Суть в том, что бы в функцию передавать массив из структур, и модифицировать его по ходу работы программы. А прога крошится при попытке считать из структуры инфу.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.06.2013, 02:06     передача указателя структуры в функцию, ощибка на этапе выполнения #4
@p-314, выделите память под массив структур в main, а дальше передавайте каждую отдельную структуру в функцию init по ссылке, и вообще используйте их вместо указателей везде, где это только возможно. Вот он и результат обучения плюсам после чистого С.

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

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

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

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


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

Добавлено через 23 секунды
Это просто потому, что STL контейнеры наверняка нельзя
Я в курсе разници между классами и структурами, требования к работе только структуры и функции.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.06.2013, 02:46     передача указателя структуры в функцию, ощибка на этапе выполнения #8
@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:
    ...
};
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
23.06.2013, 02:50     передача указателя структуры в функцию, ощибка на этапе выполнения #9
Цитата Сообщение от 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;
}
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 02:59  [ТС]     передача указателя структуры в функцию, ощибка на этапе выполнения #10
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, выделите память под массив структур в main, а дальше передавайте каждую отдельную структуру в функцию init по ссылке, и вообще используйте их вместо указателей везде, где это только возможно. Вот он и результат обучения плюсам после чистого С.

Добавлено через 1 минуту
Кстати, почему не использовать классы и агрегацию? Написать класс Books, в нем использовать массив книг и писать методы для работы с ним?
Каково полное ТЗ?
Пользуясь случаем, хочу спросить, какой смысл юзать ссылки!?
int a = 0;
int & a1 = a;
std::cout << a1;
ИМХО, ссылка не нужный промежуток кода. Но, готов выслушать иное мнение...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.06.2013, 03:01     передача указателя структуры в функцию, ощибка на этапе выполнения #11
@p-314, здесь (в предложенном вами коде) абсолютно никакого смысла и альтернативного вариант ответа не ждите. А здесь:
C++
1
2
3
4
5
6
class Obj
{
...
};
 
void foo(const Obj &) {}
имеет смысл для экономии памяти. А также если нам нужно изменить объект внутри функции.
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:03  [ТС]     передача указателя структуры в функцию, ощибка на этапе выполнения #12
Цитата Сообщение от 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]
}
и функции, вне структуры, которые работаю с ее полями.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
23.06.2013, 03:05     передача указателя структуры в функцию, ощибка на этапе выполнения #13
Цитата Сообщение от 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: // так нельзя
а и не надо
у структур по умолчанию все публик
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:09  [ТС]     передача указателя структуры в функцию, ощибка на этапе выполнения #14
Цитата Сообщение от ValeryS Посмотреть сообщение
простейший пример перредача параметров в функцию/из функции
C++
1
2
3
4
5
6
void swap(int &a,int& b)
{
a^=b;
b^=a;
a^=b;
}
Добавлено через 1 минуту

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


Может я не правильно выразился, структура должна использоватся исключительно как связь нескольких переменных под одним именем. В нутри нее, кроме переменных ни чего не должно быть.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.06.2013, 03:10     передача указателя структуры в функцию, ощибка на этапе выполнения #15
С чего это методы и модификаторы доступа нельзя? Это ТЗ или ваши предрассудки? Ну допустим спихнем мы все в паблик, но чем подход с применением функций лучше подхода с применением методов, или же членов-функций? Чем они хуже? Тем, что к ООП ближе? Все эти сишные С++ меня добивают, потом ведь так и будут классы с пабликом и обрабатывать все извне.
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 03:15  [ТС]     передача указателя структуры в функцию, ощибка на этапе выполнения #16
Цитата Сообщение от MrGluck Посмотреть сообщение
С чего это методы и модификаторы доступа нельзя? Это ТЗ или ваши предрассудки? Ну допустим спихнем мы все в паблик, но чем подход с применением функций лучше подхода с применением методов, или же членов-функций? Чем они хуже? Тем, что к ООП ближе? Все эти сишные С++ меня добивают, потом ведь так и будут классы с пабликом и обрабатывать все извне.
Ну задача так поставлена, вот препода током ударило, и захотелось ему что бы без методов, одним словом ни какого ООП. Если чесно, я только за ООП, проще в реализации, и кода в перспективе меньше ... но, нельзя )
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.06.2013, 03:18     передача указателя структуры в функцию, ощибка на этапе выполнения #17
Непонятно, т.е. должна быть структура с динамическими полями, но не должно быть конструктора, деструктора и методов?

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

Добавлено через 1 минуту
Ничего, если я суть решения на С напишу, а то у меня даже рука не поднимается данный код g++ обрабатывать заместо gcc?
В точку! Ни конструкторов, ни деструкторов, ни методов.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.06.2013, 03:52     передача указателя структуры в функцию, ощибка на этапе выполнения #19
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 05:28     передача указателя структуры в функцию, ощибка на этапе выполнения
Еще ссылки по теме:

C++ Передача указателя на дерево в функцию
Передача указателя в функцию по ссылке C++
C++ Передача указателя на вектор в функцию

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

Или воспользуйтесь поиском по форуму:
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 05:28  [ТС]     передача указателя структуры в функцию, ощибка на этапе выполнения #20
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
Ты наверное знаком с моим преподом ))
Только динамическая память.
Yandex
Объявления
23.06.2013, 05:28     передача указателя структуры в функцию, ощибка на этапе выполнения
Ответ Создать тему
Опции темы

Текущее время: 15:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru