1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

An Access Violation Segmentation Fault

Discussion in 'C++' started by boschow, Jan 31, 2008.

  1. boschow

    boschow New Member

    Joined:
    Feb 22, 2007
    Messages:
    32
    Likes Received:
    0
    Trophy Points:
    0
    Hello,
    i everyone, i made some code to simulate the working of a shade motor and but it dosent work because an error appear which states An Access Violation Segmentation Fault raised in your program, i dont know what to do, perhaps you guys can figure that out.

    Code:
    #include <iostream>
    using namespace std;
    
    struct NVAR_DigitalOutputOnOff
    {
            bool wm_bc;
            bool do_bc;
            bool do_bs; 
    };
    
    struct VAR_DigitalOutputOnOff
    {
            bool dom_bs;
            bool doa_bs;          
    };
    struct NVAR_DigitalInput
    {
            bool di_bs;
    };
    
    struct NVAR_ShadeVar
    {
            int shadeVar;
            int shadeTime;
            int shadeRef;
            int shadeOff;
            int temp_time;
            char flag_shade;
    };
    
    struct MainModule
    {
        NVAR_DigitalOutputOnOff         digOutN[2];
        VAR_DigitalOutputOnOff          digOutV[2];
        NVAR_DigitalInput               digInpN[2];
        NVAR_ShadeVar                   m01_var[1];   
    };
    
     void shadeM01(
                   NVAR_DigitalOutputOnOff *digOut1N, 
                   NVAR_DigitalOutputOnOff *digOut2N,
                   VAR_DigitalOutputOnOff *digOut1V, 
                   VAR_DigitalOutputOnOff *digOut2V,
                   NVAR_DigitalInput *digInp3, 
                   NVAR_DigitalInput *digInp4, 
                   NVAR_ShadeVar *shadeVar, 
                   int shade_time) 
     {  
     																						 
      if (digOut1N->wm_bc  // Q1 MANUAL
          && digOut2N->wm_bc) // Q2 MANUAL
          { 
            if (shadeVar->flag_shade == 0) // ZALUZIJE MIRUJEJO
            {
              if ((digInp3->di_bs
                  ^ digOut1N->do_bc)
                  && !digInp4->di_bs
                  && !digOut2N->do_bc) // KOMANDA TOUCHA SPUSCANJA NI AKTIVNA 
              { 
                  shadeVar->flag_shade = 1;
                  // digOut2->dom_bs = 0;
              } else digOut1V->dom_bs = 0; 
                            	    
              if ((digInp4->di_bs
              		^digOut2N->do_bc)
                && !digInp3->di_bs
                && !digOut1N->do_bc)
              { 
                  shadeVar->flag_shade = 2;
                 // digOut1->dom_bs = 0;
              } else digOut2V->dom_bs = 0;
            }               	    
            else if (shadeVar->flag_shade == 1) // ODPIRANJE ZALUZIJ
            { 
              if (shadeVar->shadeTime < shade_time)
              {
                if (digInp3->di_bs
                  ^digOut1N->do_bc)
                {
                  if (shadeVar->temp_time < 833)
                  {
                    shadeVar->temp_time++;
                    digOut1V->dom_bs = 1;
                  } 
                  else if (shadeVar->temp_time == 833)
                  {
                    shadeVar->temp_time = 0;
                    shadeVar->shadeTime++;
                  }
                } 
                else 
                {
                  if (shadeVar->temp_time < 833)
                  {
                    shadeVar->temp_time++;
                    digOut1V->dom_bs = 1;
                  } 
                  else if (shadeVar->temp_time == 833)
                  {
                    digOut1V->dom_bs = 0;
                      if (shadeVar->shadeOff < 255)
                      {
                        shadeVar->shadeOff++;
                      } 
                      else if (shadeVar->shadeOff == 255)
                      {
                        shadeVar->shadeTime++;
                        shadeVar->flag_shade = 0;
                        shadeVar->shadeOff = 0;
                        shadeVar->temp_time = 0;
                      }
                  }
                }
              }
              else 
              { // ZALUZIJE ODPRTE
                digOut1V->dom_bs = 0;
                digOut1N->do_bc = 0;
                shadeVar->shadeTime = shade_time;
                shadeVar->flag_shade = 0;
              }		
            }
            else if (shadeVar->flag_shade == 2) // ZAPIRANJE ZALUZIJ 
            { 
              if (shade_time > 0)
              {
                if (digInp4->di_bs
                    ^digOut2N->do_bc)
                {
                  if (shadeVar->temp_time < 833) 
                  {
                    shadeVar->temp_time++;
                    digOut2V->dom_bs = 1;
                  } 
                  else if (shadeVar->temp_time == 833)
                  {
                    shadeVar->temp_time = 0;
                    shadeVar->shadeTime--;
                  }
                } 
                else 
                {
                  if (shadeVar->temp_time < 833)
                  {
                    shadeVar->temp_time++;
                    digOut2V->dom_bs = 1;
                  } 
                  else if (shadeVar->temp_time == 833)
                  {
                    digOut2V->dom_bs = 0;
                      if (shadeVar->shadeOff < 255)
                      {
                        shadeVar->shadeOff++;
                      } 
                      else if (shadeVar->shadeOff == 255)
                      {
                        shadeVar->shadeTime--;
                        shadeVar->flag_shade = 0;
                        shadeVar->shadeOff = 0;
                        shadeVar->temp_time = 0;
                      }
                  }
                }
              }
              else 
              { // ZALUZIJE ZAPRTE
                digOut2V->dom_bs = 0;
                digOut2N->do_bc = 0;
                shadeVar->shadeTime = 0;
                shadeVar->flag_shade = 0;
              }		
            }
            //vpisi8(nvvar,shadeRef, shadeVar->shade_time);                       	 
          }
      }
    
    //MainModule *MM;
    
    int main()
    {   
        int shade_time = 0;
        cout << "Digital output 1: " << endl;
        cout << "insert 1 - manual mode" << endl; 
        cout << "insert 0 - auto mode" << endl;  
        cin >> MM->digOutN[0].wm_bc;
        
        cout << "Digital output 2: " << endl;
        cout << "insert 1 - manual mode" << endl; 
        cout << "insert 0 - auto mode" << endl; 
        cin >> MM->digOutN[1].wm_bc;
          
        shadeM01(&MM->digOutN[0],  //NVAR_DigitalOutputOnOff *digOut1N 
                 &MM->digOutN[1],  //NVAR_DigitalOutputOnOff *digOut2N
                 &MM->digOutV[0],  //VAR_DigitalOutputOnOff *digOut1V
                 &MM->digOutV[1],  //VAR_DigitalOutputOnOff *digOut2V
                 &MM->digInpN[0],  //NVAR_DigitalInput *digInp3
                 &MM->digInpN[1],  //NVAR_DigitalInput *digInp4
                 &MM->m01_var[0],  //NVAR_ShadeVar *shadeVar
                 shade_time);      //int shade_time
        
        cout << "State of first output" << MM->digOutN[0].do_bs << endl;
        cout << "State of second output" << MM->digOutN[1].do_bs << endl;
        
        return 0;
    }
    
    Thanks for your time and help.
    Best Regards,
    Boschow.
     
  2. Salem

    Salem New Member

    Joined:
    Nov 15, 2007
    Messages:
    133
    Likes Received:
    5
    Trophy Points:
    0
    Occupation:
    Please don't PM me for 1:1 support.
    Aside from the fact that it doesn't compile since you commented out
    //MainModule *MM;

    You also seem to have removed (or it was never there to begin with) the statement which assigns MM to point to some real memory. As an uninitialised global, it will just be NULL and that'll get you a seg fault every time.
     
  3. boschow

    boschow New Member

    Joined:
    Feb 22, 2007
    Messages:
    32
    Likes Received:
    0
    Trophy Points:
    0
    Thanks for the advice, i come up with some solutions, which of this you think is the best choice ?

    1.solution
    Code:
     MainModule MM;   // this is the object
     MainModule *pMM; // This is a pointer to a struct of type MainModule
    
    2.solution
    Code:
    MM = new MainModule();
    
    Best regards,
    BoSCHoW.
     

Share This Page