Good day!

How i can return packed data into perl script?

For example:

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

MODULE = Mytest            PACKAGE = Mytest

SV*
getnum(char *number, int l)
 INIT:
       AV* array;
       int cccc,r,g,b;
       double y;
 CODE:
        int n = 0;
        int c=0; int cc=0; int ccc=0;
        array = newAV();
        double data[768], akf[768];
        while (n < l-256) { c++;
          if (c==1) {
            r=abs((int)number[n]);
//             printf("c - %d r - %d\n",c,r);
          }
          if (c==2) {
//             g=abs((int)number[n]);
//            printf("c - %d g - %d\n",c,g);
          }
          if (c==3) { cc++;
//             b=abs((int)number[n]);
//             printf("c - %d b - %d\n",c,b);
            c=0;
            y=r;
            if(cc%768!=0){
              data[cc]=y;
            }
            if (cc%768==0){
              data[cc]=y;
              int tau,i,j;
              int summ;
              for (tau=0; tau<768-1; tau++){
                double sum=0;
                for (i=0; i<768-tau; i++) { sum+= data[i]*data[i+tau]; }
                sum /= (768-tau);
                akf[tau]=sum;
              }
              for (j=4; j<768-4; j++){
                if (akf[j]>akf[j-1] && akf[j]>akf[j+1] &&
                    akf[j]>akf[j-2] && akf[j]>akf[j+2] &&
                    akf[j]>akf[j-3] && akf[j]>akf[j+3] &&
                    akf[j]>akf[j-4] && akf[j]>akf[j+4]
                    ){
                  ccc++;
                }
              }
              av_push(array, newSVnv(ccc));
              cc=0; ccc=0;
            }
          }
          n++;
        }

       RETVAL = newRV_noinc((SV*)array);
 OUTPUT:
       RETVAL

will returned me array of dec. numbers:

#!/usr/bin/perl -w

use strict;
use warnings;
use ExtUtils::testlib;
use Mytest;
use Data::Dumper;
use Glib qw(FALSE TRUE);
use Gtk2 -init;

my($x,$criteria,@a,@res,$pix,$cc,$button,@m,$img,$pixbuf,$pixels,$w,$h,$c);

 die "Usage: $0 imagefile\n" unless @ARGV;
 $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file ($ARGV[0]);
 $pixels = $pixbuf->get_pixels();
 #$pixels="\x00\x00\xf0\x00\x00\xff\x00\x00\xff";
 my $dim=1;
#  print Dumper(Mytest::getnum($pixels,length ($pixels))),"\n";

 my $txt=Mytest::getnum($pixels,length ($pixels));
foreach(@{$txt}){
#   do{$criteria+=$_; } if $_ =~m/^\d+$/;
#   print "scalar data $_", length ($_) ,"\n" unless $_ =~m!^\d+$!;
}
print "$criteria\n";
#  print "end akf ",qx[date];

But i need in last element in array *char data, i.e. packed (pack "C*") data.
Or some value with length = length $pixels () (i.e. return in *.pl copy of *number).


Thanks!

Dmitriy



Reply via email to