Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция, преобразование типов 
:(
    Опции темы
denisminb
Дата 12.5.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

Репутация: нет
Всего: нет



Добрый день,объясните пожалуйста как исправить ошибку?есть функция(примитивно набрасал суть),принимает значения,хочу чтоб возвратил Z
в основную прогу, понятно что z у меня дубл, а функция войд
как быть?


Код

void *func1(double Esp,unsigned long delit)
{
...........................
............................
остальной код
.....................
    int i=2;
    double Z = 0.0;
    Z+= i;
...............далее остальное............
.............................
..........................
               
return Z;

}


компилятор выдает 
Description    Resource    Path    Location    Type
cannot convert 'double' to 'void*' in return    threads.cc    /threads    line 28    C/C++ Problem



PM MAIL   Вверх
Фантом
Дата 12.5.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



А почему, собственно, функция возвращает void*, а не double?
PM   Вверх
denisminb
Дата 12.5.2013, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

Репутация: нет
Всего: нет



Цитата(Фантом @ 12.5.2013,  14:51)
А почему, собственно, функция возвращает void*, а не double?

нужно использовать void* в программе.
понятно если сделать double func1(double Esp,unsigned long delit)  - всё будет работать.


Это сообщение отредактировал(а) denisminb - 12.5.2013, 15:10
PM MAIL   Вверх
Фантом
Дата 12.5.2013, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Тогда давайте детальнее: что именно из прототипа функции Вам необходимо сохранить, можно ли использовать возвращаемый указатель для передачи нужного значения в каком-либо виде?
PM   Вверх
Фантом
Дата 12.5.2013, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Впрочем, положительный ответ на второй вопрос, пожалуй, Вы уже дали. Тогда можно сделать как-то так:
Код

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

void* foo(double x, double y)
{
    double* Z;  // Создали указатель
    Z=malloc(sizeof(double)); // Выделили участок памяти
    *Z=(x+y)*1.5; //Записали в него значение
    return Z; // Вернули
}

int main()
{
    double* q; // Создали указатель для приема результата
    q=(double*)foo(3.0,4.0); // Приняли результат, преобразовав нужным образом тип возвращаемого указателя
    printf("%lf\n",*q); // Сделали с ним что-то полезное
    free(q); // Порядка ради освободили память
}


PM   Вверх
denisminb
Дата 12.5.2013, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

Репутация: нет
Всего: нет



Цитата(Фантом @ 12.5.2013,  15:28)
Тогда давайте детальнее: что именно из прототипа функции Вам необходимо сохранить, можно ли использовать возвращаемый указатель для передачи нужного значения в каком-либо виде?

если правильно Вас понял,то ...
Код

//прототип
void *func1(double Esp,unsigned long delit);


Код

//сама функции
void *func1(double Esp,unsigned long delit)
{
...........................
............................

    double Z = 0.0;
  .............................              
return Z;

}


Сохранить в прототипе нужно всё
если правильно вас понял,то возвращать значение z в основную прогу нужно в дубль.
PM MAIL   Вверх
denisminb
Дата 12.5.2013, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.6.2012

Репутация: нет
Всего: нет



Цитата(Фантом @ 12.5.2013,  15:43)
Впрочем, положительный ответ на второй вопрос, пожалуй, Вы уже дали. Тогда можно сделать как-то так:
Код

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

void* foo(double x, double y)
{
    double* Z;  // Создали указатель
    Z=malloc(sizeof(double)); // Выделили участок памяти
    *Z=(x+y)*1.5; //Записали в него значение
    return Z; // Вернули
}

int main()
{
    double* q; // Создали указатель для приема результата
    q=(double*)foo(3.0,4.0); // Приняли результат, преобразовав нужным образом тип возвращаемого указателя
    printf("%lf\n",*q); // Сделали с ним что-то полезное
    free(q); // Порядка ради освободили память
}

Спасибо,сделал как Вы сказали,но выдает следующее на Вашем примере:
Description    Resource    Path    Location    Type
invalid conversion from 'void*' to 'double*'    threads.cc    /threads    line 18    C/C++ Problem
на выделении памяти,если без выделения
'Z' is used uninitialized in this function - как предупреждение, компилится,но не возвращает ничего в консоле,это на строке *Z=(x+y)*1.5;




PM MAIL   Вверх
kolesnle
Дата 12.5.2013, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 22.3.2013

Репутация: нет
Всего: нет



Код

#include<stdio.h>
#include<stdlib.h>
void* foo(double x, double y)
{
    double* Z;  // Создали указатель
    Z=(double*)malloc(sizeof(double)); // Выделили участок памяти
    *Z=(x+y)*1.5; //Записали в него значение
    return Z; // Вернули
}
int main(void)
{
    double* q; // Создали указатель для приема результата
    q=(double*)foo(3.0,4.0); // Приняли результат, преобразовав нужным образом тип возвращаемого указателя
    printf("%lf\n",*q); // Сделали с ним что-то полезное
    free(q); // Порядка ради освободили память
}

Теперче будет компилироваться на C++ компиляторе

Добавлено @ 18:10
C++ный компилятор более строгий, чем сишный, поэтому он допускает присвоение любого указателя void*, но не допускает void* любому указателю

Это сообщение отредактировал(а) kolesnle - 12.5.2013, 18:12
PM MAIL   Вверх
Фантом
Дата 12.5.2013, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(denisminb @  12.5.2013,  18:27 Найти цитируемый пост)

Спасибо,сделал как Вы сказали,но выдает следующее на Вашем примере:

Я писал пример на C.  Если Вы компилируете это как программу C++, то надо сделать еще одно преобразование типа указателя: поменять
Код

Z=malloc(sizeof(double));

на
Код

Z=(double*)(malloc(sizeof(double)));

А еще правильней в случае C++ воспользоваться new.  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0951 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.