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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.65
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
#1

поиск глобальных переменных с++ - C++

07.02.2012, 16:14. Просмотров 5317. Ответов 35
Метки нет (Все метки)

Есть задачка, которую не могу решить. Дано 9000 .cpp файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его глобальные переменные. Приветствуются отсылки к каким-нибудь тулзам, которые это умеют делать. Например, как это возможно вытянуть из линкера VS. Парсер написать пытаюсь, но это сложная задача для меня.

Добавлено через 12 минут
Помогите пожалуйста!очень нужно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2012, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос поиск глобальных переменных с++ (C++):

Инициализация глобальных переменных - C++
Требуется инициализировать 2 массива и 2 переменные, которые используются в 2-х функциях, с клавиатуры, но без передачи их в качестве...

Определение глобальных переменных - C++
Доброго времени суток! Интересует следующий вопрос - Возможно ли определение глобальных переменных в теле подпрограмм или классов? ...

Объявление глобальных переменных - C++
#include "stdafx.h" #include <conio.h> #include <stdio.h> void main (int x, int y) { printf ("x="); scanf_s ("x=&d",...

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

Использование глобальных переменных - моветон ли? - C++
Ребят, очень часто вижу как отцы С++, когда проверяют чей-то код и обнаруживают там глобальные переменные, заявляют, что это не хорошо, что...

Исправить без использования глобальных переменных - C++
#include<iostream> using namespace std; int a,n,maximum=-1000,x; void zapros() { cout<<"Vvedite razmer massiva"<<endl; } ...

35
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
07.02.2012, 16:20 #2
Парсер-то по идее не должен быть сложным. Нужно смотреть не в namespace-ли, не в функции-ли, не в структуре/классе/енуме/объединении.
0
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
07.02.2012, 16:33  [ТС] #3
парсер хорошо.
а как можно функцию распознать?
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:43 #4
ser_13, по блоку. { }. И по имени.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
07.02.2012, 16:45 #5
На скорую руку как-то так.

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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
 
int value = 0;
 
void find_global_variables(const std::string& filename)
{
   std::vector<std::string> keywords = {"struct", "union", "namespace", "class", "enum"};
   std::ifstream ifs(filename);
   std::string s;
   std::stack<char> scopes;
   while (std::getline(ifs, s))
   {
      if (s.find("{") != std::string::npos)
      {
         scopes.push('{');
      }
      else if (s.find("}") != std::string::npos)
      {
         scopes.pop();
      }
      if (!scopes.empty())
      {
         continue;
      }
      bool is_global = true;
      for (std::vector<std::string>::iterator iter = keywords.begin(); iter != keywords.end(); ++iter)
      {
         size_t idx = s.find(*iter);
         if (idx != std::string::npos)
         {
            size_t end_idx = idx + iter->length();
            if (s[end_idx] != ' ')
            {
               continue;
            }
            else
            {
                is_global = false;
                break;
            }
         }
      }
      if (s.find(";") != std::string::npos && s.find("(") == std::string::npos && s.find("#") == std::string::npos
          && s.find("{") == std::string::npos && s.find("}") == std::string::npos)
      {
         if (is_global)
         {
            std::cout << "Global: " << s << std::endl;
         }
      }
   }
}
 
int main(int argc, char* argv[])
{
   for (int i = 1; i < argc; ++i)
   {
      std::cout << argv[i] << std::endl;
      find_global_variables(argv[i]);
   }
}
Код
forever@pterois:~/My_pro1/cpp_pro$ ./some some.cpp
some.cpp
Global: int value = 0;
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 16:45 #6
Цитата Сообщение от soon Посмотреть сообщение
ser_13, по блоку. { }.
А если безымянное пространство имен?
Вроде такого
C++
1
2
3
4
5
6
int a = 1, b = 2;
{
   int temp = a;
   a = b;
   b = temp;
}
Хотя оно же вроде только в функциях применяться может.
Ну тогда можно вообще все, что не заключено в фигурные скобки считать глобальной переменной.
Тьфу, не безымянное пространство имен, а составной оператор.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
07.02.2012, 16:56 #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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
 
int value = 0;
 
void find_global_variables(const std::string& filename)
{
   std::vector<std::string> keywords = {"struct", "union", "namespace", "class", "enum"};
   std::ifstream ifs(filename);
   std::string s;
   std::stack<char> scopes;
   while (std::getline(ifs, s))
   {
      if (s.find("{") != std::string::npos)
      {
         scopes.push('{');
      }
      else if (s.find("}") != std::string::npos)
      {
         scopes.pop();
      }
      if (!scopes.empty())
      {
         continue;
      }
      bool is_global = true;
      for (std::vector<std::string>::iterator iter = keywords.begin(); iter != keywords.end(); ++iter)
      {
         size_t idx = s.find(*iter);
         if (idx != std::string::npos)
         {
            size_t end_idx = idx + iter->length();
            if (s[end_idx] != ' ')
            {
               continue;
            }
            else
            {
                is_global = false;
                break;
            }
         }
      }
      std::string symbols = "()#{}";
      if (s.find(";") != std::string::npos && s.find_first_of(symbols) == std::string::npos)
      {
         if (is_global)
         {
            std::cout << "Global: " << s << std::endl;
         }
      }
   }
}
 
int main(int argc, char* argv[])
{
   for (int i = 1; i < argc; ++i)
   {
      std::cout << argv[i] << std::endl;
      find_global_variables(argv[i]);
   }
}
Код
forever@pterois:~/My_pro1/cpp_pro$ cat new.cpp
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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
 
namespace
{
 
class Cl;
 
}
 
class Cl
{
};
 
template<class T>
class NS
{
   int value;
};
 
void function()
{
}
 
enum
{
   some,
   value
} enums;
 
struct s
{
};
 
namespace some
{
 
void foo()
{
}
 
}
 
union
{
} un;
Код
forever@pterois:~/My_pro1/cpp_pro$ ./some new.cpp 
new.cpp
1
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:58 #8
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/4bce7c...e718a0f3693c3b
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 17:03 #9
Цитата Сообщение от soon Посмотреть сообщение
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/4bce7c...e718a0f3693c3b
Ну да, в глобальной области такое не скомпилируется.(верхний пост я дополнил уже)
P.S.
а есть же еще такие штуки
C++
1
2
3
4
class C
{
   int a, b;
} variable;
По идее они тоже глобальными будут.
0
Felsurt
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
07.02.2012, 17:57 #10
это задание из яндекса на стажировку
можно писать парсер, а можно просто анализировать объектный файл
можно посмотреть соответствующие флажки компилятора, для составления карты объектного файла
а можно еще кучей других способов)
а вообще, если вы не можете сделать задание вступительное на стажировку, то вы уверены что эта работа для вас?
0
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
07.02.2012, 18:08  [ТС] #11
Спасибо Felsurt!
ваше сообщение мне придаст уверенности!

Добавлено через 14 секунд
Java
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
package tectc;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class tect {
    int pint=0;
    tect(){}
    class strok{
        String str;
    }
 
    void start(){
         try {
            String poid="";
            BufferedWriter out;
            BufferedReader in;
            int s=0;
            
            out = new BufferedWriter(new FileWriter("D:\\runs\\rez.txt"));
            int l=0;
            next:
                
            for(l=0;l<=8577;l++){////8577
                if(l<10000)poid="D:\\runs\\00"+Integer.toString(l)+".cpp";
                if(l<1000)poid="D:\\runs\\000"+Integer.toString(l)+".cpp";
                if(l<100)poid="D:\\runs\\0000"+Integer.toString(l)+".cpp";
                if(l<10)poid="D:\\runs\\00000"+Integer.toString(l)+".cpp";
                File f1 = new File(poid);
                while((!f1.exists())&&(l<8577)){
                    continue next;
                    }
                in = new BufferedReader(new FileReader(poid));   
                System.out.println(poid);////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                out.write(poid);out.newLine();
                String str;
                //обработка строк------------------------------------------------------
                str=in.readLine();
                nextStr:
                while(str!=null){
                    if(str.length()==0){
                        str=in.readLine();
                        continue nextStr;
                        }
                     ////////
                    
                    String simvol;
                    for(int i=0;i<str.length();i++){
                        simvol=str.substring(i, i+1);
                        if(simvol.equals("/")){
                                i++;
                                if(i+1<str.length())
                                simvol=str.substring(i, i+1);
                              
                            if(simvol.equals("/")){
                                if(i!=1){
                                    str=str.substring(0, i-1);
                                    if(s==0){System.out.println(str);out.write(str);out.newLine();}//////!!!!!!!!!!!!!!!!!!!!!
                                    }
                                str=in.readLine();
                                continue nextStr;        
                            }
                            if(simvol.equals("*")){
                                int ind;
                                ind=str.indexOf("*/",i+1);
                                if(ind!=-1){
                                    str=str.substring(ind+2);
                                    continue nextStr;
                                }
                                str=in.readLine();
                                while(str!=null){
                                    ind=str.indexOf("*/");
                                    if(ind!=-1){
                                        str=str.substring(ind+2);
                                        continue nextStr;
                                    }
                                    str=in.readLine();
                                    continue nextStr;
                                }
                            }
                        }
                        if(simvol.equals("#")){
                            str=in.readLine();
                            continue nextStr;
                        }
                        if(simvol.equals("{")){
                            s++;
                            i++;
                            nextStr111:
                            while((s>0)&&(str!=null)){
                                if(str.length()==0){
                                    str=in.readLine();
                                    if(str==null){s--;continue next;}
                                    continue nextStr111;
                                    }
                                while(i<str.length()-1){
                                    simvol=str.substring(0, i+1);
                                    if(simvol.equals("{"))s++;
                                    if(simvol.equals("{"))s--;
                                    i++;
                                }
                                str=in.readLine();
                                if(str==null){s--;continue next;}
                                i=0;
                            }
                        }
                        //***************************************//
                       
                        
                         //***************************************/
                    }
                     ////////
                     if(s==0){System.out.println(str);out.write(str);out.newLine();}
                     str=in.readLine(); 
                 }
                //обработка строк------------------------------------------------------
               // 
            //System.gc();
            in.close();
            }//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            System.out.println(s);
            out.close();
        } catch (IOException e) {
       }  
        
    }
    public static void main(String[] arg) {
        tect ini = new tect();
        ini.start();
        
    }
    
}
 Комментарий модератора 
Используйте теги форматирования кода!


Добавлено через 1 минуту
код парсера!правда нужно немного доработать!

Добавлено через 1 минуту
код конечно не претендует на самый лучший, так сделано скорее на скорость!
и требует доработки!
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.02.2012, 18:09 #12
Цитата Сообщение от soon Посмотреть сообщение
ser_13, по блоку. { }. И по имени.
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
07.02.2012, 18:12 #13
Цитата Сообщение от diagon Посмотреть сообщение
По идее они тоже глобальными будут.
Так variable тоже за пределами {}.

taras atavin, вы о чём?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.02.2012, 18:14 #14
О распознавании функций. А Вы о чём?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
07.02.2012, 18:15 #15
taras atavin, и зачем распознавать функции? Задача - распознать глобальные переменные.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 18:15
Привет! Вот еще темы с ответами:

Вынос глобальных переменных в отдельный файл - C++
Всем привет! Вопрос такой - сижу разбираюсь с вынесением функций в отдельные файлы. Что удалось выяснить - подключая через #include файл...

Ошибка в сравнении глобальных переменных в функциях - C++
Здравствуйте! Я всю жизнь писал на Pascal и с С столкнулся впервые пару дней назад, когда начал эксперементировать с Arduino. Поискал...

Массив (переписать без глобальных переменных) - C++
Помогите написать ету програму без глобальных переменных #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; ...

Объявление глобальных переменных в проекте Dev C++ - C++
Доброй ночи всем! Подскажите, пожалуйста, как правильно объявить глобальные переменные в проекте. У меня есть один файл, например, для...


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

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

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