Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
1

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

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

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

Добавлено через 12 минут
Помогите пожалуйста!очень нужно
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2012, 16:14
Ответы с готовыми решениями:

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

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

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

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

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

35
ForEveR
В астрале
Эксперт С++
8003 / 4761 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:43 4
ser_13, по блоку. { }. И по имени.
0
ForEveR
В астрале
Эксперт С++
8003 / 4761 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
1940 / 1206 / 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
ForEveR
В астрале
Эксперт С++
8003 / 4761 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:58 8
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/4bce7c69f6bcceaddfe718a0f3693c3b
0
diagon
Higher
1940 / 1206 / 120
Регистрация: 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
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
07.02.2012, 18:09 12
Цитата Сообщение от soon Посмотреть сообщение
ser_13, по блоку. { }. И по имени.
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
07.02.2012, 18:12 13
Цитата Сообщение от diagon Посмотреть сообщение
По идее они тоже глобальными будут.
Так variable тоже за пределами {}.

taras atavin, вы о чём?
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
07.02.2012, 18:14 14
О распознавании функций. А Вы о чём?
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
07.02.2012, 18:15 15
taras atavin, и зачем распознавать функции? Задача - распознать глобальные переменные.
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
07.02.2012, 18:16 16
Глобальные - это не локальные, а локальные - это которые в функциях. И хорошо, нашёл ты строку, начинающуюся с типа. А если это прототип функции? Поэтому ищем всё, что начинается с типов, потом проверяешь два признака: наличие () и нахождение в {} сразу после () без точки с запятой между ) и {. Если оба признака false, значит ты нашёл глобальную переменную.
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
07.02.2012, 18:18 17
taras atavin, Ну так речь о том и шла. Надо смотреть все переменные, которые находятся вне блоков (будь то тело функции, класса или пространство имён). Так ответьте мне теперь на вопрос: при чем же всё-таки тут функции с их списком параметров?
0
taras atavin
4207 / 1774 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
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
diagon
Higher
1940 / 1206 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 18:21 19
На Java через регексы можно сделать. Просто повырезать все лишнее подобными запросами:
Java
1
str = str.replaceAll("template.*[{].*[}]", "");
А дальше уже несложно будет.
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 18:23 20
Цитата Сообщение от taras atavin Посмотреть сообщение
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
Под именем я подразумевал наличие (), если вы об этом.
0
07.02.2012, 18:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 18:23

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

Исправить без использования глобальных переменных
#include&lt;iostream&gt; using namespace std; int a,n,maximum=-1000,x; void zapros() { ...

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


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

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

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