Данные без знака char * как тип возвращаемого значения функции в c ++ или c [duplicate]

0

Я использую Visual Studio 2010 с CLR (Common Language Run Time). Я хочу вернуть unsigned char * из функции compress в главную функцию, но оба unsigned char * и char *, дающие erro

"Ошибка 7 ошибки C2440:" = ": невозможно преобразовать из" char * "в" unsigned char * "F:\4-2\Thesis\PROJECT\Сжатие базы данных Главная\Сжатие базы данных 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 * из функции компрессора. Пожалуйста помоги.

  • 0
    Приведение явно требуется, так как вы используете компилятор C ++. Или перейдите на компилятор C с опциями ( /TC ).
  • 0
    @Josh Джош, это о фактическом и формальном типе параметра, но я звоню о возвращаемом типе. Пожалуйста, помогите мне.
Теги:
return-type
visual-studio-2010
clr

2 ответа

3
Лучший ответ

Измените любой тип данных (аргумент функции *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*)

Существует три типа char: (plain) char, signed char и unsigned char. Любой char обычно представляет собой 8-битное целое число * (там нет выделенного "символьного типа" на языке C), и в этом смысле signed и unsigned char имеют полезное значение (обычно эквивалентное uint8_t и int8_t). При использовании в качестве символа в смысле текста используйте 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);
}

Кроме того, для простоты вы можете использовать указатель на указатель

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]) чтобы избежать совпадения всего массива как параметра функции. Таким образом, во всех сценариях вы фактически передаете ссылку.

0

Здесь вам нужно выделить память для строки. Указатель указывает только на какую-либо последовательность байтов, подобных массиву. Вы должны использовать calloc или malloc для C и new для C++ для выделения требуемого адреса памяти. используйте typecasting для преобразования 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);
}
  • 0
    большой объем утечки памяти и ненужное динамическое распределение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню