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
8555
Цюрих
Надо внимательно посмотреть, не получится ли чего-то нехорошего при приведении long int* к double*, но вроде нет. Если ваши Values и Numbers не пересекаются (если пересекаются - то это уже undefined behavior), то всё должно быть нормально (но лучше на всякий случай сделайте Tabl void*).

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


14/12/17
1473
деревня Инет-Кельмында
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
8555
Цюрих
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
4117
Владивосток
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
8555
Цюрих
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
1473
деревня Инет-Кельмында
iifat в сообщении #1325990 писал(а):
Не делайте этого. Тем паче что в Цэ имеются спецально для этого union.


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

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

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



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

Сейчас этот форум просматривают: mihaild


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

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