2013-11-18 3 views
1

Я новичок в программировании. У меня есть эта проблема. У меня есть переменнаяTypecast unsigned int to unsigned long int C++

unsigned long address; 

Я использую

fscanf(pFile, "%x\n", &address); 

прочитать эти данные из файла. Файл имеет его в Hex (без 0x), и он преобразует его в десятичный и сохраняется. Поэтому я вроде бы не хочу менять эту часть. Когда я компилирую с помощью G ++, он просит меня изменить адрес для

unsigned int address; 

Теперь этот «адрес» переменных используется в функции, которые я буду называть, что имеет параметр как «без знака долго». Так что, если я «адрес», чтобы «без знака Int», как я называю эту функцию

function(address); 

таким образом, что адрес typecasted в неподписанных долгое

+0

Как вы спрашиваете? –

+0

Это что-то вроде этого, хотя и не удалось скопировать точную информацию с терминала. предупреждение: формат% x ожидает тип unsigned int * a, но аргумент 5 имеет тип long unsigned int * a – user2958473

+0

@ user2958473 Теперь попробуйте подумать об этом. Все дело в строгом псевдониме. См. Мой ответ для объяснения. –

ответ

2

Вы приближаетесь к проблеме из-за неправильного направления.

При работе с указателями вы не можете просто псевдонизировать объект с помощью указателя на другой тип. Спецификатор преобразования %x дает команду scanf() принять unsigned int *, поэтому вы получите неопределенное поведение, если вы передадите ему адрес unsigned long. Если вы хотите сканировать unsigned long, а затем использовать соответствующий модификатор:

unsigned long address; 
scanf("%lx", &address); 

Однако, если вы хотите изменить address быть unsigned int, то вы не должны делать что-нибудь еще - unsigned int будет неявно преобразован в соответствующий тип (unsigned long в этом случае) при передаче функции. Нет никакой необходимости в каком-либо приведении типов. Для уточнения, следующий код является правильным:

void foo(unsigned long n) { } 

unsigned int address; 
scanf("%x", &address); 
foo(address); // implicit conversion happens 
+0

+1 за предложение не делать. – haccks

+0

Я пробовал% ls, и это сработало. Большое спасибо. – user2958473

+1

@hacces Спасибо. –

0

В C вы можете сделать как

function((unsigned long)address); 
+0

Но зачем ему это делать? –

+1

@ H2CO3; Потому что он хотел это сделать. Я думал о неявной рекламе. :) – haccks

4

При передаче адреса в fscanf() тип должен соответствовать спецификатор формата точно. Когда вы используете %x, вы заявляете, что собираетесь передать указатель на unsigned int. Если вы чувствуете, что вы хотите передать указатель на unsigned long вместо этого, вы должны будете использовать спецификатор формата %lx вместо:

if (fscanf(pFile, "%lx", &address) == 1) { 
    // ... 
} 

(я не могу использовать функции ввода без проверки также, что вход был успешным. ..).

+0

Я пробовал% ls, и это действительно сработало. Большое спасибо! – user2958473

+1

@ user2958473: Я предполагаю, что вы пробовали ''% lx '', а не ''% ls'', поскольку последний на самом деле не должен работать (модификатор 'l', примененный к спецификатору формата' s', означает, что строка на которую указывает соответствующая целевая точка, имеет тип 'wchar_t *', а не 'char *', как это обычно бывает). –

+0

О да. Я имел в виду% lx. Спасибо. – user2958473

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