2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Массивное представление числа
Сообщение22.08.2010, 14:44 


08/11/09
156
Есть в стандартных библиотеках C функция, которая, принимая long, возвращает short[4], то есть то же представление, но в виде массива? А обратное преобразование? А в Java?

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение22.08.2010, 16:36 
Заслуженный участник


04/05/09
4587
В C такой функции нет.
Используйте битовые сдвиги или union, если представление чисел в памяти подходящее.

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение22.08.2010, 18:30 
Заслуженный участник


26/07/09
1559
Алматы
2kuraga
Цитата:
Есть в стандартных библиотеках C функция, которая, принимая long, возвращает short[4]

Ага, memcpy(...). :)

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение22.08.2010, 21:08 


21/03/06
1545
Москва
И все это будет непереносимо :).

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение22.08.2010, 21:30 
Аватара пользователя


31/10/08
1244
kuraga
Используй преобразование типов. В Builder это есть LongRec, WordRec и int64rec из модуля Sysutils.

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение22.08.2010, 21:38 
Заслуженный участник


27/04/09
28128
Pavia в сообщении #346325 писал(а):
В Builder это есть LongRec, WordRec и int64rec из модуля Sysutils.
Они, кстати, должны определяться там как union.

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение23.08.2010, 08:23 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
В Си и Си++ отлично работает следующее:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++

typedef union
{
    unsigned char asbyte[4];
    long aslong;
} CompoundType;

//Использование:
CompoundType mix;
mix.aslong = 0xAABBCCDD;
//Выводим результат:
printf("1st = %X 2nd = %X 3d = %X 4th = %X\n",
         mix.aschar[0], mix.aschar[1], mix.aschar[2],        
         mix.aschar[3]);
 

Что касается переносимости - работает не только в Win, но и на некоторых контроллерах (в частности, на контроллерах семейства m16c). Лучше посмотреть документацию на компилятор (как он в памяти структуры хранит).

Что касается java, то там придется самому реализовывать такую функцию через сдвиги и маски.

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение23.08.2010, 08:49 
Заслуженный участник


27/04/09
28128
А такое разве не пройдёт? (Не уверен насчёт си.)
Используется синтаксис C++
union CompoundType {
  // ...
} /* а если переменная такая только одна нужна, то целесообразно тут её поместить, а название объединения не указывать */;

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение23.08.2010, 10:49 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Пойдет, конечно, но только для Си++. Возможно, в последних вариантах стандарта Си для объявления структур и объединений уже не требуется typedef, но таких компиляторов у меня нет, увы.

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение24.08.2010, 09:54 


16/06/10
199
Sanyok в сообщении #346398 писал(а):
Пойдет, конечно, но только для Си++. Возможно, в последних вариантах стандарта Си для объявления структур и объединений уже не требуется typedef, но таких компиляторов у меня нет, увы.
Этого требования в языке Си никогда не было, так что "таких компиляторов у вас есть". Вы смешиваете в одну кучу определение переменной типа struct/union и определение типа с помощью typedef.
Используется синтаксис C
/* определить переменную типа структуры */
struct mystruct_{
/* имя тэга структуры необязательно, но полезно, например, для sizeof(struct mystruct_) */
    ...
} v;

/* определить тип mystruct */
typedef struct {
    ...
} mystruct;
/* определить переменную типа mystruct */
mystruct vv;

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение24.08.2010, 11:42 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Когда я говорил "пойдет, конечно, но только для Си++" я имел в виду только определение типа, т.е. я хотел сказать, что в Си++ можно стуктуру типа CompoundType определить вот так, без typedef:
Используется синтаксис C++
union CompoundType
{
.....
};
 

В обычном Си эта конструкция бесполезна, если между закрывающей фигурной скобкой и точкой с запятой нет никакого идентификатора.
Что касается вот такой конструкции:
Используется синтаксис C
/* определить переменную типа структуры */
struct mystruct_{
/* имя тэга структуры необязательно, но полезно, например, для sizeof(struct mystruct_) */
    ...
} v;
 

то каюсь, не знал, что это можно делать. Правильно ли я понимаю, что это будет что-то наподобие анонимной структуры (т.е. структура, не имеющая имени типа)?

(Оффтоп)

Я так понимаю, весь сыр-бор начался из-за того, что в фразе "для объявления структур и объединений .." я использовал глагол "объявить" вместо "определить". :-) Хотя принципиальной разницы я не вижу, в этом посте я исправился ради достижения лучшего взаимопонимания :-)

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение24.08.2010, 13:19 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Извиняюсь за невежество :oops:
Только что прогнал через компилятор. Вот это:
Используется синтаксис C
union CompoundType
{
    long aslong;
    char aschar[4];
};

int main(int n, char ** args)
{
    CompoundType a;
    a.aslong = -1;
}
 

дало ошибку:
Код:
stunion.c
C:\\Projects\\PrjCpp\\test\\tstunion.c(9): error: identifier "CompoundType" is undefined
      CompoundType a;
      ^
C:\\Projects\\PrjCpp\\test\\tstunion.c(9): error: expected a ";"
      CompoundType a;
                   ^
C:\\Projects\\PrjCpp\\test\\tstunion.c(10): error: identifier "a" is undefined
      a.aslong = -1;
      ^
compilation aborted for C:\Projects\PrjCpp\test\tstunion.c (code 2)

а вот это:

Используется синтаксис C
union CompoundType
{
    long aslong;
    char aschar[4];
};

int main(int n, char ** args)
{
    union CompoundType a;
    a.aslong = -1;
}
 

откомпилировалось нормально(компиляторы - GCC 3.4.2 и MS Visual C++ 6.0)! Блин, 10 лет пишу на Си и Си++, первый раз об этом узнаю!! :oops:

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение24.08.2010, 15:09 


16/06/10
199
Sanyok в сообщении #346686 писал(а):
Правильно ли я понимаю, что это будет что-то наподобие анонимной структуры (т.е. структура, не имеющая имени типа)?
Тип без имени типа? :wink: Может просто - "структура, не имеющая имени (тэга)"?
По поводу глаголов согласен, правильнее использовать "объявить" (to declare).

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение24.08.2010, 15:39 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Насчет типа без имени типа не стоит иронизировать - такое тоже бывает, в Java по крайней мере это есть :wink: Может есть еще в каких-то языках (полагаю, что в C# должно быть).
lim0n в сообщении #346737 писал(а):
Может просто - "структура, не имеющая имени (тэга)"?

В данном случае я даже не знаю, как это назвать. Скорее тэг есть, а структуры нет! Типа, я так понимаю, тоже нет.
Из всего этого у меня вопрос - а для чего вообще нужны тэги? Можно вообще придумать пример, где использование тэгов удобнее, чем обычных типов?

 Профиль  
                  
 
 Re: Массивное представление числа
Сообщение24.08.2010, 16:46 


16/06/10
199
По моему, у нас небольшая терминологическая путаница. В данном случае тэг - имя стуктурного типа (name of the structure type), проще - имя структуры. Структурный тип с данным именем далее может быть использован при объявлении других структурных типов, структурных переменных и т.д.
код: [ скачать ] [ спрятать ]
Используется синтаксис C
struct rec1 { /* объявление структурного типа struct rec1 */
    ...
};
struct rec1 v1; /* объявление переменной структурного типа struct rec1 */
int size1 = sizeof(struct rec1); /* размер структурного типа struct rec1 */
/*-------------------------------*/
struct { /* объявление структурного типа без имени (анонимная структура) */
    ...  /* может быть полезно, когда одно объявление определяет все
         переменные этого структурного типа*/

} v2, *pv;
struct rec2 { /* анонимная структура внутри другой */
    ...
    struct {
        ...
    } member;
};
 

В конечном счёте использование typedef конечно же удобнее и не только применительно к структурам:
Используется синтаксис C
void *pvoid;
/* вариант 1 */
unsigned long v;
v = *(unsigned long *)pvoid;
/* вариант 2 */
typedef unsigned long ulong, *pulong;
ulong v;
v = *(pulong)pvoid;
 

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group