Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. An 'If' statement before my char declaration is not allowing my program to compile......why?

An 'If' statement before my char declaration is not allowing my program to compile......why?

Scheduled Pinned Locked Moved C / C++ / MFC
questionhelp
19 Posts 5 Posters 3 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Endomlic

    When I try to compile my code I get this error message: @: gcc -o hw3 hw3.c hw3.c: In function `main': hw3.c:20: parse error before `char' hw3.c:31: `buff' undeclared (first use in this function) hw3.c:31: (Each undeclared identifier is reported only once hw3.c:31: for each function it appears in.) The error occurs because of my if statement. When I place the if statement after the char declaration it works, also when I remove the if statement it compiles and works fine. if(argc == 1){ printf("Error: hw3 "); return 1; } Also for a plain "if(){}" as well. How do I get around this?

    #include
    #include
    #include
    #include

    int main(int argc, char * argv[])
    {
    //our file references and read and write counts
    int fileread, filewrite;
    ssize_t nread, nwrite;

    if(argc == 1){
    	printf("Error: hw3 ");
    	return 1;
    }
    
    //our buffer size is determined by the user
    char buff\[ (int)argv\[2\] \];
    
    // open 128kB file for reading
    // create if it doesn't exist copy.bmp for writing
    fileread = open("128kB.bmp", O\_RDONLY);
    filewrite = creat("copy.bmp", O\_WRONLY);
    
    //copy all of the contents of the file	
    while(1)
    {
    	//read data from the input file and place in the buffer
    	nread = read(fileread, buff, sizeof(buff) );
    
    	//if no information left to read, exit while loop
    	if (nread == 0) break;
    
    	//write the data from the buffer into the output file
    	nwrite = write(filewrite, buff, sizeof(buff) - 1 );
    }
    
    //close the files
    close(fileread);
    close(filewrite);
    
    return 0;
    

    }

    I am using a putty terminal connected to a unix machine.

    E Offline
    E Offline
    Eytukan
    wrote on last edited by
    #3

    Endomlic wrote:

    char buff[ (int)argv[2] ];

    1. You are trying to create buffer dynamically. -Without specifying a constant value for memory allocation. It requires you to use "new". 2. Use atoi to convert argv[2] to an int value. You cannot just cast like that. Example:

    char* buff = new char[atoi(argv[2])];

    He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

    R 1 Reply Last reply
    0
    • R Rajesh R Subramanian

      Endomlic wrote:

      When I place the if statement after the char declaration it works

      Then, why not do it that way? :~ I reckon good old C compilers expect you to declare all the variables used in a a function at the very beginning of the function block and not anywhere in between. I also think that more recent versions of C compilers allow this.

      It is a crappy thing, but it's life -^ Carlo Pallini

      E Offline
      E Offline
      Endomlic
      wrote on last edited by
      #4

      If I declare the char beforehand then I can't use the if statement as intended. I need to see if they actually entered a buffer size, if not then the program will crash with the wrong error message I want displayed. That's where the if statement comes in. The if will break the program if they do not specify a buffer size. and if they do then it will be used as the char buff array size. How else can I declare a char buffer size and change it after the if?

      R 1 Reply Last reply
      0
      • E Eytukan

        Endomlic wrote:

        char buff[ (int)argv[2] ];

        1. You are trying to create buffer dynamically. -Without specifying a constant value for memory allocation. It requires you to use "new". 2. Use atoi to convert argv[2] to an int value. You cannot just cast like that. Example:

        char* buff = new char[atoi(argv[2])];

        He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

        R Offline
        R Offline
        Rajesh R Subramanian
        wrote on last edited by
        #5

        VuNic wrote:

        char* buff = new char[atoi(argv[2])];

        Dynamic buffer? "new"? It is a C program and I see the issue is different. The OP is attempting to do something that his version of compiler doesn't support. I might be wrong though...

        It is a crappy thing, but it's life -^ Carlo Pallini

        E 1 Reply Last reply
        0
        • E Endomlic

          If I declare the char beforehand then I can't use the if statement as intended. I need to see if they actually entered a buffer size, if not then the program will crash with the wrong error message I want displayed. That's where the if statement comes in. The if will break the program if they do not specify a buffer size. and if they do then it will be used as the char buff array size. How else can I declare a char buffer size and change it after the if?

          R Offline
          R Offline
          Rajesh R Subramanian
          wrote on last edited by
          #6

          Endomlic wrote:

          How else can I declare a char buffer size and change it after the if?

          Declaring it as a pointer variable prior to the if statement, and doing dynamic memory allocation later sounds like a viable option? Or may be switch to a more recent version of the compiler that supports declaring variables anywhere.

          It is a crappy thing, but it's life -^ Carlo Pallini

          1 Reply Last reply
          0
          • R Rajesh R Subramanian

            VuNic wrote:

            char* buff = new char[atoi(argv[2])];

            Dynamic buffer? "new"? It is a C program and I see the issue is different. The OP is attempting to do something that his version of compiler doesn't support. I might be wrong though...

            It is a crappy thing, but it's life -^ Carlo Pallini

            E Offline
            E Offline
            Eytukan
            wrote on last edited by
            #7

            Oops! "malloc" then. The idea is same in C right? How will it allow you to create buffers without knowing the size? But I'm not sure. Formatted C:\! from my brain. quite a while before :rolleyes:

            He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

            E R 2 Replies Last reply
            0
            • E Eytukan

              Oops! "malloc" then. The idea is same in C right? How will it allow you to create buffers without knowing the size? But I'm not sure. Formatted C:\! from my brain. quite a while before :rolleyes:

              He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

              E Offline
              E Offline
              Endomlic
              wrote on last edited by
              #8

              yea, how do I do it using malloc :O

              E 1 Reply Last reply
              0
              • E Endomlic

                yea, how do I do it using malloc :O

                E Offline
                E Offline
                Eytukan
                wrote on last edited by
                #9

                char * buff = (char*)malloc(atoi(argv[2]));

                He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                E 1 Reply Last reply
                0
                • E Eytukan

                  Oops! "malloc" then. The idea is same in C right? How will it allow you to create buffers without knowing the size? But I'm not sure. Formatted C:\! from my brain. quite a while before :rolleyes:

                  He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                  R Offline
                  R Offline
                  Rajesh R Subramanian
                  wrote on last edited by
                  #10

                  VuNic wrote:

                  How will it allow you to create buffers without knowing the size?

                  Some versions of the GNU C compilers allocate memory equivalent to the size of a medium grapefruit and hope for the best when the size requirement isn't exactly known. :laugh: OK, you know it's malloc, of course. Plus, there was the other problem which I stated in my reply to the OP. :)

                  It is a crappy thing, but it's life -^ Carlo Pallini

                  E CPalliniC 2 Replies Last reply
                  0
                  • E Eytukan

                    char * buff = (char*)malloc(atoi(argv[2]));

                    He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                    E Offline
                    E Offline
                    Endomlic
                    wrote on last edited by
                    #11

                    I've tried that, but it acts as if it's not assigning buff with a size. in other words it's not working.

                    E 1 Reply Last reply
                    0
                    • R Rajesh R Subramanian

                      VuNic wrote:

                      How will it allow you to create buffers without knowing the size?

                      Some versions of the GNU C compilers allocate memory equivalent to the size of a medium grapefruit and hope for the best when the size requirement isn't exactly known. :laugh: OK, you know it's malloc, of course. Plus, there was the other problem which I stated in my reply to the OP. :)

                      It is a crappy thing, but it's life -^ Carlo Pallini

                      E Offline
                      E Offline
                      Eytukan
                      wrote on last edited by
                      #12

                      :laugh: :laugh:

                      He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                      E 1 Reply Last reply
                      0
                      • E Eytukan

                        :laugh: :laugh:

                        He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                        E Offline
                        E Offline
                        Endomlic
                        wrote on last edited by
                        #13

                        Yay I got it to work! It was char* buff; if statement; buff = (char*) malloc( sizeof(char) * atoi( argv[1] ) ); Apparently I had to use argv 1 instead of 2. I guess in gcc argv 0 is the program name. Thanks to you guys for all the help!!

                        E CPalliniC 3 Replies Last reply
                        0
                        • E Endomlic

                          I've tried that, but it acts as if it's not assigning buff with a size. in other words it's not working.

                          E Offline
                          E Offline
                          Eytukan
                          wrote on last edited by
                          #14

                          Endomlic wrote:

                          but it acts as if it's not assigning buff with a size. in other words it's not working.

                          Are you really passing the Command-line argument? I think you are not. Command line args start from 0. If you are trying to mean the first argument, You must use argv[1] and not argv[2]. argv[0] the refers to the program name. Just try the below code to test how it allocates memory dynamically.

                          char size[]="10";
                          char * chBuff = (char*)malloc(sizeof(char)*atoi(size));
                          strcpy(chBuff,"TestMail");
                          for(int i=0;i<8;i++)
                          {
                          printf("%c",chBuff[i]);
                          }

                          He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                          1 Reply Last reply
                          0
                          • E Endomlic

                            Yay I got it to work! It was char* buff; if statement; buff = (char*) malloc( sizeof(char) * atoi( argv[1] ) ); Apparently I had to use argv 1 instead of 2. I guess in gcc argv 0 is the program name. Thanks to you guys for all the help!!

                            E Offline
                            E Offline
                            Eytukan
                            wrote on last edited by
                            #15

                            I figured it out. Took few minutes to type this[^]. lol that's great you got it! :thumbsup:

                            He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                            1 Reply Last reply
                            0
                            • R Rajesh R Subramanian

                              VuNic wrote:

                              How will it allow you to create buffers without knowing the size?

                              Some versions of the GNU C compilers allocate memory equivalent to the size of a medium grapefruit and hope for the best when the size requirement isn't exactly known. :laugh: OK, you know it's malloc, of course. Plus, there was the other problem which I stated in my reply to the OP. :)

                              It is a crappy thing, but it's life -^ Carlo Pallini

                              CPalliniC Offline
                              CPalliniC Offline
                              CPallini
                              wrote on last edited by
                              #16

                              :-D I missed this one. Thanks to an anonymous report (or 'signalation?' :laugh: ) it is now in the list it deserves...[^] Welcome again in the CP's memorable quotes page, Rajesh. :)

                              If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                              This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
                              [My articles]

                              In testa che avete, signor di Ceprano?

                              1 Reply Last reply
                              0
                              • E Endomlic

                                Yay I got it to work! It was char* buff; if statement; buff = (char*) malloc( sizeof(char) * atoi( argv[1] ) ); Apparently I had to use argv 1 instead of 2. I guess in gcc argv 0 is the program name. Thanks to you guys for all the help!!

                                CPalliniC Offline
                                CPalliniC Offline
                                CPallini
                                wrote on last edited by
                                #17

                                I guess in any C program argv[0] is the program name... :rolleyes:

                                If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                                This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
                                [My articles]

                                In testa che avete, signor di Ceprano?

                                1 Reply Last reply
                                0
                                • E Endomlic

                                  Yay I got it to work! It was char* buff; if statement; buff = (char*) malloc( sizeof(char) * atoi( argv[1] ) ); Apparently I had to use argv 1 instead of 2. I guess in gcc argv 0 is the program name. Thanks to you guys for all the help!!

                                  E Offline
                                  E Offline
                                  Eytukan
                                  wrote on last edited by
                                  #18

                                  Endomlic wrote:

                                  I guess in gcc argv 0 is the program name.

                                  Not just in gcc, it's the same everywhere. :) good night!

                                  He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

                                  1 Reply Last reply
                                  0
                                  • E Endomlic

                                    When I try to compile my code I get this error message: @: gcc -o hw3 hw3.c hw3.c: In function `main': hw3.c:20: parse error before `char' hw3.c:31: `buff' undeclared (first use in this function) hw3.c:31: (Each undeclared identifier is reported only once hw3.c:31: for each function it appears in.) The error occurs because of my if statement. When I place the if statement after the char declaration it works, also when I remove the if statement it compiles and works fine. if(argc == 1){ printf("Error: hw3 "); return 1; } Also for a plain "if(){}" as well. How do I get around this?

                                    #include
                                    #include
                                    #include
                                    #include

                                    int main(int argc, char * argv[])
                                    {
                                    //our file references and read and write counts
                                    int fileread, filewrite;
                                    ssize_t nread, nwrite;

                                    if(argc == 1){
                                    	printf("Error: hw3 ");
                                    	return 1;
                                    }
                                    
                                    //our buffer size is determined by the user
                                    char buff\[ (int)argv\[2\] \];
                                    
                                    // open 128kB file for reading
                                    // create if it doesn't exist copy.bmp for writing
                                    fileread = open("128kB.bmp", O\_RDONLY);
                                    filewrite = creat("copy.bmp", O\_WRONLY);
                                    
                                    //copy all of the contents of the file	
                                    while(1)
                                    {
                                    	//read data from the input file and place in the buffer
                                    	nread = read(fileread, buff, sizeof(buff) );
                                    
                                    	//if no information left to read, exit while loop
                                    	if (nread == 0) break;
                                    
                                    	//write the data from the buffer into the output file
                                    	nwrite = write(filewrite, buff, sizeof(buff) - 1 );
                                    }
                                    
                                    //close the files
                                    close(fileread);
                                    close(filewrite);
                                    
                                    return 0;
                                    

                                    }

                                    I am using a putty terminal connected to a unix machine.

                                    K Offline
                                    K Offline
                                    ky_rerun
                                    wrote on last edited by
                                    #19

                                    This should never compile. You must declare arrays with literals or assign them so the complier can calculate a size. When you create this array the size of the array * the sizeof(char) will be subtracted from the stack pointer. If you want a dynamic array you have to use malloc. When you use a char * and a malloc the Size of buff is the size of a char * which will be 4 regardless of how much memory you allocate. In C you will need to maintain a separate value to indicate the size of the allocated array that is why every api function that takes an allocated buffer also takes a parameter that specifies the size of the buffer or a buffer that has a way of indicating the end element as is in a null terminator on the end of char strings.


                                    a programmer traped in a thugs body

                                    1 Reply Last reply
                                    0
                                    Reply
                                    • Reply as topic
                                    Log in to reply
                                    • Oldest to Newest
                                    • Newest to Oldest
                                    • Most Votes


                                    • Login

                                    • Don't have an account? Register

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • World
                                    • Users
                                    • Groups