LINUX.ORG.RU

всмысле, \x00\x00\x00\x00\x00\x00\x00\x00\x00 это яркость
первых трех пикселей, соответственно R, G и B значения...

но код

int x,y,z;
unsigned char * string;
while(*string){
x = (int) * string++;
y = (int) * string++;
z = (int) * string++;
printf ("", x,y,z);
}

вылетает, потому что \x00 это признак конца строки. Хотя на
самом деле это просто число 0. И чего делать в таком
случае? как определять длину строчки? Подскажите
ссылку какуюнибудь или ткните куданибудь в мануал.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

ой. блин не то, длинну строки я могу узнать сторонними методми, т.к. картинка кдвадратная, то длина строки это ширина*высота*3

вопрос собственно в том(длинна строки воникла в мозге потому что цикл был сначала for), как перебрать unsigned char посимвольно, зная длинну строки

p.s. крыша, похоже, уже едет :(

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

тоесть как перебрать посимвольно unsigned char который состоит целиком из нулей, если картинка черная. Хотя где-то в районе www.lib.ru я чиатал, что в принципе, в unsigned char можно писать любое число от 0 до 255 в шестнадцатиричном виде.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

А в unsigned char и можно писать числа от 0 до 255. Какая нифиг разница что-там содержит массив, если размер известен?

for (int i = 0; i < size; i++)

или я тебя не понял.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Но это не массив, я на вход подаю одну строчку. 
Хотя там все  сложнее и выглядит полностью так:

#!/usr/bin/perl -w

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

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

my $image   = Gtk2::Image->new;
die "Usage: $0 imagefile\n" unless @ARGV;
$pixbuf = Gtk2::Gdk::Pixbuf->new_from_file ($ARGV[0]);
$pixels = $pixbuf->get_pixels();
#my $pixels="\xff\xff\xff\xff\xff\xff\xff\xff\xff";
my $dim=1;

print Dumper(Akf::getnum($pixels,$dim)),"\n";

если создать картинку в фотошопе, которая залита полностью черной краской, то 

сишная функция getnum, которая объявляется тут:

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

MODULE = Akf            PACKAGE = Akf

SV*
getnum(number,dim)
        unsigned char * number;
        int dim;
  INIT:
        AV* array;
        int size,c;
        int r,g,b;
        double y;
  CODE:
        size_t n = strlen(number);
        char *a, *b = malloc(n);
//         intensity: Y = 0.59G + 0.3R + 0.11B
//         size = strlen(number);
         printf ("!!! %d\n", n);
         int i;
         array = newAV();
         while(*number){
           r = *number++;
           g = *number++;
           b = *number++;
           y=0.59*g+0.3*r+0.11*b;
//           printf ("%d %d %d\n", r,g,b);
//           printf ("%s ,%s %s" r,g,b);
           av_push(array, newSVnv(y));
         }
        free(mem);
        RETVAL = newRV_noinc((SV*)array);
  OUTPUT:
        RETVAL

вылеатет на первом же нуле, потому что первый
 шестнадцатеричный символ в $pixels содержит 0. 

вобщем, че делать - не пойму пока...

vilfred ☆☆
() автор топика
Ответ на: комментарий от mrco

2mrco, действительно, сейчас хоть как-то заработало и передаю длину.

целый день трахался, а в мануале perldoc perlxs было

       The "length(NAME)" Keyword

       If one of the input arguments to the C function is the
       length of a string argument "NAME", one can substitute the
       name of the length-argument by "length(NAME)" in the XSUB
       declaration.  This argument must be omited when the gener-
       ated Perl function is called.  E.g.,

         void
         dump_chars(char *s, short l)
         {
           short n = 0;
           while (n < l) {
               printf("s[%d] = \"\\%#03o\"\n", n, (int)s[n]);
               n++;
           }
         }

         MODULE = x            PACKAGE = x

         void dump_chars(char *s, short length(s))

       should be called as "dump_chars($string)".


vilfred ☆☆
() автор топика

std::string x;
может хранить что угодно главное правильно его инициализировать,
а x.size() - вернет размер.

anonymous
()
Ответ на: комментарий от vilfred

> Но это не массив, я на вход подаю одну строчку

А в Си нет такого типа как "строка". Твоя строка -- это на самом деле массив элементов, каждый из которых имеет тип char (или unsigned char). Нулевой байт в этом массиве имеет специальное значение только для функций, работающих со строками.

У тебя же на самом деле вообще не строка, а просто последовательность байтов. Поэтому функции для работы со строками тебе не катят.

nobody ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.