Я использую 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 * из функции компрессора. Пожалуйста помоги.
Измените любой тип данных (аргумент функции *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])
чтобы избежать совпадения всего массива как параметра функции. Таким образом, во всех сценариях вы фактически передаете ссылку.
Здесь вам нужно выделить память для строки. Указатель указывает только на какую-либо последовательность байтов, подобных массиву. Вы должны использовать 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);
}
/TC
).