1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
1

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

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

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

Добавлено через 12 минут
Помогите пожалуйста!очень нужно
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2012, 16:14
Ответы с готовыми решениями:

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

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

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

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

35
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.02.2012, 16:20 2
Парсер-то по идее не должен быть сложным. Нужно смотреть не в namespace-ли, не в функции-ли, не в структуре/классе/енуме/объединении.
0
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
07.02.2012, 16:33  [ТС] 3
парсер хорошо.
а как можно функцию распознать?
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:43 4
ser_13, по блоку. { }. И по имени.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Higher
1953 / 1219 / 120
Регистрация: 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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:58 8
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/... a0f3693c3b
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 17:03 9
Цитата Сообщение от soon Посмотреть сообщение
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/... a0f3693c3b
Ну да, в глобальной области такое не скомпилируется.(верхний пост я дополнил уже)
P.S.
а есть же еще такие штуки
C++
1
2
3
4
class C
{
   int a, b;
} variable;
По идее они тоже глобальными будут.
0
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
07.02.2012, 17:57 10
это задание из яндекса на стажировку
можно писать парсер, а можно просто анализировать объектный файл
можно посмотреть соответствующие флажки компилятора, для составления карты объектного файла
а можно еще кучей других способов)
а вообще, если вы не можете сделать задание вступительное на стажировку, то вы уверены что эта работа для вас?
0
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.02.2012, 18:09 12
Цитата Сообщение от soon Посмотреть сообщение
ser_13, по блоку. { }. И по имени.
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
07.02.2012, 18:12 13
Цитата Сообщение от diagon Посмотреть сообщение
По идее они тоже глобальными будут.
Так variable тоже за пределами {}.

taras atavin, вы о чём?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.02.2012, 18:14 14
О распознавании функций. А Вы о чём?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
07.02.2012, 18:15 15
taras atavin, и зачем распознавать функции? Задача - распознать глобальные переменные.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.02.2012, 18:16 16
Глобальные - это не локальные, а локальные - это которые в функциях. И хорошо, нашёл ты строку, начинающуюся с типа. А если это прототип функции? Поэтому ищем всё, что начинается с типов, потом проверяешь два признака: наличие () и нахождение в {} сразу после () без точки с запятой между ) и {. Если оба признака false, значит ты нашёл глобальную переменную.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
07.02.2012, 18:18 17
taras atavin, Ну так речь о том и шла. Надо смотреть все переменные, которые находятся вне блоков (будь то тело функции, класса или пространство имён). Так ответьте мне теперь на вопрос: при чем же всё-таки тут функции с их списком параметров?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.02.2012, 18:20 18
Эйси
C++
1
2
3
4
5
6
7
8
9
int f(int x); // По твоей логике это тоже глобальная переменная
int main ()
{
 return 0;
}
int f()
{
 return -x;
}
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 18:21 19
На Java через регексы можно сделать. Просто повырезать все лишнее подобными запросами:
Java
1
str = str.replaceAll("template.*[{].*[}]", "");
А дальше уже несложно будет.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 18:23 20
Цитата Сообщение от taras atavin Посмотреть сообщение
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
Под именем я подразумевал наличие (), если вы об этом.
0
07.02.2012, 18:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2012, 18:23
Помогаю со студенческими работами здесь

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

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

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

Быстрая сортировка без глобальных переменных
Реализовать двоичную сортировку, используя массив. Без использования функции...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru