2014 dxdy logo

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

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




 
 Массивное представление числа
Сообщение22.08.2010, 14:44 
Есть в стандартных библиотеках C функция, которая, принимая long, возвращает short[4], то есть то же представление, но в виде массива? А обратное преобразование? А в Java?

 
 
 
 Re: Массивное представление числа
Сообщение22.08.2010, 16:36 
В C такой функции нет.
Используйте битовые сдвиги или union, если представление чисел в памяти подходящее.

 
 
 
 Re: Массивное представление числа
Сообщение22.08.2010, 18:30 
2kuraga
Цитата:
Есть в стандартных библиотеках C функция, которая, принимая long, возвращает short[4]

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

 
 
 
 Re: Массивное представление числа
Сообщение22.08.2010, 21:08 
И все это будет непереносимо :).

 
 
 
 Re: Массивное представление числа
Сообщение22.08.2010, 21:30 
Аватара пользователя
kuraga
Используй преобразование типов. В Builder это есть LongRec, WordRec и int64rec из модуля Sysutils.

 
 
 
 Re: Массивное представление числа
Сообщение22.08.2010, 21:38 
Pavia в сообщении #346325 писал(а):
В Builder это есть LongRec, WordRec и int64rec из модуля Sysutils.
Они, кстати, должны определяться там как union.

 
 
 
 Re: Массивное представление числа
Сообщение23.08.2010, 08:23 
Аватара пользователя
В Си и Си++ отлично работает следующее:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
А такое разве не пройдёт? (Не уверен насчёт си.)
Используется синтаксис C++
union CompoundType {
  // ...
} /* а если переменная такая только одна нужна, то целесообразно тут её поместить, а название объединения не указывать */;

 
 
 
 Re: Массивное представление числа
Сообщение23.08.2010, 10:49 
Аватара пользователя
Пойдет, конечно, но только для Си++. Возможно, в последних вариантах стандарта Си для объявления структур и объединений уже не требуется typedef, но таких компиляторов у меня нет, увы.

 
 
 
 Re: Массивное представление числа
Сообщение24.08.2010, 09:54 
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 
Аватара пользователя
Когда я говорил "пойдет, конечно, но только для Си++" я имел в виду только определение типа, т.е. я хотел сказать, что в Си++ можно стуктуру типа CompoundType определить вот так, без typedef:
Используется синтаксис C++
union CompoundType
{
.....
};
 

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

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

(Оффтоп)

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

 
 
 
 Re: Массивное представление числа
Сообщение24.08.2010, 13:19 
Аватара пользователя
Извиняюсь за невежество :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 
Sanyok в сообщении #346686 писал(а):
Правильно ли я понимаю, что это будет что-то наподобие анонимной структуры (т.е. структура, не имеющая имени типа)?
Тип без имени типа? :wink: Может просто - "структура, не имеющая имени (тэга)"?
По поводу глаголов согласен, правильнее использовать "объявить" (to declare).

 
 
 
 Re: Массивное представление числа
Сообщение24.08.2010, 15:39 
Аватара пользователя
Насчет типа без имени типа не стоит иронизировать - такое тоже бывает, в Java по крайней мере это есть :wink: Может есть еще в каких-то языках (полагаю, что в C# должно быть).
lim0n в сообщении #346737 писал(а):
Может просто - "структура, не имеющая имени (тэга)"?

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

 
 
 
 Re: Массивное представление числа
Сообщение24.08.2010, 16:46 
По моему, у нас небольшая терминологическая путаница. В данном случае тэг - имя стуктурного типа (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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group