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

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

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

Author24 — интернет-сервис помощи студентам
Помогите разобратся в чем ошибка. Ошибка вылетает на этапе выполнения.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2013, 01:08
Ответы с готовыми решениями:

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

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

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

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

22
31 / 31 / 4
Регистрация: 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 придется повозиться
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 01:59  [ТС] 3
Передача указателя структуры в функцию, ошибка на этапе выполнения

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

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

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

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

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


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

Добавлено через 23 секунды
Это просто потому, что STL контейнеры наверняка нельзя
Я в курсе разници между классами и структурами, требования к работе только структуры и функции.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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:
    ...
};
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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;
}
0
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;
ИМХО, ссылка не нужный промежуток кода. Но, готов выслушать иное мнение...
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 03:01 11
@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  [ТС] 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]
}
и функции, вне структуры, которые работаю с ее полями.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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: // так нельзя
а и не надо
у структур по умолчанию все публик
0
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 минуту

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


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

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

Добавлено через 1 минуту
Ничего, если я суть решения на С напишу, а то у меня даже рука не поднимается данный код g++ обрабатывать заместо gcc?
В точку! Ни конструкторов, ни деструкторов, ни методов.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.06.2013, 03:52 19
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 05:28  [ТС] 20
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
Ты наверное знаком с моим преподом ))
Только динамическая память.
0
23.06.2013, 05:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2013, 05:28
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru