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
  1. Home
  2. General Programming
  3. C#
  4. Invalid Argument in For Loop

Invalid Argument in For Loop

Scheduled Pinned Locked Moved C#
csharplinqhelpquestion
24 Posts 6 Posters 0 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.
  • OriginalGriffO OriginalGriff

    There are two problems here: firstly that an array index needs to be an integer - and a uint needs an explicit cast to int - you can't use an implicit cast because it could "throw away" data in the form of positive values with the top bit set. Easiest solution: use int value in your for loop. The second problem is that the BitArray indexer does not return an int value: it returns a bool. So if you correct the first error, the compiler will complain that it cannot compare an int with a bool! Those are easily fixed to let your program compile:

    for (int counter = 0; counter < Totbyte; counter++)
    {
    dataB[0] = data[counter];
    for (int count = 0; count < bits.Length; count++)
    {
    if (!bits[count])
    Console.Write(bits[count] ? "1" : "0");
    }
    }

    But... It's not going to work. You don't change the value in Bits at all inside your outer loop - so each byte "value" is going to print as the same sequence of bits. Personally, I wouldn't use a BitArray - it's an unnecessary complication here - just use the C# standard bit manipulation operators:

    for (int counter = 0; counter < Totbyte; counter++)
    {
    int b = (int) data[counter];
    for (int count = 0; count < 8; count++)
    {
    Console.Write(b & 1);
    b = b >> 1;
    }
    }

    Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952) Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)

    C Offline
    C Offline
    computerpublic
    wrote on last edited by
    #15

    I only need to evaluate if whether or not a "0" exist in the BitArray string. I dont care about the "1".

    OriginalGriffO 1 Reply Last reply
    0
    • L Lost User

      You cannot use an unsigned as an index, it must be signed. And you cannot compare a bit with the integer value zero. A bit can only be true or false. Change the loop code to

      for (int count = 0; count < bits.Length; count++)
      {
      if (bits[count])
      Console.Write(bits[count] ? "1" : "0");
      }

      C Offline
      C Offline
      computerpublic
      wrote on last edited by
      #16

      I only need to evaluate if whether or not a "0" exist in the BitArray string. I dont care about the "1".

      L 1 Reply Last reply
      0
      • C computerpublic

        I only need to evaluate if whether or not a "0" exist in the BitArray string. I dont care about the "1".

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #17

        Then just test for false; the BitArray[item] is a boolean value.

        C 1 Reply Last reply
        0
        • L Lost User

          Then just test for false; the BitArray[item] is a boolean value.

          C Offline
          C Offline
          computerpublic
          wrote on last edited by
          #18

          Should it be: bool a = false; a=bits[count]; if (a) { } is this correct?

          L 1 Reply Last reply
          0
          • C computerpublic

            Should it be: bool a = false; a=bits[count]; if (a) { } is this correct?

            L Offline
            L Offline
            Lost User
            wrote on last edited by
            #19

            No, you should just be testing the specific bit:

            if (!bits[count])
            // OR
            if (bits[count] == false)

            However, having looked more closely at your code I am at a loss to understand what the program is supposed to do. In particular why you are reading those files and why you are writing new copies of them, or what any of that has to do with your for loops.

            C 1 Reply Last reply
            0
            • C computerpublic

              I only need to evaluate if whether or not a "0" exist in the BitArray string. I dont care about the "1".

              OriginalGriffO Offline
              OriginalGriffO Offline
              OriginalGriff
              wrote on last edited by
              #20

              And what are you going to do if it is a one? now print anything? :laugh: Trust me: AND the value with 1 returns either 0 or 1 depending on the state of teh least significant bit the in value. Using >> then shifts the whole input down a single bit, so the second bit takes the place of first, and so forth. It's a lot more efficient than using a BitString for each byte.

              Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952) Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)

              "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
              "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

              1 Reply Last reply
              0
              • L Lost User

                No, you should just be testing the specific bit:

                if (!bits[count])
                // OR
                if (bits[count] == false)

                However, having looked more closely at your code I am at a loss to understand what the program is supposed to do. In particular why you are reading those files and why you are writing new copies of them, or what any of that has to do with your for loops.

                C Offline
                C Offline
                computerpublic
                wrote on last edited by
                #21

                /*No more errors. My input to the program is letter "e" which is enclosed within a text file in c:\\folder9. The decimal equivalent of letter "e" is 101. When I run 101 thru the BitArray, it evaluates all bits as false which is NOT CORRECT.*/
                using System;
                using System.IO;
                using System.Collections;
                using System.Collections.Generic;
                using System.Linq;
                using System.Text;

                namespace Applica
                {
                class Program
                {
                static void Main(string[] args)
                {
                DirectoryInfo da = new DirectoryInfo("C:\\Folder9");
                FileInfo[] Arr = da.GetFiles();
                if (Arr.Length == 0)
                {
                throw new InvalidOperationException("No files found.");
                }
                // No need to loop through the array just to get the last item:
                FileInfo ap = Arr[Arr.Length - 1];
                long Totbyte = ap.Length;
                string filePath = ap.FullName;
                Console.WriteLine("Total Bytes = {0} bytes", Totbyte);
                // GetTempFileName *creates* the file, so it always exists:
                string temPath = Path.GetTempFileName();
                byte[] data = File.ReadAllBytes(filePath);
                File.WriteAllBytes(temPath, data);

                        byte\[\] dataB = new byte\[1\];
                        BitArray bits = new BitArray(dataB);
                        Console.WriteLine("length= {0}",bits.Length);
                        for (long counter = 0; counter < Totbyte; counter++)
                        {
                            dataB\[0\] = data\[counter\];
                            Console.WriteLine("{0}", dataB\[0\]);
                            for (int count = 0; count < bits.Length; count++)
                            {
                                if (bits\[count\] == true)
                                    Console.WriteLine("{0}", bits\[count\]);
                                if (bits\[count\] == false)
                                    Console.WriteLine("{0}", bits\[count\]);
                            }
                        }
                    }
                }
                

                }

                L 1 Reply Last reply
                0
                • C computerpublic

                  /*No more errors. My input to the program is letter "e" which is enclosed within a text file in c:\\folder9. The decimal equivalent of letter "e" is 101. When I run 101 thru the BitArray, it evaluates all bits as false which is NOT CORRECT.*/
                  using System;
                  using System.IO;
                  using System.Collections;
                  using System.Collections.Generic;
                  using System.Linq;
                  using System.Text;

                  namespace Applica
                  {
                  class Program
                  {
                  static void Main(string[] args)
                  {
                  DirectoryInfo da = new DirectoryInfo("C:\\Folder9");
                  FileInfo[] Arr = da.GetFiles();
                  if (Arr.Length == 0)
                  {
                  throw new InvalidOperationException("No files found.");
                  }
                  // No need to loop through the array just to get the last item:
                  FileInfo ap = Arr[Arr.Length - 1];
                  long Totbyte = ap.Length;
                  string filePath = ap.FullName;
                  Console.WriteLine("Total Bytes = {0} bytes", Totbyte);
                  // GetTempFileName *creates* the file, so it always exists:
                  string temPath = Path.GetTempFileName();
                  byte[] data = File.ReadAllBytes(filePath);
                  File.WriteAllBytes(temPath, data);

                          byte\[\] dataB = new byte\[1\];
                          BitArray bits = new BitArray(dataB);
                          Console.WriteLine("length= {0}",bits.Length);
                          for (long counter = 0; counter < Totbyte; counter++)
                          {
                              dataB\[0\] = data\[counter\];
                              Console.WriteLine("{0}", dataB\[0\]);
                              for (int count = 0; count < bits.Length; count++)
                              {
                                  if (bits\[count\] == true)
                                      Console.WriteLine("{0}", bits\[count\]);
                                  if (bits\[count\] == false)
                                      Console.WriteLine("{0}", bits\[count\]);
                              }
                          }
                      }
                  }
                  

                  }

                  L Offline
                  L Offline
                  Lost User
                  wrote on last edited by
                  #22

                  computerpublic wrote:

                  When I run 101 thru the BitArray, it evaluates all bits as false which is NOT CORRECT

                  But the problem is that you do not run that value through it. Your code is:

                          byte\[\] dataB = new byte\[1\];
                          // set bits to the content of dataB, which is null at this point
                          BitArray bits = new BitArray(dataB);
                          Console.WriteLine("length= {0}",bits.Length);
                          for (long counter = 0; counter < Totbyte; counter++)
                          {
                              dataB\[0\] = data\[counter\];
                              Console.WriteLine("{0}", dataB\[0\]);
                              // bits still does not contain any value
                              for (int count = 0; count < bits.Length; count++)
                              {
                                  // this can be simplified
                                  if (bits\[count\] == true)
                                      Console.WriteLine("{0}", bits\[count\]);
                                  if (bits\[count\] == false)
                                      Console.WriteLine("{0}", bits\[count\]);
                              }
                          }
                  

                  It should be

                          byte\[\] dataB = new byte\[1\];
                          for (long counter = 0; counter < Totbyte; counter++)
                          {
                              dataB\[0\] = data\[counter\];
                              BitArray bits = new BitArray(dataB);
                              Console.WriteLine("length= {0}",bits.Length);
                              Console.WriteLine("{0}", dataB\[0\]);
                              for (int count = 0; count < bits.Length; count++)
                              {
                                  Console.Write(bits\[count\] ? "1" : "0");
                              }
                              Console.WriteLine("");
                          }
                  
                  C 1 Reply Last reply
                  0
                  • L Lost User

                    computerpublic wrote:

                    When I run 101 thru the BitArray, it evaluates all bits as false which is NOT CORRECT

                    But the problem is that you do not run that value through it. Your code is:

                            byte\[\] dataB = new byte\[1\];
                            // set bits to the content of dataB, which is null at this point
                            BitArray bits = new BitArray(dataB);
                            Console.WriteLine("length= {0}",bits.Length);
                            for (long counter = 0; counter < Totbyte; counter++)
                            {
                                dataB\[0\] = data\[counter\];
                                Console.WriteLine("{0}", dataB\[0\]);
                                // bits still does not contain any value
                                for (int count = 0; count < bits.Length; count++)
                                {
                                    // this can be simplified
                                    if (bits\[count\] == true)
                                        Console.WriteLine("{0}", bits\[count\]);
                                    if (bits\[count\] == false)
                                        Console.WriteLine("{0}", bits\[count\]);
                                }
                            }
                    

                    It should be

                            byte\[\] dataB = new byte\[1\];
                            for (long counter = 0; counter < Totbyte; counter++)
                            {
                                dataB\[0\] = data\[counter\];
                                BitArray bits = new BitArray(dataB);
                                Console.WriteLine("length= {0}",bits.Length);
                                Console.WriteLine("{0}", dataB\[0\]);
                                for (int count = 0; count < bits.Length; count++)
                                {
                                    Console.Write(bits\[count\] ? "1" : "0");
                                }
                                Console.WriteLine("");
                            }
                    
                    C Offline
                    C Offline
                    computerpublic
                    wrote on last edited by
                    #23

                    I am noticing that the programs default operation is to evaluate the Most Significant Bit First and it evaluates the Least Significant Bit Last. I was not expecting this behavior. This this always the case the default case? Can I change the default operation to do LSB to MSB?

                    L 1 Reply Last reply
                    0
                    • C computerpublic

                      I am noticing that the programs default operation is to evaluate the Most Significant Bit First and it evaluates the Least Significant Bit Last. I was not expecting this behavior. This this always the case the default case? Can I change the default operation to do LSB to MSB?

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #24

                      See http://msdn.microsoft.com/en-us/library/x1xda43a(v=vs.110).aspx[^].

                      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