C++:从函数访问主变量的最简单方法?

Posted

技术标签:

【中文标题】C++:从函数访问主变量的最简单方法?【英文标题】:C++: Easiest way to access main variable from function? 【发布时间】:2012-03-28 23:10:31 【问题描述】:

我目前正在处理一个在 main() 中初始化的字符串,如果我尝试使其全局化,由于某种原因它会变得异常(它变成一个非字符字符串)。我想知道我是否可以让程序中声明的函数访问此变量...函数本身只会在 main 或从 main 调用的函数中执行,但编译器在 main() 之前看不到变量名到达。

以下是相关代码的精简版:

string getCommand(int input_pos,string inputstring)

int temp_paren=0;
int begin_pos = stdinstring.rfind("(",input_pos);
int len = 0;
while (temp_paren>0 && len < 10)
 
 if (stdinstring.substr(begin_pos+len,1)=="(") temp_paren++;
 if (stdinstring.substr(begin_pos+len,1)==")") temp_paren--;
 len++;
 
 return stdinstring.substr(begin_pos,len);


int main(void) 

string stdinstring = ""; 

我一直在考虑前向声明,每次使用时手动将变量传递给函数,甚至创建一个类来保存该变量......解决这个问题的最简单方法是什么?理想情况下,我将有足够的时间将其设为全局变量并找出出错的位置/原因,但我只需要完成此操作。感谢您的所有帮助。


编辑:对于任何感兴趣的人:如果我尝试将字符串设为全局,就会发生这种情况。所有字符都变成“”(不知道是否可见)


EDIT EDIT:好的,这是我的代码的更完整版本。另外,我在上面尝试粘贴的符号是带有“0 0 0 1”(ASCII 字符代码?)的框

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<stdint.h>
//#include<regex>

#define PI M_PI
#define VERBOSE 1
using namespace std;

string stdinstring; 

template <class dataclass> 
struct linkm 
  dataclass value;
  linkm *next;
;

template <class dataclass> 
class linklist 

  public:
    linklist()
      top = NULL;
    ~linklist() 
      
    void push(dataclass num)
      
      linkm<dataclass> *temp = new linkm<dataclass>;
      temp->value = num;
      temp->next = top;
      top = temp;
       
    dataclass pop()
      
      if (top == NULL) 
        return 0;
      linkm<dataclass> * temp;
      temp = top;
      dataclass value;
      value = temp->value;
      top = temp->next;
      delete temp;
      return value;
      
    bool isEmpty()
      
      if (top == NULL) 
        return 1;
      return 0;
      
  private:
    linkm<dataclass> *top; 
;

double evaluateExpression(string expression)

// sample expression : (* (/ a 1) (+ b 2))
     if (expression.substr(0,2)=="(+") cout << "add found"<<endl;
else if (expression.substr(0,2)=="(-") cout << "sub found"<<endl;
else if (expression.substr(0,2)=="(*") cout << "mult found"<<endl;
else if (expression.substr(0,2)=="(/") cout << "div found"<<endl;
else if (expression.substr(0,2)=="(sin") cout << "sin found"<<endl;
else if (expression.substr(0,2)=="(cos") cout << "cos found"<<endl;
else cout << "Error: invalid operation"; // or is it just a number?


string getCommand(int input_pos,string inputstring)

int temp_paren=0;
int begin_pos = stdinstring.rfind("(",input_pos);
int len = 0;
while (temp_paren>0 && len < 10)
 
 if (stdinstring.substr(begin_pos+len,1)=="(") temp_paren++;
 if (stdinstring.substr(begin_pos+len,1)==")") temp_paren--;
 len++;
 
 return stdinstring.substr(begin_pos,len);


class symContainer

public:
string index[500];
float value[500];
int currindex;

symContainer ()  currindex = 0 ; 

void add(string id,float invalue)

index[currindex] = id;
value[currindex] = invalue;
currindex++;


float get(string id)

int i=0;
while (i<currindex)
 
 if(id==index[i]) return value[i];
 i++;
 
 cout << "Invalid input - an unassigned symbol was requested:" << id << endl;
 exit(2);


;


struct transform  int type; double arguments[4];  ;
struct point  double x; double y;  ;
struct drawing  linklist<point> points; linklist<transform> transforms; void applyTransforms(linklist<transform> * trsptr)    ; 
struct group : public drawing  linklist<int> drawings; void transform(linklist<transform> * trsptr)   ;
struct symbol string index; double value;;

char getNext()  //for the lookaround function. has hard-filters, like replacing newlines/tabs with spaces
char temp = getchar(); 
if (temp=='\n') temp=' ';
if (temp=='\t') temp=' ';
return temp;


int main(void) 

stdinstring="a";

char command[20], args[2048];
int commandindex=0;     //'i' for what command we're on
int stdinsize=2;
double argsArray[8];
bool filled=0;
int parenlevel = 0;
symContainer symbol;

//1 is the character that will be written at the end of each loop. 0 and 2 are 1 char ahead/behind, respectively
char c_lookaround[2]; 
c_lookaround[0]=NULL;
c_lookaround[1]=getNext();
c_lookaround[2]=getNext();

unsigned long i=0;

bool write=0;
while( c_lookaround[2] != EOF )
 
write=1;
// Lookaround logic goes here. (Clearing duplicate whitespaces, newlines, and the like)

while (                         c_lookaround[1]==' '  && c_lookaround[2]==' ' ) c_lookaround[2]=getNext();
while (c_lookaround[0]=='('  && c_lookaround[1]==' '                          ) c_lookaround[1]=c_lookaround[2]; c_lookaround[2]=getNext();
while (                         c_lookaround[1]==' '  && c_lookaround[2]==')' ) c_lookaround[1]=c_lookaround[2]; c_lookaround[2]=getNext();
while (c_lookaround[0]==NULL && c_lookaround[1]==' '                          ) c_lookaround[1]=c_lookaround[2]; c_lookaround[2]=getNext();
//while (c_lookaround[0]==')'  && c_lookaround[1]==' '  && c_lookaround[2]=='(' ) c_lookaround[1]=c_lookaround[2]; c_lookaround[2]=getNext();
//while (c_lookaround[0]==')'  && c_lookaround[1]==' '  && c_lookaround[2]=='\0' ) cout<<"aa";c_lookaround[1]=c_lookaround[2]; c_lookaround[2]=getNext();

if (c_lookaround[0]=='('  && c_lookaround[1]==':'  && c_lookaround[2]=='=') 
 
    getCommand(i,stdinstring);
 

//Determine current parentheses level
if (c_lookaround[1] == '(')  parenlevel++;
if (parenlevel==0) write=0;
if (c_lookaround[1] == ')')  parenlevel--;

//Write the character 
if (write) stdinstring.push_back(c_lookaround[1]);
cout << stdinstring<< endl;

//Advance the tape!
i++;
c_lookaround[0]=c_lookaround[1];
c_lookaround[1]=c_lookaround[2];
c_lookaround[2]=getNext();


stdinsize = i;


【问题讨论】:

你是怎么调用getCommand的?你是怎么得到字符串的? 如果我理解您的问题,我认为您应该将该字符串作为inputstring 参数传递给getCommand()(您的函数签名采用该参数,但您可以这样做)什么都没有)。 哦,哎呀。当我一直在调整这段代码时,我一定把它留在了签名中。如前所述,我考虑将字符串添加到函数中,但由于它确实是函数将从中读取的唯一字符串,因此我不太喜欢该解决方案。 (我想如果它没有坏的话......) 【参考方案1】:

如果您从main() 调用getCommand(),您应该能够传递变量。

int main(void) 
    string stdinstring = ""; 
    string answer = getCommand(0, stdinstring);

如果您从其他地方调用getCommand(),则必须将变量从main() 传递给该函数,然后再传递给getCommand()。此外,您应该能够使其成为全球性的,但没有代码我不知道您为什么不能这样做。

//stdinstring = "a" in the case (how is this set to anything but it?
string getCommand(int input_pos,string inputstring)

   int temp_paren=0;
   int begin_pos = stdinstring.rfind("(",input_pos); //This equals -1 
   int len = 0;
   while (temp_paren>0 && len < 10) //There is no ( so the loop terminates with len=10
   
      if (stdinstring.substr(begin_pos+len,1)=="(") temp_paren++;
      if (stdinstring.substr(begin_pos+len,1)==")") temp_paren--;
     len++;
   
   return stdinstring.substr(begin_pos,len); //returns the first 10 chars of stdinstring which would be "a"

【讨论】:

我会粘贴代码,但它相当冗长,而且我不知道哪些部分可能是相关的。不过我会尽量减少它,它大约有 200 行。 只要确保粘贴任何包含相关变量的代码即可。 就在今天早些时候,我的朋友(从事类似项目)有一个错误,我们发现这是由于他的“endl”展示位置......从那时起,我一直非常警惕可能相关的内容代码:) 2 件事。在您的第一组代码(没有全局代码)中,您在getCommand() 中使用stdinstring,其中参数名称为inputstring,您应该使用inputstring。其次,我在答案中写下了我认为在 getCommand 方法中发生的事情。 stdinstring = "a";只是我在四处调整,看看我是否可以让那些看起来消失的垃圾字符。此外,我忽略了将我的输入添加到这个程序中,它有很多括号......呵呵。由于运行 getCommand 的位置,基本上可以保证 rfind 永远不会得到 -1。无论如何,我发现我正在做的事情有一个重大缺陷——我试图在标准输入字符串完全构建之前读取它......

以上是关于C++:从函数访问主变量的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 调用 Java 方法的最简单方法是啥?

使用 SWIG 包装对象从 C++ 调用 Python 函数的最简洁方法是啥

从 QML 简单访问 C++ 对象数据

从 C++ 解压缩 ZIP 的最简单方法? [复制]

如何从外部函数 C++ 访问动态结构?

在视图中访问 Phalcon 配置值的最简单方法是啥?