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

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

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

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

23.06.2013, 01:08. Просмотров 885. Ответов 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
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) В другом классе...

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

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

Добавлено через 1 минуту
Ничего, если я суть решения на С напишу, а то у меня даже рука не поднимается данный код g++ обрабатывать заместо gcc?
В точку! Ни конструкторов, ни деструкторов, ни методов.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
23.06.2013, 03:52 #19
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
0
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
23.06.2013, 05:28  [ТС] #20
Цитата Сообщение от MrGluck Посмотреть сообщение
@p-314, а поля какие могут быть? Я вот хочу сделать хотя бы char[SIZE], или этого тоже нельзя и надо char* ?
Ты наверное знаком с моим преподом ))
Только динамическая память.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
23.06.2013, 16:07 #21
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 256
 
/* <<<<<<<---------- îáúÿâëÿåì ñòðóêòóðû ГЁ ïðîòîòèïû ГґГіГ*êöèé --------->>>>>>> */
typedef struct
{
    char *name;
    char *author;
    double price;
} Book;
 
typedef struct
{
    Book *arr;
    unsigned int max;
    unsigned int number;
} Books;
 
void init(Book *);
void clear(Book *);
void clearAll(Books *);
void print(const Book *);
void printAll(const Books *);
int findBookByName(const Books *, const char *);
int findBookByAuthor(const Books *, const char *);
void sortByName(Books *);
/* int readFromFile(Books *, const char *fileName);
int writeInFile(const Books *, const char *fileName); */
    
/* <<<<<<<<<<<<----------------- ГЈГ«Г*ГўГ*Г*Гї ГґГіГ*êöèÿ ---------------->>>>>>>>>>>> */
int main(void)
{
    const unsigned int N = 10;
    unsigned int i, len;
    int index;
    char key[SIZE];
    Books b;
    b.arr = malloc(sizeof(Book) * N);
    b.number = 0;
    b.max = N;
    for (i=0; i < 2; i++)
        init( &b.arr[b.number++] );
        
    sortByName(&b);
    printAll(&b);
    
    printf("Enter name to find: ");
    fflush(stdin);
    if(fgets(key, sizeof(key), stdin) == NULL)
        exit(1);
    len = strlen(key);
    key[len - 1] = '\0';
    index = findBookByName(&b, key);
    if (index == -1)
        printf("No book with such name found\n");
    else
        print( &b.arr[index] );
        
    clearAll(&b);   
    return 0;
}
 
/* <<<<<<<<<<<<--------------- ðåГ*ëèçГ*öèÿ ГґГіГ*êöèé --------------->>>>>>>>>>>> */
void init(Book *b)
{
    /* âðåìåГ*Г*ûå ïåðåìåГ*Г*ûå */
    char name[SIZE], author[SIZE];
    size_t len;
    
    fflush(stdin);
    printf("Enter name: ");
    if(fgets(name, sizeof(name), stdin) == NULL)
        exit(1);
    len = strlen(name);
    name[len - 1] = '\0';
    b->name = malloc(len);
    strcpy(b->name, name);
    
    printf("Enter author: ");
    if(fgets(author, sizeof(author), stdin) == NULL)
        exit(1);
    len = strlen(author);
    author[len - 1] = '\0';
    b->author = malloc(len);
    strcpy(b->author, author);
    printf("Enter price: ");
    scanf("%lf", &b->price);
}
 
void clear(Book *b)
{
    if (b->name)
        free(b->name);
    if (b->author)
        free(b->author);
}
 
void clearAll(Books *b)
{
    unsigned int i;
    for (i=0; i < b->number; i++)
        free( &b->arr[i] );
}
 
void print(const Book *b)
{
    printf("Name:   %s\n",     b->name);
    printf("Author: %s\n",     b->author);
    printf("Price:  %.2f\n\n", b->price);
}
 
void printAll(const Books *b)
{
    unsigned int i;
    for (i=0; i < b->number; i++)
        print( &b->arr[i] );
}
 
int findBookByName(const Books *b, const char *key)
{
    unsigned int i;
    for (i=0; i < b->number; i++)
        if ( !strcmp(b->arr[i].name, key) )
             return i;
    return -1; /* óñëîâГ*Г*Гї îøèáêГ* */
}
 
int findBookByAuthor(const Books *b, const char *key)
{
    unsigned int i;
    for (i=0; i < b->number; i++)
        if ( !strcmp(b->arr[i].author, key) )
             return i;
    return -1; /* óñëîâГ*Г*Гї îøèáêГ* */
}
 
void sortByName(Books *b)
{
    Book tmp;
    unsigned int i, j;
    for (i=0; i < b->number-1; i++)
        for (j = b->number-1; j > i; j--)
            if (strcmp(b->arr[j].name, b->arr[i].name) < 0)
            {
                tmp.name = malloc(sizeof(b->arr[i].name));
                tmp.author = malloc(sizeof(b->arr[i].author));
                strcpy(tmp.name, b->arr[i].name);
                strcpy(tmp.author, b->arr[i].author);
                tmp.price = b->arr[i].price;
                
                clear(&b->arr[i]);
                b->arr[i].name = malloc(sizeof(b->arr[j].name));
                b->arr[i].author = malloc(sizeof(b->arr[j].author));
                strcpy(b->arr[i].name, b->arr[j].name);
                strcpy(b->arr[i].author, b->arr[j].author);
                b->arr[i].price = b->arr[j].price;
                
                clear(&b->arr[j]);
                b->arr[j].name = malloc(sizeof(tmp.name));
                b->arr[j].author = malloc(sizeof(tmp.author));
                strcpy(b->arr[j].name, tmp.name);
                strcpy(b->arr[j].author, tmp.author);
                b->arr[j].price = tmp.price;
            }
}
1
p-314
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 24
24.06.2013, 16:37  [ТС] #22
А чем отличается malloc от new?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
24.06.2013, 18:48 #23
@p-314, malloc функция, new - оператор. Главное отличие - new malloc не вызывает конструктора, он лишь выделяет сырую память.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2013, 18:48
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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