in reply to Re^4: How to assign a variable its width/vector
in thread How to assign a variable its width/vector

First off, uncomment strictures and fix the errors reported. At the very least, as your code stands, $len_ofinstr and $len_inst are used before they are assigned a value which is likely to be wrong.

What do you expect length to do?

What do you expect 'use bytes' to do? (The module's documentation says "use of this module for anything other than debugging purposes is strongly discouraged".)

Writing a test script of the form:

#!user/bin/perl use warnings; use strict; my $inFile = <<FILE; FILE ... open my $fIn, '<', \$inFile; while (defined (my $line = <$fIn>)) { ... }

and telling use what you expect as output would go a long way to making your issue clear to us. The open ... \$inFile; bit opens a string as a file which is a nice way of including sample data in your script while retaining the structure of file I/O of the full script.

Perl is the programming world's equivalent of English

Replies are listed 'Best First'.
Re^6: How to assign a variable its width/vector
by samd (Novice) on Apr 15, 2014 at 07:50 UTC

    Basically i am trying to read a hexadecimal string such as the below mentioned

    0x401d50 0x360aa7c030 0x405dc2 0x405dc9 0x405dd0 0x405dd5 0x405dd8 0x401bb0

    compute the length of the same in bytes and compare to see if its lesser than 32 bytes(which is the size of a register that is going to hold all these addresses, which i am referring to as buffer) and if the comparison satisfies then i keep loading the instrutions until the register is full i.e unti lit reaches 32 bytes. Once it does i call it a miss .

    #! user/bin/perl #use strict; #use warnings; $length_buffer= 0x100; $base= 0; $base_end= ($base+ $length_buffer-1); open(FILE1," < output_log.txt") or die "can't read the file"; + while(<FILE1>) { $inst_addr= $_; if($inst_addr) { use bytes; + $len_ofinstr=length( $inst_addr); + print " Length in bytes: ", $len_ofinstr, "\n"; + if($len_ofinstr >= $base && $len_ofinstr <=$base_end) { print FILE2 $hit. "\n"; print " The inst fits in the buffer->hit, \n"; $len_ofinstr+=$len_ofinstr; print "Total number of bytes in the buffer=", $len_ofinstr, "\ +n"; $count_hit=$count_hit+1; print " Number of hits in the buffer= $count_hit", "\n"; print FILE2 "number of hits in buffer". $count_hit. "\n"; } } else{ if($len_inst == $length_buffer) { print " it can not hold anymore, \n"; $base= $instr_addr & 0xffffffe0; } } }

    The snippet of the code is pasted above, the problem i am facing with the above pasted code is that, when $length_buffer= 0x100 (equivalent of the number 256 but not euvalent of 256 bits or 32 bytes) so the comparison is not really making any sense. Could anyone suggest how to fix this issue? thanks

      You seem to need the size (or length) neither in chars nor in bytes, but in bits.

      I think you can take the dec2bin from How do I convert between decimal and binary?

      Then, length dec2bin 0x100 (or length(dec2bin(0x100))) gives you a result of 9.

      Alternatively, to see if an address fits in 32 bits, you could compare it to 0xffffffff, which is the biggest value to fit.