С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

19.06.2013, 00:46. Просмотров 394. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2013, 00:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Путаница с функциями и указателями. Платина. Ansi c (C++):

путаница с указателями - C++
Люди, помогите, пожалуйста! Имеется двумерный динамический массив, объявленный и проинициализированный следующим образом: int i, j, n =...

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

Работа с указателями/массивами /функциями - C++
Запутался с указателями/в лабе нужно провести через указатели /Дан одномерный массив из К элементов. Получить из него матрицу, размером N x...

Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF) - C++
Есть следующий кусок кода: FILE* fp = fopen(&quot;G:\OPND1.txt&quot;, &quot;r&quot;); if (fp!=NULL) // если файл удалось открыть { while((ch =...

Путаница в операторах - C++
Что же возвращает 6-ая строка? BOOL String::Invariants() const { #ifdef SHOW_INVARIANTS cout &lt;&lt; &quot;Invariants Tested&quot; &lt;&lt; endl; ...

Путаница в массиве - C++
setlocale(LC_ALL, &quot;Russian&quot;); const int B = 11; int A; int index(-1); int count; cout &lt;&lt; &quot;\n\t***Оценки стундентов в...

7
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:06 #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;
}
1
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 01:18  [ТС] #3
Сударь, вы маг и волшебник!
Спасибо за избавление :3
Кажется, я начинаю понимать, как это должно работать.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 01:24 #4
И _getch() в этой строке можно убрать (лишняя пауза):
C++
1
2
3
4
...
case 60:system("cls");
       show(arr, count); break;
...
1
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
19.06.2013, 01:34  [ТС] #5
Хотя нет, не совсем понимаю.
Почему в этой
void enter(publications *&arr, int &count) //функция ввода
строке одновременно и операция взятия адреса, и переход по нему? Разве это не должно привести к тому же результату, что и просто void enter(publications arr, int &count)? И почему у count`а мы просто переходим по адресу (хотя в подпрограмму передавалось значение), а у arr`а его ещё и берём?

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


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

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

Путаница с sftream и операторами << и >> - C++
Значит так, иду спокойно по книжке по темам &quot;Открытие и закрытие текстовых файлов&quot;, а также &quot;Чтение и запись текстовых файлов&quot; и тут я...

Путаница в условном операторе - C++
Задача: Если сумма трех попарно различных действительных чисел x, y, z меньше единицы, то наименьшее из этих трех чисел заменить...

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

Массивы, указатели. Моя путаница - C++
Привет, я читаю тут книгу по С++, и там сказано так: &quot;Статическое размещение более эффективно, так как выделение памяти происходит до...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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