The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите решить один вопрос"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите решить один вопрос"  
Сообщение от invisible on 01-Фев-07, 16:06 
Добрый день. Помогите, плиз, кто знает, как:
Есть массив char a[]="12345678".
Необходимо поменять местами элементы 1 и 2, 3 и 4, 5 и 6, 7 и 8.
Т.е. получится 21436587 и ....
Получившийся массив символов преобразовать в массив int, причем ...
1-й элемент должен стать 0х21, 2-й 0х43, 0х65 и 0х87.
Т.е. массив из шестнадцатиричных цифр, ну или их десятичных эквивалентов.

Заранее спасибо.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 01-Фев-07, 17:09 
>Добрый день. Помогите, плиз, кто знает, как:

https://www.opennet.ru/openforum/vsluhforumID9/6109.html

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Помогите решить один вопрос"  
Сообщение от invisible on 01-Фев-07, 17:54 
>>Добрый день. Помогите, плиз, кто знает, как:
>
>https://www.opennet.ru/openforum/vsluhforumID9/6109.html

Спасибо, но это не правильный ответ.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Помогите решить один вопрос"  
Сообщение от newser (ok) on 01-Фев-07, 18:16 
>>>Добрый день. Помогите, плиз, кто знает, как:
>>
>>https://www.opennet.ru/openforum/vsluhforumID9/6109.html
>
>Спасибо, но это не правильный ответ.

Ответ-то как раз правильный - RTFM!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 01-Фев-07, 19:00 
>Добрый день. Помогите, плиз, кто знает, как:
>Есть массив char a[]="12345678".
>Необходимо поменять местами элементы 1 и 2, 3 и 4, 5 и
>6, 7 и 8.
>Т.е. получится 21436587 и ....
>Получившийся массив символов преобразовать в массив int, причем ...
>1-й элемент должен стать 0х21, 2-й 0х43, 0х65 и 0х87.
>Т.е. массив из шестнадцатиричных цифр, ну или их десятичных эквивалентов.
>

И чему сейчас студентов учат?


#include <cstdio> // Для printf
#include <algorithm> // Для std::swap

using std::swap;

int main()
{
  // Это, собственно, массив, который у тебя есть.
  char data[] = "12345678";

  // Необходимо поменять местами элементы 1 и 2, 3 и 4, 5 и 6, 7 и 8.
  // Т.е. получится 21436587 и ....
  //    Да не вопрос вообще.

  swap(data[0], data[1]);
  swap(data[2], data[3]);
  swap(data[4], data[5]);
  swap(data[6], data[7]);

  // Получившийся массив символов преобразовать в массив int, причем ...
  // 1-й элемент должен стать 0х21, 2-й 0х43, 0х65 и 0х87.
  // Т.е. массив из шестнадцатиричных цифр, ну или их десятичных эквивалентов.
  //
  // И что, за этим дело стало? Вот, пожалуйста:

  int res[4];

  for (int i = 1; i <= 4; ++i)
  {
    const int dst_offset = i - 1;
    const int src_offset = i * 2 - 2;
    res[dst_offset] = data[src_offset] - '0';
    res[dst_offset] *= 16;
    res[dst_offset] += data[src_offset + 1] - '0';
  }

  // Не верится? Давай проверим:
  printf("%#x, %#x, %#x, %#x\n", res[0], res[1], res[2], res[3]);

  return 0;
}

>Заранее спасибо.

С тебя пиво :-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Помогите решить один вопрос"  
Сообщение от NuINu (??) on 02-Фев-07, 10:00 
>(int i = 1; i <= 4; ++i)
>  {
>    const int dst_offset = i - 1;
>    const int src_offset = i * 2 - 2;
>    res[dst_offset] = data[src_offset] - '0';
>    res[dst_offset] *= 16;
>    res[dst_offset] += data[src_offset + 1] - '0';
>  }
>
>  // Не верится? Давай проверим:
>  printf("%#x, %#x, %#x, %#x\n", res[0], res[1], res[2], res[3]);
>

Наверняка туда будешь заливать буквы A,B,C и тд, так что программку придется доработать!

JetSnaiL - не тебе конечно ;-))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Помогите решить один вопрос"  
Сообщение от invisible on 02-Фев-07, 10:40 
>>(int i = 1; i <= 4; ++i)
>>  {
>>    const int dst_offset = i - 1;
>>    const int src_offset = i * 2 - 2;
>>    res[dst_offset] = data[src_offset] - '0';
>>    res[dst_offset] *= 16;
>>    res[dst_offset] += data[src_offset + 1] - '0';
>>  }
>>
>>  // Не верится? Давай проверим:
>>  printf("%#x, %#x, %#x, %#x\n", res[0], res[1], res[2], res[3]);
>>
>
>Наверняка туда будешь заливать буквы A,B,C и тд, так что программку придется
>доработать!
>
>JetSnaiL - не тебе конечно ;-))

Ребят, спасибо огромное. Поменять местами элементы было не проблема. Проблема стояла в переводе в hex.
P.S.: я не студент! И нужно было для перевода номера в формат PDU (http://www.dreamfabric.com/sms/).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 13:11 
>Наверняка туда будешь заливать буквы A,B,C и тд, так что программку придется
>доработать!
>
>JetSnaiL - не тебе конечно ;-))

Несомненно нужно как можно больше возможных нестандартных ситуаций предусмотреть. Но к примеру то это не относится. Это очень простой пример, хорошие программы так никогда не выглядят :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Помогите решить один вопрос"  
Сообщение от invisible on 02-Фев-07, 13:37 
>>Наверняка туда будешь заливать буквы A,B,C и тд, так что программку придется
>>доработать!
>>
>>JetSnaiL - не тебе конечно ;-))
>
>Несомненно нужно как можно больше возможных нестандартных ситуаций предусмотреть. Но к примеру
>то это не относится. Это очень простой пример, хорошие программы так
>никогда не выглядят :)

Ну это понятное дело. Для меня не ясен был алгорит преобразования в hex.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 16:14 
>Для меня не ясен был алгорит преобразования в hex.

sprintf %x отменили?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 16:25 
>>Для меня не ясен был алгорит преобразования в hex.
>
>sprintf %x отменили?

Извините, но я Вас, кажется, не понимаю.
Не могли бы Вы наглядно продемонстрировать, как в данном случае можно оптимально использовать sprintf?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 17:32 
>Извините, но я Вас, кажется, не понимаю.
>Не могли бы Вы наглядно продемонстрировать, как в данном случае можно оптимально
>использовать sprintf?

А где в задаче написано "оптимально"? :)
Перечитал задачу. Понял что "преобразование в hex" тут совершенно не при чем. Бери по два символа, добавляй в конце 0 и используй strtol(3).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 17:42 
>>Извините, но я Вас, кажется, не понимаю.
>>Не могли бы Вы наглядно продемонстрировать, как в данном случае можно оптимально
>>использовать sprintf?
>
>А где в задаче написано "оптимально"? :)

Любое решение задачи должно быть максимально оптимальным (о как закрутил). И оптимальное решение задачи - не задача, а само-собой разумеющееся. Представте, что Вы - не студент, а такой себе разработчик, на который возложено много ответственности. Вам ставят задачу, вы ее решаете через ЖПУ. И вот заказчик спрашивает - а чего все так медленно (к примеру) работает?  А вы ему - а что, кто-то просил решить вашу задачу оптимально?

>Перечитал задачу. Понял что "преобразование в hex" тут совершенно не при чем.
>Бери по два символа, добавляй в конце 0 и используй strtol(3).

Да, как я писал ниже, можно использовать strtol. Однако для этого нужно будет выделить буфер из 3-х байт (sizeof(char) * 3), затем скоприровать в него два байта, и добавить еще один. А только потом вызывать strtol. Это, думаете, хорошее решение? Легче взять strtol и переделать его так, чтобы он не расчитывал на завершающий символ, а ориентировался на размерность (что я, собственно, и сделал).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 18:07 
>Любое решение задачи должно быть максимально оптимальным (о как закрутил).

Не факт. Оптимальным должно быть только то что должно быть оптимальным (закрутил еще круче). Все остальное должно быть быстроразрабатываемым и понятным для других :)
Иначе все языки программирования ограничивались бы ассемблерами, а скриптов бы не было как класса :)

>Да, как я писал ниже, можно использовать strtol. Однако для этого нужно
>будет выделить буфер из 3-х байт (sizeof(char) * 3), затем скоприровать
>в него два байта, и добавить еще один. А только потом
>вызывать strtol. Это, думаете, хорошее решение?

Вполне приемлимое, если не надо делать туеву хучу таких операций в секунду.

> Легче взять strtol и переделать
>его так, чтобы он не расчитывал на завершающий символ, а ориентировался
>на размерность (что я, собственно, и сделал).

... и убил на эту ерунду в 10 раз больше времени чем надо было. Причем получил нечитабельный код, по которому с первого взгляда непонятно что делается. Что делает strtol - знают все (кто не знает - набирает man strtol и тоже знает).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 18:14 
>
>Вполне приемлимое, если не надо делать туеву хучу таких операций в секунду.
>

Мне легче было написать так, чем возиться с strtol.

>... и убил на эту ерунду в 10 раз больше времени чем
>надо было. Причем получил нечитабельный код, по которому с первого взгляда
>непонятно что делается. Что делает strtol - знают все (кто не
>знает - набирает man strtol и тоже знает).

Я? Что Вы! Вы заблуждаетесь. Это я прошел много лет назад, а нароботочки то всегда со мной, поэтому я потратил не больше 30-ти секунд на всю эту кухню. Если бы понадобилось больше времени, я вообще не взялся бы помогать с решением такой банальной задачи.

А по поводу читабельности кода... Хм, вполне читабельно все получилось.
Единсвенная вещь, которая все портит - это цикл. Но он тут просто потому, что мне лень было писать пару дополнительных строк с пркатически идентичным кодом. (кстати, было бы более оптимально, не уверен, что оптимизатор разложит такой фикл, хотя... ммм).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

19. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 18:24 
>Я? Что Вы! Вы заблуждаетесь.

Не, я не про данный конкретный случай и не про тебя, а про оптимизацию вообще. Она далеко не всегда имеет смысл, в подавляющем большинстве случаев играют другие приоритеты - надежность / переносимость / скорость разработки / читабельность кода и т.д.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

21. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 18:33 
>Не, я не про данный конкретный случай и не про тебя,
> а про оптимизацию вообще. Она далеко не всегда имеет смысл, в подавляющем
>большинстве случаев играют другие приоритеты - надежность / переносимость / скорость
>разработки / читабельность кода и т.д.

Ха, вот это в точку. Оптимизация - самый последний шаг в разработке. Часто никогда не наступающий без особой необходимости. Но это в реальной жизни, а до того надо обучиться. Тут на лицо учения.

И, кстати, пример такого strtol самописного я привел не случайно. Мы на работу недавно взяли новичка, выпускника. Оказалось, что он не имеет абсолютно никакого понятия, как реализованы функции подобного рода. А нам нужены были преобразования из сырых данных, не разделяемых никакими пробелами и '\0'-ми, причем без промежуточных буферов, копирования и пр. Может быть мой пример поможет кому-то в будущем прийдя на работу знать, как такое вообще можно провернуть.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

22. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 19:16 
>
>Ха, вот это в точку. Оптимизация - самый последний шаг в разработке.
>Часто никогда не наступающий без особой необходимости. Но это в реальной
>жизни, а до того надо обучиться.

Согласен. Но надо именно УЧИТЬСЯ, а не делать copy+paste+print+зачет. Именно поэтому я принципиально не помогаю задающим такие вопросы.

>Может быть мой пример поможет кому-то в будущем прийдя на работу знать,
>как такое вообще можно провернуть.

Боюсь что это поможет кому-то сдать лабораторную работу, не вникая в суть реализации, а вы потом опять возьмете на работу якобы "программиста на C", который не будет различать числа и их ASCII-представление.

Наступили на больную мозоль :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

24. "Помогите решить один вопрос"  
Сообщение от Bat (??) on 02-Фев-07, 19:34 
начнем с того, что сильно накручено. Все проще делается. Зачем swap с подключением доп.библиотек? Что два значения через переменную непоменять?


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

16. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 18:08 
>(что я, собственно, и сделал)

Да, кстати, раз уж пошла речь про оптимальность. s/*16/<<4/ :-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

18. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 18:15 
>>(что я, собственно, и сделал)
>
>Да, кстати, раз уж пошла речь про оптимальность. s/*16/<<4/ :-)

[~]o (пиво :-))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

20. "Помогите решить один вопрос"  
Сообщение от Michelnok (ok) on 02-Фев-07, 18:27 
>
>[~]o (пиво :-))

Вообще-то компиляторы еще с середины 90-х это сами делают.
Это был пример бессмысленной оптимизации. *16 более читабельно чем <<4, поэтому все-таки лучше *16, а оптимизировать можно до бесконечности :-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Помогите решить один вопрос"  
Сообщение от Bat (??) on 02-Фев-07, 17:08 
>Добрый день. Помогите, плиз, кто знает, как:

Ну, я не программист, поэтому может кривовато, но работает. Мож позже кто получше напишет

#include <stdio.h>

main()
{
    char buf,a[]="1234567890";
    
    int mas_int[5],j,i=0;
    j=0;    
        while (a[i]&&a[i+1]) /*проверка a[i+1] необходима, если в массиве нечетное кол-во эл-тов*/
        {
            buf=a[i];
            a[i]=a[i+1];
            a[i+1]=buf;
            mas_int[j]=(a[i]-48)*16+(a[i+1]-48);
            printf ("%x\n", mas_int[j]);
            i=i+2;
            j++;
        };
}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 02-Фев-07, 17:37 
>Ну, я не программист,
> поэтому может кривовато, но работает.
> Мож позже кто
>получше напишет
>
>#include <stdio.h>
>
>main()
>{
> char buf,a[]="1234567890";
>
> int mas_int[5],j,i=0;
> j=0;
>  while (a[i]&&a[i+1]) /*проверка a[i+1] необходима, если в массиве нечетное кол-во
>эл-тов*/
>  {
>   buf=a[i];
>   a[i]=a[i+1];
>   a[i+1]=buf;
>   mas_int[j]=(a[i]-48)*16+(a[i+1]-48);
>   printf ("%x\n", mas_int[j]);
>   i=i+2;
>   j++;
>  };
>}

А где здесь sprintf или snprintf? Где массив int [4], который требовалось получить?
И, кстати, если уж речь когда-то зашла о sprintf, то эта функция запихивает данные в строку, но не наоборот. Наоборот делает, например, strtol. Но есть одна особенность - strtol преобразовывает строку в число, но требует, чтобы последний символ был не числом, а для выполнения задания это не подоходило.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

23. "Помогите решить один вопрос"  
Сообщение от Bat (??) on 02-Фев-07, 19:23 

>А где здесь sprintf или snprintf? Где массив int [4], который требовалось
>получить?
>И, кстати, если уж речь когда-то зашла о sprintf, то эта функция
>запихивает данные в строку, но не наоборот. Наоборот делает, например, strtol.
>Но есть одна особенность - strtol преобразовывает строку в число, но
>требует, чтобы последний символ был не числом, а для выполнения задания
>это не подоходило.

mas_int[] - массив, а преобразуем ручками - mas_int[j]=(a[i]-48)*16+(a[i+1]-48);
а принт там вообще не требовался, эт так для проверки


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

25. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 04-Фев-07, 12:21 
> char buf,a[]="1234567890";

А вот так лучше никогда не делай.
Иначе твоя прога получит от системы по морде 11-м сигналом, и потом можно долго думать из-за чего. Или явно выделяй память через malloc, или используй массив фиксированного размера, или вызывай strdup, типа char *a = strdup("1234567890");

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

26. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 04-Фев-07, 13:04 
Ну и я тоже свои 5 копеек вставлю :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  int i, num;
  unsigned char *buf = strdup("1234567890");
  unsigned short *b;

  fprintf(stderr,"%s\n", buf);

  num = strlen(buf);
  for(i = 0; i < num; i+=2) {
    b = (unsigned short *)(buf+i);
    asm("rolw $8, %1":"=r"(*b):"r"(*b));
  }

  fprintf(stderr,"%s\n", buf);
  return 0;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

27. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 04-Фев-07, 15:52 
А вообще, зачем навороты с перестановкой в массиве? Ведь байты уже упорядочены.
Все можно переписать проще:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  int i, num, n;
  unsigned char *buf = strdup("1234567890");
  unsigned int *m;

  fprintf(stderr,"%s\n", buf);

  num = strlen(buf);

  m = (unsigned int *)calloc(sizeof(unsigned int), num);


  for(i = 0, n = 0; i < num; i+=2, n++)
    m[n] = ((buf[i] & 0x0f) | ((buf[i+1] & 0x0f) << 4));

  for(i = 0; i < n; i++)
    fprintf(stderr,"%.2x ", m[i]);

  fprintf(stderr,"\n");

  return 0;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

30. "Помогите решить один вопрос"  
Сообщение от Bat (??) on 05-Фев-07, 13:00 
>А вообще, зачем навороты с перестановкой в массиве? Ведь байты уже упорядочены.
>
ну, так по условию задачи то надо получить ДВА массива - один с переставленными данными, а другой со значениями в HEX.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

37. "Помогите решить один вопрос"  
Сообщение от vic (??) on 07-Фев-07, 14:05 
>Ну и я тоже свои 5 копеек вставлю :)
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <string.h>
>
>int main()
>{
>  int i, num;
>  unsigned char *buf = strdup("1234567890");
>  unsigned short *b;
>
>  fprintf(stderr,"%s\n", buf);
>
>  num = strlen(buf);
>  for(i = 0; i < num; i+=2) {
>    b = (unsigned short *)(buf+i);
>    asm("rolw $8, %1":"=r"(*b):"r"(*b));
>  }
>
>  fprintf(stderr,"%s\n", buf);
>  return 0;
>}

ну и где free() для buf ? :)
strdup() тут нафик не нужен :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

29. "Помогите решить один вопрос"  
Сообщение от JetSnaiL email(ok) on 05-Фев-07, 12:10 
>> char buf,a[]="1234567890";
>
>А вот так лучше никогда не делай.
>Иначе твоя прога получит от системы по морде 11-м сигналом, и потом
>можно долго думать из-за чего. Или явно выделяй память через malloc,
>или используй массив фиксированного размера, или вызывай strdup, типа char *a
>= strdup("1234567890");

Бред.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

33. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 05-Фев-07, 14:19 
>>> char buf,a[]="1234567890";
>>
>>А вот так лучше никогда не делай.
>>Иначе твоя прога получит от системы по морде 11-м сигналом, и потом
>>можно долго думать из-за чего. Или явно выделяй память через malloc,
>>или используй массив фиксированного размера, или вызывай strdup, типа char *a
>>= strdup("1234567890");
>
>Бред.


Хозяин барин

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

34. "Помогите решить один вопрос"  
Сообщение от perece on 06-Фев-07, 19:44 
>> char buf,a[]="1234567890";
>
>А вот так лучше никогда не делай.
>Иначе твоя прога получит от системы по морде 11-м сигналом, и потом
>можно долго думать из-за чего. Или явно выделяй память через malloc,
>или используй массив фиксированного размера, или вызывай strdup, типа char *a
>= strdup("1234567890");

чи?
Кернигана-Ритчи в утиль чтоли?
всю жисть инициализатор фиксированного размера делал массив фиксированым. с каким это компайлером вы -11 получите из этого кода?
или вы инициализатор и оператор присвоения путаете?

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

35. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 06-Фев-07, 23:45 

>чи?
>Кернигана-Ритчи в утиль чтоли?
>всю жисть инициализатор фиксированного размера делал массив фиксированым. с каким это компайлером
>вы -11 получите из этого кода?
>или вы инициализатор и оператор присвоения путаете?
>
>\^P^/


Если б не получал - не говорил бы такого. Компиляторы - gcc 3.4.6, 4.1.1, и даже VC6.0/2005.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

36. "Помогите решить один вопрос"  
Сообщение от Vladislav Lazarenko email on 07-Фев-07, 11:43 
>
>>чи?
>>Кернигана-Ритчи в утиль чтоли?
>>всю жисть инициализатор фиксированного размера делал массив фиксированым. с каким это компайлером
>>вы -11 получите из этого кода?
>>или вы инициализатор и оператор присвоения путаете?
>>
>>\^P^/
>
>
>Если б не получал - не говорил бы такого. Компиляторы - gcc
>3.4.6, 4.1.1, и даже VC6.0/2005.

А если получаешь, то тебе нужно быть внимательнее.
Работа с динамической памятью тут ни к чему.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

38. "Помогите решить один вопрос"  
Сообщение от vic (??) on 07-Фев-07, 14:21 
>
>>чи?
>>Кернигана-Ритчи в утиль чтоли?
>>всю жисть инициализатор фиксированного размера делал массив фиксированым. с каким это компайлером
>>вы -11 получите из этого кода?
>>или вы инициализатор и оператор присвоения путаете?
>>
>>\^P^/
>
>
>Если б не получал - не говорил бы такого. Компиляторы - gcc
>3.4.6, 4.1.1, и даже VC6.0/2005.

Пример в студию

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

39. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 07-Фев-07, 15:58 
Парни, был неправ, вспылил.

Смотрите.
Например, если сделать так:

  char *a="123456";
  a[3]='!';

однозначно вылетаю по segfault, а если:

  char a[]="123456";
  a[3]='!';

то все работает.

Воистину, век живи - век лечись.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

40. "Помогите решить один вопрос"  
Сообщение от vic (??) on 07-Фев-07, 18:06 
>Парни, был неправ, вспылил.
Бывает..

еще 2 копейки

>
>Смотрите.
>Например, если сделать так:
>
>  char *a="123456";
>  a[3]='!';
>
>однозначно вылетаю по segfault, а если:
еще бы, две ошибки сразу - сначала указатель без const на константную строку, а потом попытка поменять значение в ней ;)
const char *a = "123456";  //вот так правильно и дальше компилятора ошибка не пройдет если не делать грязных хаков

>
>  char a[]="123456";
>  a[3]='!';
>
>то все работает.
ага, обязано работать т.к. a[] это уже массив содержимое которого можно менять.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

41. "Помогите решить один вопрос"  
Сообщение от Bob (??) on 07-Фев-07, 20:15 
>>Парни, был неправ, вспылил.
>Бывает..
>
>еще 2 копейки
>
>>
>>Смотрите.
>>Например, если сделать так:
>>
>>  char *a="123456";
>>  a[3]='!';
>>
>>однозначно вылетаю по segfault, а если:
>еще бы, две ошибки сразу - сначала указатель без const на константную
>строку, а потом попытка поменять значение в ней ;)
>const char *a = "123456";  //вот так правильно и дальше компилятора
>ошибка не пройдет если не делать грязных хаков
>
>>
>>  char a[]="123456";
>>  a[3]='!';
>>
>>то все работает.
>ага, обязано работать т.к. a[] это уже массив содержимое которого можно менять.
>


Все, разрулили.
Всем спасибо за поддержку и понимание :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

28. "Помогите решить один вопрос"  
Сообщение от MKuznetsov (??) on 04-Фев-07, 21:18 
#include <stdlib.h>
#include <stdio.h>
/* правильное решение, но есть тонкость, зависищая от архитектуры */
char *digits="12345678";
int main() {
   unsigned long b;
   b=strtoul(digits,NULL,16);
   printf("Word %llx\n",((b<<4)&0xf0f0f0f0ul)|((b>>4)&0x0f0f0f0ful));
   return 0;
}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

31. "Помогите решить один вопрос"  
Сообщение от Bat (??) on 05-Фев-07, 13:06 
>#include <stdlib.h>
>#include <stdio.h>
>/* правильное решение, но есть тонкость, зависищая от архитектуры */
>char *digits="12345678";
>int main() {
>   unsigned long b;
>   b=strtoul(digits,NULL,16);
>   printf("Word %llx\n",((b<<4)&0xf0f0f0f0ul)|((b>>4)&0x0f0f0f0ful));
>   return 0;
>}


Хм, а ты проверял? Нетот результат то, нетот. И где массив? Понятно, немного доделать, но....

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

32. "Помогите решить один вопрос"  
Сообщение от Bat (??) on 05-Фев-07, 13:10 
>#include <stdlib.h>
>#include <stdio.h>
>/* правильное решение, но есть тонкость, зависищая от архитектуры */
>char *digits="12345678";
>int main() {
>   unsigned long b;
>   b=strtoul(digits,NULL,16);
>   printf("Word %llx\n",((b<<4)&0xf0f0f0f0ul)|((b>>4)&0x0f0f0f0ful));
>   return 0;
>}
Все это дело печатает
Word 1021436587


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

42. "Помогите решить один вопрос"  
Сообщение от ACCA (ok) on 13-Фев-07, 09:10 
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char a[]="12345678";

void main()
{

     char *b = (char*) malloc(strlen(a)+1);
     swab(a, b, strlen(a));
     b[strlen(a)] = '\0';
     printf("0x%x, 0x%x\n", atol(a), atol(b));
/*     free(b);   */
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

43. "Помогите решить один вопрос"  
Сообщение от phpcoder (??) on 13-Фев-07, 15:21 
>#include <unistd.h>
[...]
>     swab(a, b, strlen(a));

К слову, swab(3) в Линукс ещё требует #define _XOPEN_SOURCE перед подключением файла unistd.h

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру