Niek Oosterlaak wrote:
> 
> Every now and again I like to program for fun. In this case it is a
> simulation. The basis is a grid that holds things like altitude,
> pieces and things like that. To hold all data in a way I can remember
> everything easily, I chose to put all in a multi dimensional array.
> If there is a better way, please do tell. Loading the grid from file
> gave me a surprise. The values in the array do not seem to be static.
> The change seems to occur after leaving the Reading loop. In this
> loop values do not change, calling them after the loop some values
> will have changed in a regular manner. References give similar
> results
> 
> Executing the program below gives a lot of differences. There is a
> discernable patern in where those differences occur which leads me to
> believe that perl is not at fault here, but me. (As I have sufficient
> trust in my programming abillities, that would have been the logical
> conclusion anyway.) Especially as another perl version on a linux
> machine exhibits the same behaviour. The Perl verion used here is
> v5.8.1 built for MSWin32-x86-multi-thread

Well, you didn't describe the pattern but on my computer the anomaly
shows up when $xiter is in the range 0 to 7 AND $yiter is in the range
10 to 70.  This looks like a bug in perl.  BTW I am running Perl 5.6.0
on Linux.


> Question: what am I doing wrong here?
> 
> my @GridMulti;               # Multi dimensional array: playing field
> my $GM_Height = 0;           # Height of terrain in units above 0
> my $MaxX = 80;               # Number of field columns
> my $MaxY = 70;               # Number of field rows
> my $MaxFields = (($MaxX + 1) * ($MaxY + 1)) - 1;
>                              # Number of fields
> 
> my @CheckArray1;             # First Check Array
> my @CheckArray2;             # Second Check Array
> 
> my $Differences = 0;         # Number of differences
> 
> #Reading loop. Using rand here to prevent a extremely long post
> for my $xiter (0 .. $MaxX) {
>   for my $yiter (0 .. $MaxY) {
>     $GridMulti[$xiter . $yiter . $GM_Height] = int (rand 256);
>     push @CheckArray1, $GridMulti[$xiter . $yiter . $GM_Height];

You say that you are using a multi-dimensional array but that is not it,
you are concatenating the numbers together in a single dimensional
array.  If you do use a multi-dimensional array it will solve your
problem:

    $GridMulti[ $xiter ][ $yiter ][ $GM_Height ] = int (rand 256);
    push @CheckArray1, $GridMulti[ $xiter ][ $yiter ][ $GM_Height ];


>   }
> }
> 
> #CheckLoop
> for my $xiter (0 .. $MaxX) {
>   for my $yiter (0 .. $MaxY) {
>     push @CheckArray2, $GridMulti[$xiter . $yiter . $GM_Height];

    push @CheckArray2, $GridMulti[ $xiter ][ $yiter ][ $GM_Height ];


>   }
> }
> 
> for my $iter (0 .. $MaxFields) {

You don't really need the $MaxFields variable:

for my $iter ( 0 .. $#CheckArray1 ) {


>   if ($CheckArray1[$iter] != $CheckArray2[$iter]) {
>     $Differences++;
>   }
> }
> 
> print "\n$Differences differences\n";



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to