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

Область видимости - C++

Восстановить пароль Регистрация
 
casabonita
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 5
27.02.2012, 18:07     Область видимости #1
Даю фрагмент программы:
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
#include <iostream>
#include <stdio.h>
#include <cmath>
 
struct elem //тип элемента двусвязного списка
    {
        float st, kf;
        elem *next,*pred;
    };
 
int main()
{
    
 
 
    
    elem *n = NULL, *min = NULL;
    FILE *fp, *fpo;
    
        if ((fp = fopen("input.txt","r")) == NULL) //формирование списка(ввод из файла "input.txt") 
            printf_s("File couldn't be opened\n");          
        else
        { 
            float kof, min;
            if ((fscanf(fp, "%g", &kof)) != EOF)
            {
                n = new elem;
                n->pred = NULL;
                n->next = NULL;
                elem *p;
                p = n;
                n -> kf = kof;
                fscanf(fp,"%g", &(n -> st));
                while ((fscanf(fp,"%g",&kof)) != EOF)
                {
                    p -> next= new elem;
                    p -> next -> pred = p;
                    p -> next -> next = NULL;
                    p = p -> next;
                    p -> kf = kof;
                    fscanf(fp,"%g", &(p -> st));
                }
            }
        }
        fclose(fp);
        elem *p = n,*s = NULL,*u = NULL; 
}
Объясните различие объявления структуры вне функции main() и внутри.

Если объявить вне все прекрасно работает. Если внутри то все компилируется но невозможно обратиться к элементу по указателю next или pred.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2012, 18:07     Область видимости
Посмотрите здесь:

Область видимости в С++ C++
Область видимости C++
Область видимости C++
C++ Область видимости Protected
C++ Structure (Область видимости)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
27.02.2012, 18:11     Область видимости #2
если внутри main(), то нужно так
C++
1
2
3
4
5
struct elem //тип элемента двусвязного списка
        {
                float st, kf;
                elem *next,*pred;
        } *n = NULL, *min = NULL;
casabonita
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 5
27.02.2012, 18:15  [ТС]     Область видимости #3
Прокомментируй пожалуйста почему так надо.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.02.2012, 18:22     Область видимости #4
Цитата Сообщение от casabonita Посмотреть сообщение
Прокомментируй пожалуйста почему так надо.
Такой код объявляет новый тип данных:
C++
1
2
3
4
struct my_struct 
{
     int a;
};
Чтобы создать экземпляр такого типа Вы пишете сначала тип данных, а потом имя переменной:
C++
1
my_struct ms;
Два этих шага можно объединить, сразу объявив тип данных и указав имя конкретной переменной:
C++
1
2
3
4
struct my_struct 
{
     int a;
} ms;
Сравните с любым встроенным типом данных (сначала тип, потом имя):
C++
1
int i;
Или для нескольких переменных через запятую:
C++
1
2
3
4
5
6
struct mystruct 
{
     int a;
} ms, *msptr = NULL;
 
int i = 0, *iptr = NULL;
msptr и iptr - указатели соответствующих типов.
casabonita
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 5
27.02.2012, 18:29  [ТС]     Область видимости #5
Как это работает я понимаю а почему надо именно так как написал Xind ?
C++
1
2
3
4
5
6
struct elem //тип элемента двусвязного списка
        {
                float st, kf;
                elem *next,*pred;
        };       
        elem *n = NULL, *min = NULL;
это эквивалентные записи ?

Добавлено через 49 секунд
И даже такое объявление указателей не избавляет меня от проблемы.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.02.2012, 18:34     Область видимости #6
Цитата Сообщение от casabonita Посмотреть сообщение
это эквивалентные записи ?
C++
1
2
3
4
5
6
7
8
int main()
{   
   struct elem
   {
      float st, kf;
      elem *next,*pred;
   }      
   *n = NULL, *min = NULL;
C++
1
2
3
4
5
6
7
8
9
int main()
{
   struct elem
   {
      float st, kf;
      elem *next,*pred;
   };
   
   elem *n = NULL, *min = NULL;
Эти записи эквивалентны.
Цитата Сообщение от casabonita Посмотреть сообщение
И даже такое объявление указателей не избавляет меня от проблемы.
Так а в чем проблема то? Ваш код, привиденный в первом посте, компилируется почти без ошибок.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2012, 21:16     Область видимости
Еще ссылки по теме:

C++ Область видимости
Область видимости и указатели C++
C++ Область видимости в библиотеках

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

Или воспользуйтесь поиском по форуму:
casabonita
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 5
29.02.2012, 21:16  [ТС]     Область видимости #7
http://s017.***********/i423/1202/f4/5d6c1e97df03.jpg
на каждой итерации цикла должен создаваться новый элемент и формироваться st, kf,next,pred.
как показано на скрине я не могу обратиться к элементу. Если же я объявлю структуру вне main() то все будет прекрасно работать.

Добавлено через 16 часов 34 минуты
ап плз

Добавлено через 10 часов 39 минут
ещё ап

Добавлено через 23 часа 15 минут
Вверх
Yandex
Объявления
29.02.2012, 21:16     Область видимости
Ответ Создать тему
Опции темы

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