【问题标题】:Unsigned char * data as return type of a function in c++ or c [duplicate]Unsigned char * data作为c ++或c中函数的返回类型[重复]
【发布时间】:2014-11-04 09:17:12
【问题描述】:

我正在使用带有 CLR(通用语言运行时)的 Visual Studio 2010。 我想将 unsigned char * 从 compress 函数返回到 main 函数,但 unsigned char * 和 char * 都给出错误

“错误 7 错误 C2440: '=' : 无法从 'char *' 转换为 'unsigned char *' F:\4-2\Thesis\PROJECT\Database Compression Main\Database Compression 2\db_comp_main.cpp 21”

unsigned char* compressor(char *data)
{
    unsigned char *compressed_string;
    //With some process I had compressed string of data variable as unsigned char* in variable compressed_string successfully and also printed here. Now want to return it from here.
    return compressed_string;
}
int main()
{ 
  unsigned char *main_data; 
  main_data=compressor("Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");// When I click the error from error list the cursor is put here beside str by visual studio.
  printf("%s",main_data);
}

需要从压缩函数返回 unsigned char * 类型的数据。请帮忙。

【问题讨论】:

  • Cast 是明确要求的,因为您使用的是 C++ 编译器。或者更改为带有选项的 C 编译器 (/TC)。
  • @Josh 是关于实际和形式参数类型的,但我正在调用返回类型。请帮帮我。

标签: c++ c visual-studio-2010 clr return-type


【解决方案1】:

更改任何数据类型(函数参数*data 或局部变量*main_data)以匹配类型。试试这个

unsigned char *main_data;

或者....

简单的类型转换将使其正常工作:

unsigned char* compressor(char *data)
{
    unsigned char *compressed_string;
    compressed_string = (unsigned char*) data;
    return compressed_string;
}
int main()
{
  char *main_data;
  main_data=(char*) compressor("Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");
  printf("%s",main_data);
}

或者……

(用char*改变一切)

共有三种字符类型:(普通)charsigned charunsigned char。任何char 通常是一个 8 位整数*(C 语言中没有专用的“字符类型”),从这个意义上说,signedunsigned char 具有有用的含义(通常等同于 uint8_t 和 @ 987654333@)。当用作文本意义上的字符时,请使用char(也称为纯字符)。这通常是signed char,但可以由编译器以任何一种方式实现。所以我认为在这里使用char* 是安全的。

工作示例(将char * 视为数据类型):

char* compressor(char *data)
{
    char *compressed_string;
    compressed_string = "compressed";
    // compressed_string = data;
    return compressed_string;
}
int main()
{ 
  char *main_data; 
  main_data=compressor("Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");
  printf("%s",main_data);
}

此外,为简单起见,您可以使用 pointer to pointer

void compressor(char **data) {
    *data = "compressed"; // assuming the compressed data will be smaller in length of main data, so buffer overflow won't occur  
}

int main() {
    char *main_data = "Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh";
    compressor(&main_data);
    printf("%s", main_data);
    return 0;
}

编辑

当您询问通过引用传递的替代方法时,除了通过引用传递之外别无他法将数组作为函数参数传递。因为当您写void func(char str[]) 时,您可能会认为您正在执行按值传递。但是 g++ 编译器会将语句优化为 void func(char &str[0]) 以避免将整个数组作为函数参数处理。因此,在所有情况下,您实际上都是通过引用传递。

【讨论】:

    【解决方案2】:

    这里你必须为字符串分配内存。指针只指向地址而不是任何字节序列,如数组。对于 C,您必须使用 calloc 或 malloc,对于 C++,必须使用 new 来分配所需的内存地址。使用类型转换将 char* 转换为 unsigned char*。

    #include <bits\stdc++.h>
    unsigned char* compressor(unsigned char *data)
    {
        unsigned char *compressed_string = new unsigned char[100];
        //With some process I had compressed string of data variable as unsigned unsigned char** in variable compressed_string successfully and also printed here. Now want to return it from here.
        compressed_string = (unsigned char*)"working";
        return compressed_string;
    }
    int main()
    {
      unsigned char *main_data = new unsigned char[1000];
      main_data=compressor((unsigned char*)"Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");// When I click the error from error list the cursor is put here beside str by visual studio.
      printf("%s",main_data);
    }
    

    您可以根据需要使用不同的输入变量来使用内存,以避免不必要的动态分配。

    #include <bits\stdc++.h>
    unsigned char* compressor(unsigned char *data) {
        unsigned char *compressed_string = new unsigned char[strlen((char*)data)+1];
        //With some process I had compressed string of data variable as unsigned char* in variable compressed_string successfully and also printed here. Now want to return it from here.
        compressed_string = (unsigned char*)"working";
        return compressed_string;
    }
    int main() {
        unsigned char *inp = new unsigned char[1000];
        inp = (unsigned char*)"Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh";
        unsigned char *main_data = new unsigned char[strlen((char*)inp)+1];
        main_data = compressor(inp);
        printf("%s",main_data);
    }
    

    【讨论】:

    • 大量内存泄漏代码和不必要的动态分配。
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2018-05-09
    • 2014-09-06
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多