2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 int и double в одном массиве [C]
Сообщение11.07.2018, 16:29 


07/10/15

2400
Добрый день, возник такой вопрос: имеются 2 динамических массива, один из которых типа int а другой double. Очень удобно размещать их в одном массиве, так как они формируются внутри одной функции, которая может возвращать указатель на общий массив (то что возвращать можно несколько указателей в аргументах -понятно, но это не так наглядно), да и освобождать память удобнее сразу. Другими словами - меньше вероятность что то пропустить.
Собственно так я и делаю, а именно - формирую общий массив double, а переменные типа int преобразую в double. В общем то всё работает, но как то криво, да и бесполезные затраты на постоянные преобразования uint в double и обратно.

Возникла идея вместо этого сделать так:
Используется синтаксис C
long int* Tabl = (long int*) malloc(SizeTabl);
long int* Numbers=Tabl+2;
double* Values=(double*) (Numbers +NB);
 


Размеры long int и double одинаковые. По указателям *Tab и *Numbers можно работать как с int, а по указателю *Values уже как с double. Как считаете, нормально ли будет работать? Нет ли здесь каких то "подводных камней"?

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 16:34 


27/08/16
9426
Andrey_Kireew в сообщении #1325961 писал(а):
Размеры long int и double одинаковые.

Давно они везде одинаковые? Судя по всему, это C.

https://stackoverflow.com/questions/384 ... it-windows

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 16:50 
Заслуженный участник
Аватара пользователя


16/07/14
8334
Цюрих
Надо внимательно посмотреть, не получится ли чего-то нехорошего при приведении long int* к double*, но вроде нет. Если ваши Values и Numbers не пересекаются (если пересекаются - то это уже undefined behavior), то всё должно быть нормально (но лучше на всякий случай сделайте Tabl void*).

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 16:52 
Аватара пользователя


14/12/17
1471
деревня Инет-Кельмында
Andrey_Kireew в сообщении #1325961 писал(а):
размеры long int и double одинаковые.

Делайте что угодно, но никогда не закладывайтесь на предполагаемые размеры, используйте sizeof(). Единственное, что всегда выполняется, это что sizeof(char)=1.

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:10 


07/10/15

2400
Нет, ничего не пересекается, сейчас то ведь всё работает, только я int преобразую в double, а это - не буду преобразовывать
mihaild в сообщении #1325971 писал(а):
... но лучше на всякий случай сделайте Tabl void*).


а от этого есть какой либо реальный толк? или только лишняя строка в коде?

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


16/07/14
8334
Цюрих
Andrey_Kireew в сообщении #1325981 писал(а):
только я int преобразую в double, а это - не буду преобразовывать
Преобразование int в double и int* в double* - это две большие разницы.

Andrey_Kireew в сообщении #1325981 писал(а):
а от этого есть какой либо реальный толк?
Что так будет безопасно - я уверен. В безопасности вашего варианта - не уверен (но я не то чтобы великий знаток стандарта).

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:13 


27/08/16
9426

(Оффтоп)

Andrey_Kireew в сообщении #1325981 писал(а):
сейчас то ведь всё работает
Exterminate!

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:16 


07/10/15

2400
eugensk в сообщении #1325972 писал(а):
Andrey_Kireew в сообщении #1325961 писал(а):
размеры long int и double одинаковые.

Делайте что угодно, но никогда не закладывайтесь на предполагаемые размеры, используйте sizeof(). Единственное, что всегда выполняется, это что sizeof(char)=1.


почему так? неужели sizeoff(long) и sizeoff(double) могут быть разными? если так, то действительно, придётся голову поломать, чтобы обнаружит ошибку ...

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:20 
Заслуженный участник


16/02/13
4105
Владивосток
INGELRII в сообщении #1325598 писал(а):
программист обязан обеспечить возможность поддержки кода после своего увольнения из проекта. Даже если он сам бог программирования, он должен осознавать, что ковыряться в его коде потом будут, скорее всего, именно не-боги
Не делайте этого. Тем паче что в Цэ имеются спецально для этого union.

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:21 


27/08/16
9426

(Оффтоп)

Andrey_Kireew в сообщении #1325988 писал(а):
sizeoff
:mrgreen:


Сверху лежит ссылка на прямой ответ на вопрос про одинаковость long и double.

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:22 
Заслуженный участник
Аватара пользователя


16/07/14
8334
Цюрих
Andrey_Kireew в сообщении #1325988 писал(а):
неужели sizeoff(long) и sizeoff(double) могут быть разными?
Код:
OS            arch                      size
Windows       IA-32                     4 bytes
Windows       Intel® 64 or IA-64        4 bytes
Linux         IA-32                     4 bytes
Linux         Intel® 64 or IA-64        8 bytes
Mac OS X      IA-32                     4 bytes
Mac OS X      Intel® 64 or IA-64        8 bytes

(Оффтоп)

А за неоформление таблиц $\TeX$'ом по рукам тут бьют?
.

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:23 


07/10/15

2400
mihaild в сообщении #1325985 писал(а):
Преобразование int в double и int* в double* - это две большие разницы.


ну собственно об этом и вопрос ...

В первом случае я преобразовываю int в double, и записываю в массив double, а во втором - на прямую пишу значение int как оно есть, в массив double. Но и беру потом так же - как оно есть. Какие могут быть несоответствия? ну хотя бы в теории?

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:24 
Заслуженный участник


09/05/12
25179

(mihaild)

mihaild в сообщении #1325995 писал(а):
А за неоформление таблиц $\TeX$'ом по рукам тут бьют?
В разумных пределах - нет. В данном случае разумный предел не перейден. :mrgreen:

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:26 


07/10/15

2400
mihaild
Спасибо, понял (у меня вообще под Windows, но надо просто коментарий к функции сделать нормальный и всё)

(Оффтоп)

на счёт таблиц не знаю, не замечал такого

 Профиль  
                  
 
 Re: int и double в одном массиве
Сообщение11.07.2018, 17:29 
Аватара пользователя


14/12/17
1471
деревня Инет-Кельмында
iifat в сообщении #1325990 писал(а):
Не делайте этого. Тем паче что в Цэ имеются спецально для этого union.


С динамическими размерами массивов, если один идёт после другого, union может и не подойти.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

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



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

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


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

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