2015-01-16 2 views
2

У меня есть код, который имеет 2 удвоения в качестве ввода, а затем я хочу преобразовать его в 2 ints. Я думаю, что это либо проблема с разыменованием, либо мой синтаксис кастинга отключен. Заранее спасибоОшибка при преобразовании double в int

#include <stdio.h> 

int main() 
{ 
    double * int1; 
    double * int2; 

    printf("Put in two numbers:"); 
    scanf("%lf", int1); 
    scanf("%lf", int2); 

    int a = (int) (int1); 
    int b = (int) (int2); 

    printf("%d\n%d", a, b); 
} 

ответ

0

Как я вижу, вы могли бы сделать это двумя способами, используя указатели и динамическую память в куче и одну с автоматическими значениями.

Указатели с динамически распределяемой памяти

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    double * int1 = malloc(sizeof(double)); 
    double * int2 = malloc(sizeof(double)); 

    printf("Put in two numbers:"); 
    scanf("%lf", int1); 
    scanf("%lf", int2); 

    int a = (int) *int1; 
    int b = (int) *int2; 

    printf("%d\n%d", a, b); 
    free(int1); 
    free(int2); 
} 

Автоматические значения, выделенные на системном стеке

#include <stdio.h> 

int main() 
{ 
    double int1; 
    double int2; 

    printf("Put in two numbers:"); 
    scanf("%lf", &int1); 
    scanf("%lf", &int2); 

    int a = (int) int1; 
    int b = (int) int2; 

    printf("%d\n%d", a, b); 
} 

Примечания: один вопрос, который я вижу с тем, как указатели используются в вашем примере является то, что нет память, в которой они указывают, и я считаю, что scanf не выделяет память для указателя.

0

Меняйте Линии

scanf("%lf", int1); 
scanf("%lf", int2); 

Для

scanf("%lf", &int1);   //Use '&' 
scanf("%lf", &int2); 

не использовать переменную указатель для этого.

+0

Это все еще дает мне ошибку: отбрасывается от указателя до целого разного размера [-Werror = pointer-to-int-cast] –

2

It still says error: cast from pointer to integer of different size

Вы не выбрасываете «double to int» ... вы бросаете «double * to int».

Изменить

int a = (int) (int1); 
/*    ^^^^ this is a pointer */ 

в

int a = (int) (*int1); 
/*    ^^^^^ this is a double */ 
0

Ваша программа должна выглядеть следующим образом:

#include <stdio.h> 

int main(void) 
{ 
    double value1; 
    double value2; 

    printf("Put in two numbers:"); 
    scanf("%lf", &value1); 
    scanf("%lf", &value2); 

    int a = value1; 
    int b = value2; 

    printf("a=%d b=%d\n", a, b); 
} 

Параметр, передаваемый scanf потребности быть адрес соответствующей переменной. Поэтому вам нужно объявить переменную, например. double value1, а затем передать адрес этой переменной в scanf, например. scanf(..., &value1);.

Язык C поддерживает неявное литье double до int, так что вам совсем не требуется бросок. Неявное преобразование усекает число. Если вы хотите, чтобы число округлено до ближайшего int, вам нужно будет использовать функцию round.

Смежные вопросы