невозможно набрать с плавающего * на символ * - PullRequest
0 голосов
/ 11 января 2019

ошибка при типизации указателя

без указания типа float * to char *, код работает нормально, но когда я его выводил, он выдает ошибку "не удается преобразовать 'float *' в 'char *' при инициализации", хотя float * и char * будет того же размера, я просто хотел попробовать.

#include <stdio.h>
#include <iostream>

using namespace std;
int processing_block(char*,short*,short*,short*,char*,bool*,bool*);

#define monitor_w 640
#define monitor_h 480

int main()
{

short w=monitor_w/1.05, h=monitor_h/1.05;
short x=monitor_w/2,        y=monitor_h/2;
float zoomer=0.5f;
bool resume = false;
bool fix1 = false;


float *pfz= &zoomer;
short *psx= &x;

pfz=(char*)pfz;
char *pcz= pfz;

psx=(char*)psx;
char *pcx= psx;
processing_block(psx,&y,&w,&h,pcz,&resume,&fix1);
cout<<"\nx-\t"<<x<<"\ny-\t"<<y<<"\nw-\t"<<w<<"\nh-\t"<<h<<"\nzoomer-\t"<<zoomer<<"\nresume-\t"<<resume<<"\nfix1-\t"<<fix1<<endl;
return 0;
}

int processing_block(short* px,short* ya,short* wa,short* ha,char* pzoom,bool* resume,bool* fix1)
{
*pzoom=0.02+(*pzoom);
if((*px)-(*ya)>25)
    *resume = true;
else{
    *fix1= true;
    *pzoom=10.0f;
    }
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вместо:

pfz=(char*)pfz; // Does nothing, maybe give an error (assigning char* to float*)
char *pcz= pfz; // Tries to assign pfz (float*) to pcz (char*)

psx=(char*)psx; // Same
char *pcx= psx; // Same

Вы должны сделать:

char *pcz= (char*) pfz;
char *pcx= (char*) psx;
0 голосов
/ 11 января 2019

Ваш компилятор правильный. char* не является неявно конвертируемым в float* и наоборот.

Однако все указатели данных могут быть явно преобразованы (переинтерпретированы) во все другие типы указателей данных, поэтому правильное описание будет следующим:

char *pcz = reinterpret_cast<char*>(pfz);

Обратите внимание, что хотя реинтерпретация правильно сформирована, другой вопрос заключается в том, имеет ли косвенное обращение через переинтерпретированный указатель хорошо определенное поведение. Если исходный тип и новый тип не являются взаимозаменяемыми по указателю, то поведение будет неопределенным.

char, unsigned char и std::byte являются исключительными в том смысле, что косвенное обращение через указатель на них хорошо определено, даже если указатель был переосмыслен из любого другого типа до тех пор, пока указан объект существует - хотя, помните, что поведение не определено, если вы читаете неопределенное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...