Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Помогите дописать функцию.  (Прочитано 931 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн iamkisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 93
  • это я в 10 лет назад
    • Просмотр профиля
    • Электроника как хобби
Помогите дописать функцию.
« : 08 Ноября 2010, 23:47:26 »
День добрый,
//function IntToHex ( DecimalValue : Integer; MinimumWidth : Integer ) : string;
char* IntToHex(int DecimalValue, int MinimumWidth, char b[])
{  //char b[256] = {};
    sprintf(b, "%lX", DecimalValue);
    int len = strlen(b);
    int i = len;
    int l = MinimumWidth-len;
        if (l>0)
        {
            while(i>=0)
            {
                b[i+l]=b[i];
                i--;
            }
        while((i+l)>=0)
            {
                b[i+l] = '0';
                i--;
            }
       }
    return b;
}

проблема этой функции в том, что при каждом вызове необходимо создавать новый буфер.

не будет ли кто-нибудь так любезен привести пример кода, позволяющий генерировать буфер или внутри функции (это самый жэелательный вариант, чтобы он соответственно стирался, и\или создавался заново при следующем вызове функции ), или снаружи функции, но обладал тем же свойством.
И проверьте правильно ли я проставил указатель.
Заранее спасибо.

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Помогите дописать функцию.
« Ответ #1 : 09 Ноября 2010, 00:29:15 »
Велосипедостроение? man sprintf !

Пользователь решил продолжить мысль 09 Ноября 2010, 00:31:44:
sprintf (b, "%.*X", MinimumWidth, DecimalValue);

Пользователь решил продолжить мысль 09 Ноября 2010, 00:32:11:
camelCase брррр :crazy2:

Пользователь решил продолжить мысль 09 Ноября 2010, 00:32:55:
« Последнее редактирование: 09 Ноября 2010, 00:32:55 от Mam(O)n »

Оффлайн iamkisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 93
  • это я в 10 лет назад
    • Просмотр профиля
    • Электроника как хобби
Re: Помогите дописать функцию.
« Ответ #2 : 09 Ноября 2010, 08:34:48 »
спасибо!!!! Большое !!!! всё время забываю про man
но с сабжем помогите, т.к. у меня подобных функций 20+, и я не могу нормально возвратить из них строку. она или ссылается вникуда или хз.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Помогите дописать функцию.
« Ответ #3 : 09 Ноября 2010, 11:07:13 »
Варианта два писать функцию которая принимает два аргумента: входную строку и указатель на буфер куда писать, второй вариант создавать буффер внутри функции malloc'ом и возвращать его. Только потом нужно обязательно освободить этот буффр когда он не будет нужен.

Оффлайн iamkisly

  • Автор темы
  • Любитель
  • *
  • Сообщений: 93
  • это я в 10 лет назад
    • Просмотр профиля
    • Электроника как хобби
Re: Помогите дописать функцию.
« Ответ #4 : 11 Ноября 2010, 08:50:01 »
Всем доброе утро !!!!
вот еще вопрос,
есть две вроде бы одинаковые функции:
procedure AddCheckSumm(var data: array of byte; len: integer);
type trec = record
      t0: byte;
      t1: byte;
      t2: byte;
      t3: byte;
    end;
var chksum: Longword;
    i: integer;
    ecx: Longword;
    t: trec;
begin
  if length(data)<len+4 then exit;
  chksum := 0;
  i := 0;
  while i < len do begin
      t.t0 := data[i];
      t.t1 := data[i + 1];
      t.t2 := data[i + 2];
      t.t3 := data[i + 3];
      ecx := Longword(t);
      chksum := chksum xor ecx;
      i := i + 4;
  end;
  t := trec(chksum);
  data[len]:=t.t0;
  data[len+1]:=t.t1;
  data[len+2]:=t.t2;
  data[len+3]:=t.t3;
и
void AddCheckSumm(int data[], int len) // expl: AddCheckSumm(Data,24);
{
    union trec
        {
            char t[4];
            long l;
        };
    trec t;

    unsigned long int chksum;
    unsigned long int ecx;
    int i=0;
    //тело.
    if (sizeof(data) < len+4)
    { return; };

    chksum = 0;
    i = 0;

    while (i<len)
        {
            t.t[0] = data[i];
            t.t[1] = data[i +1];
            t.t[2] = data[i +2];
            t.t[3] = data[i +3];

            ecx = t.l;
            chksum = chksum ^ ecx;
            i = i +4;
        }

    t.l = chksum;
    data[len] = t.t[0];
    data[len +1] = t.t[1];
    data[len +2] = t.t[2];
    data[len +3] = t.t[3];
}

только вот первая работает, а вторая - нет. где прокол ?

Пользователь решил продолжить мысль 11 Ноября 2010, 09:03:06:
занялся мыслью, что byte и int не одно и тоже. Ближайший "сосед" это char.. но это в win. А в Ubuntu мы используем юникод.
тогда попутный вопрос," как перевести delphi Byte в с\c++ " ?
« Последнее редактирование: 11 Ноября 2010, 09:03:06 от kisly »

Оффлайн SureExist

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Помогите дописать функцию.
« Ответ #5 : 14 Ноября 2010, 02:31:34 »
К сожалению, методом пристального взгляда не разберешь, что именно делает паскалевская процедура и что должна делать сишная функция
Может дело в том, что чтобы узнать количество элементов массива нужно весь размер оного поделить на размер элемента :)
if ((int)(sizeof(data)/sizeof(int)) < len+4)

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.