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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
#1

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

23.06.2013, 01:08. Просмотров 877. Ответов 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");
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 01:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача указателя структуры в функцию, ошибка на этапе выполнения (C++):

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

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

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

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

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

Передача указателя на функцию - C++
Есть класс в котором: typedef void(*setChar)(int x, int y, wchar_t c); void Paint(setChar SetChar) В другом классе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
23.06.2013, 03:10 #15
С чего это методы и модификаторы доступа нельзя? Это ТЗ или ваши предрассудки? Ну допустим спихнем мы все в паблик, но чем подход с применением функций лучше подхода с применением методов, или же членов-функций? Чем они хуже? Тем, что к ООП ближе? Все эти сишные С++ меня добивают, потом ведь так и будут классы с пабликом и обрабатывать все извне.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 03:10
Привет! Вот еще темы с ответами:

Передача указателя на функцию - C++
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее указатель? пример class C1 { public: void...

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

Передача указателя в функцию - C++
Поиском не пользовался, возможно данный вопрос уже проскакивал. Проблема том, что VS2010 на отрез отказывается передавать указатель на...

Передача указателя в функцию - C++
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете пропустить. Задали на лабе сделать некий...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.06.2013, 03:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru