0

Here I have a part of my code. There are 2 simple structures which are later used in the .cpp Send() method.

    //In the header file I have

        #define P32 (unsigned int)
        #define P16 (unsigned short)
        #define P8 (unsigned char)

        struct nd {
            P8 p;
            P8 c;
            P16 l;
        };

        struct HELLO {
            P32 a1;
            P32 a2;
            P8  a3;
        };


    //In the .cpp I have

        void Send()
        {
            DWORD dw = nd_s + sizeof( HELLO);
            BYTE *HelloPac=new BYTE[dw];
            nd *HelloHr=(nd*)HelloPac; 
            HELLO* _Hello=(HELLO*)(HelloPac+nd_s);

            HelloHr->c=0x10;
            HelloHr->p=0x09;
            Hellohr->l=36;

            _HELLO->a1=6001;
            _HELLO->a2=0
            _HELLO->a3=120;

           //my own read write function
           streamReadWrite->Write(HelloPac, dw);
        }

I am writing the same code in Java (porting the code). I am confused since I haven't done much coding in Java and since Java has no pointers no structures no unsigned integers, I am not getting how the syntax will be for the above code. Here's what I have got, but t throws syntax errors:

public class abc {

    private static final int nd_s = 4; //hard-coded

    public class nd
    {
        public byte p;
        public byte c;
        public short l;
    }

    public class HELLO
    {        
        public int a1;
        public int a2;
        public byte a3;
    }

    private void Send()
    {    
        int dw = nd_s + 30;
        byte[] HelloPac = new byte[dw];
        nd HelloHr = (nd)HelloPac;
        HELLO _Hello = (HELLO)(HelloPac + nd_s);
    }
}

Where am I going wrong in typecasting?

TJ13
  • 75
  • 3
  • 8
  • You should use `typedef` instead of `#define`, `std::vector` instead of `new[]`, and not use [reserved identifiers](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier). – chris Jul 29 '14 at 22:27

3 Answers3

2

You can't cast the object HelloPac (whose type is byte array) to the type nd.

If you wish to create an instance of nd that gets initialized by the values of HelloPac, use a constructor :

public class nd 
{
...
    public nd (byte[] input)
    {
        // initialize the members here
    }
...
}
...
nd HelloHr = new nd (HelloPac);

BTW, if you're going to code in Java, please use Java naming conventions : Class names in Upper case, variable names in camelCase.

Eran
  • 387,369
  • 54
  • 702
  • 768
0

use constructors in your class to initialize objects to the class to what ever value you are trying to set.

To do this: nd HelloHr = (nd)HelloPac;

Add this constructor in the class Nd

public class Nd
    {
        public byte p;
        public byte c;
        public short l;
        List<Byte> byteList;

        public Nd( Byte[] byteArray)
        {
            byteList = new List<Byte>;

             for(Byte byte : byteArray)
               byteList.add(byte)
        }
    }

Or some logic like this in constructor.

Do similar logic for the Hello assignment.

SonalKhodiyar
  • 695
  • 8
  • 16
0

A reference to a particular object acts as a pointer to that object in Java but it does not support pointer arithmetic unlike C/C++.

HELLO hello1 = new HELLO();
//Put values
hello1.a1 = 5 

//You should not use public variables, make them private and use getter/setter

....
HELLO hello2 = new HELLO();
//Put values
hello2.a1 = 15 
....

Here hello1 and hello2 are references to objects of type HELLO that we created.

If you want to store references to all HELLO objects in a sequential order, you can store them in an Array of type HELLO.

HELLO[] helloArray = new HELLO[10];
helloArray [0] = hello1;
helloArray [1] = hello2;

You can browse the objects by iterating over the array.

Or you could use linked list .

public class HELLO
{        

    HELLO nextHallo; // Store reference to next hello object.
    public int a1;
    public int a2;
    public byte a3;
}
HELLO hello1 = new HELLO();
hello1.a1 = 5 (Ideally you should not have public variables)
....
HELLO hello2 = new HELLO();
hello2.a1 = 15 
..........

hello1.nextHallo = hello2;

To browse all hello objects in the linked list -

HELLO helloReference = hello1; //Reference to first object
while(helloReference!=null)
{
  helloReference = helloReference.nextHallo ;
  performSomeOperation(helloReference)
}

Update for OP's question about how to create an instance of nd that gets initialized by the values of HelloPac:

byte[] HelloPac = new byte[dw];
nd instance = new nd();
//HelloPac[0] is first byte
nd.p=HelloPac[0]; // Ideally should be done inside constructor of nd
nd.c = HelloPac[1]; //2nd byte

nd.l is a short which is of size 2 bytes so we need to combine 2 bytes HelloPac[2] & HelloPac[3] to obtain short value and assign to nd.l.

This can be done in following ways - 2 bytes to short java or Convert from 2 or 4 bytes to signed/unsigned short/int

Note : Normally we would use inbuilt collections like ArrayList and LinkedList to represent same in java. And code snippets provided my here do not adhere to preferred java coding standards.

Community
  • 1
  • 1
spujap
  • 101
  • 1
  • 4