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

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

Войти
Регистрация
Восстановить пароль
 
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
#1

Путаница с функциями и указателями. Платина. Ansi c - C++

19.06.2013, 00:46. Просмотров 372. Ответов 7
Метки нет (Все метки)

Прошу прощения за очередную лишнюю тему, где школьник запутался в указателях и не может передать структуру в функцию, но нужна помощь, ибо перелопачивать нельзя, надо исправить.
Мне нужно было заполнить и вывести динамический массив структур в функциях. Очевидно, я от души налажал с передачей данных в функцию. Методом тыка исправить не вышло. Если отправите читать мануалы про указатели и прочая, я пойму, но проблемы не решит: по ходу, я неполноценный.
Помогите найти ошибку, пожалуйста.
Инбифо "в ДНК у тебя ошибка".
И да, если кроме помощи в нахождении ошибки мне укажут, почему именно это - отвратительный говнокод, никому не нужная моя благодарность будет и вовсе бесконечной.

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
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include "conio.h"
 
//создание структуры
struct publications
    {
        int id;
        char name[20];
        char address[20];
        int numofpub;
    };
 
void enter(publications *arr, int count)
{
    arr = (publications *)realloc(arr,(count+1)*sizeof(publications));//увеличение выделенной памяти на 1 элемент
    printf("enter id, name, address and number of publications\n ");
    scanf_s("%d",arr[count].id);//ввод
    _flushall();//очистка буфера ввода
    gets(arr[count].name);//ввод 
    _flushall();//очистка буфера ввода
    gets(arr[count].address);//ввод 
    _flushall();//очистка буфера ввода
    scanf_s("%d",arr[count].numofpub);//ввод 
    count++;//увеличение счетчика на 1
}
 
void show (publications *arr, int count)
{
    printf("ID\tname taddress\tnumber of publications\n");
    for(int i = 0;i < count;i++)//вывод на экран данных структуры
    {
    printf ("%d\t", arr[i].id);
    printf ("%s\t\t", arr[i].name);
    printf ("%s\t\t", arr[i].address);
    printf ("%f\n", arr[i].numofpub);//вывод площади
    }
}
void main()
{
    int count = 0;
    bool key = false;
    publications *arr = NULL;//созали обнуленый указатель
    arr = (publications *) malloc(sizeof(publications));//выделение памяти под 1 элемент структуры dachnik
    printf("What you gonna do? Press F1 to enter new data. Press F2 to print. Press esc to esc\n ");
    do
    {
        switch(_getch())
            {
                case 59:system("cls");
                enter(arr, count);break; 
                case 60:system("cls");
                show(arr,count);_getch();break;
                case '\x1b':system("cls");
                key = true ;break;
            }
    }   
    while(key!= true);
 
    
    //освобождение динамической памяти
    free (arr);
    getch;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2013, 00:46     Путаница с функциями и указателями. Платина. Ansi c
Посмотрите здесь:

Работа с массивами, указателями и функциями. C++
путаница с указателями C++
C++ ANSI C
C++ Путаница в операторах
C++ Путаница в массиве
C++ Путаница среди IDE
Путаница в условном операторе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:06     Путаница с функциями и указателями. Платина. Ansi c #2
Как-то так:
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
//#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
 
//создание структуры
struct publications
{
    int id;
    char name[20];
    char address[20];
    int numofpub;
};
 
void enter(publications *&arr, int &count)
{
    arr = (publications *)realloc(arr,(count + 1) * sizeof(publications));//увеличение выделенной памяти на 1 элемент
    printf("enter id, name, address and number of publications\n ");
    scanf_s("%d", &arr[count].id);//ввод
    _flushall();//очистка буфера ввода
    gets(arr[count].name);//ввод 
    _flushall();//очистка буфера ввода
    gets(arr[count].address);//ввод 
    _flushall();//очистка буфера ввода
    scanf_s("%d", &arr[count].numofpub);//ввод 
    count++;//увеличение счетчика на 1
}
 
void show (publications *arr, int count)
{
    printf("ID\tname taddress\tnumber of publications\n");
    for(int i = 0;i < count;i++)//вывод на экран данных структуры
    {
    printf ("%d\t", arr[i].id);
    printf ("%s\t\t", arr[i].name);
    printf ("%s\t\t", arr[i].address);
    printf ("%d\n", arr[i].numofpub);//вывод площади
    }
}
 
 
void main()
{
    int count = 0;
    bool key = false;
    publications *arr = NULL;//созали обнуленый указатель
    arr = (publications *) malloc(sizeof(publications));//выделение памяти под 1 элемент структуры dachnik
    printf("What you gonna do? Press F1 to enter new data. Press F2 to print. Press esc to esc\n ");
    do
    {
        switch(_getch())
            {
                case 59:system("cls");
                    enter(arr, count); break; 
                case 60:system("cls");
                    show(arr, count);_getch(); break;
                case '\x1b':system("cls");
                    key = true ;break;
            }
    }   
    while(key!= true);
  
    //освобождение динамической памяти
    free (arr);
    getch;
}
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 01:18  [ТС]     Путаница с функциями и указателями. Платина. Ansi c #3
Сударь, вы маг и волшебник!
Спасибо за избавление :3
Кажется, я начинаю понимать, как это должно работать.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:24     Путаница с функциями и указателями. Платина. Ansi c #4
И _getch() в этой строке можно убрать (лишняя пауза):
C++
1
2
3
4
...
case 60:system("cls");
       show(arr, count); break;
...
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 01:34  [ТС]     Путаница с функциями и указателями. Платина. Ansi c #5
Хотя нет, не совсем понимаю.
Почему в этой
void enter(publications *&arr, int &count) //функция ввода
строке одновременно и операция взятия адреса, и переход по нему? Разве это не должно привести к тому же результату, что и просто void enter(publications arr, int &count)? И почему у count`а мы просто переходим по адресу (хотя в подпрограмму передавалось значение), а у arr`а его ещё и берём?

Гетч там к месту, просто в исправленном варианте теперь создаётся пауза между просмотром результатов и возвращением в главное меню, стиранием всего на экране и выводом просьбы нажать на кнопку) Но спасибо!)
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:54     Путаница с функциями и указателями. Платина. Ansi c #6
Цитата Сообщение от Yn94k0 Посмотреть сообщение
Гетч там к месту,
Не к месту.


Цитата Сообщение от Yn94k0 Посмотреть сообщение
Почему в этой
void enter(publications *&arr, int &count) //функция ввода
строке одновременно и операция взятия адреса, и переход по нему?
Это не взятие адреса, а передача в функцию указателя на начало массива и переменной count по ссылке.

Добавлено через 3 минуты
Если как было:
C++
1
void enter(publications *arr, int count);
, то в функцию передаются копии указателя и переменной, поэтому то, что происходит в функции с ними, не меняет значение переменных, объявленных в main().
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 02:06  [ТС]     Путаница с функциями и указателями. Платина. Ansi c #7
>Не к месту.
Теперь к месту :3
>Это не взятие адреса, а передача в функцию указателя на начало массива и переменной count по ссылке.
Спасибо большое, попробую когда-нибудь это осмыслить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2013, 03:10     Путаница с функциями и указателями. Платина. Ansi c
Еще ссылки по теме:

Путаница с циклом for. Рассчитать сумму банковского вклада C++
C++ Путаница с sftream и операторами << и >>
C++ Метод простой итерации - путаница в векторе невязки
Работа с указателями/массивами /функциями C++
C++ Массивы, указатели. Моя путаница

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 03:10     Путаница с функциями и указателями. Платина. Ansi c #8
Можно так ещё передавать в функцию:
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
//#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
 
//создание структуры
struct publications
{
    int id;
    char name[20];
    char address[20];
    int numofpub;
};
 
void enter(publications **arr, int *count)
{
    *arr = (publications *)realloc(*arr, (*count + 1) * sizeof(publications));//увеличение выделенной памяти на 1 элемент
    printf("enter id, name, address and number of publications\n ");
    scanf_s("%d", &((*arr)[*count].id));//ввод
    _flushall();//очистка буфера ввода
    gets((*arr)[*count].name);//ввод 
    _flushall();//очистка буфера ввода
    gets((*arr)[*count].address);//ввод 
    _flushall();//очистка буфера ввода
    scanf_s("%d", &((*arr)[*count].numofpub));//ввод 
    ++(*count);//увеличение счетчика на 1
}
 
void show (publications *arr, int count)
{
    printf("ID\tname taddress\tnumber of publications\n");
    for(int i = 0;i < count;i++)//вывод на экран данных структуры
    {
    printf ("%d\t", arr[i].id);
    printf ("%s\t\t", arr[i].name);
    printf ("%s\t\t", arr[i].address);
    printf ("%d\n", arr[i].numofpub);//вывод площади
    }
}
 
 
void main()
{
    int count = 0;
    bool key = false;
    publications *arr = NULL;//созали обнуленый указатель
    arr = (publications *) malloc(sizeof(publications));//выделение памяти под 1 элемент структуры dachnik
    printf("What you gonna do? Press F1 to enter new data. Press F2 to print. Press esc to esc\n ");
    do
    {
        switch(_getch())
            {
                case 59:system("cls");
                    enter(&arr, &count); break; 
                case 60:system("cls");
                    show(arr, count);  break;
                case '\x1b':system("cls");
                    key = true ; break;
            }
    }   
    while(key!= true);
  
    //освобождение динамической памяти
    free (arr);
    _getch();
}
Yandex
Объявления
19.06.2013, 03:10     Путаница с функциями и указателями. Платина. Ansi c
Ответ Создать тему
Опции темы

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