что я делаю не так?
strlen(source)
байт для вывода, а потом находишь compSize
, который может быть и больше чем strlen(source)
. Ты не возвращаешь compSize
после вызова compress
, а он может измениться. Ты возвращаешь только char*
, как будто это строка, но это не строка, там могут быть нулевые байты.uncompress_char
почти те же самые ошибки. Плюс какая-то путаница между length
, compSize
и ucompSize
. На вход uncompress
в параметре compSize
должен попасть настоящий размер сжатых данных, а не догадка о нём на основе вызова compressBound
.char* compress_char(const char* source, size_t *outCompSize, size_t *outUcompSize)
{
uLong ucompSize = strlen(source) + 1;
uLong compSize = compressBound(ucompSize);
char* bytes = malloc(compSize);
compress((Bytef *)bytes, &compSize, (Bytef *)source, ucompSize);
*outCompSize = compSize;
*outUcompSize = ucompSize;
return bytes;
}
char* uncompress_char(const unsigned char source[], size_t inCompSize, size_t inUcompSize)
{
uLong ucompSize = inUcompSize;
uLong compSize = inCompSize;
char* message = malloc(ucompSize);
uncompress((Bytef *)message, &ucompSize, (Bytef *)source, compSize);
return message;
}
void foo(void)
{
size_t a, b;
char *p = compress_char("{\"a2\":\"b\"}", &a, &b);
char *p1 = uncompress_char(p, a, b);
printf("%s, %zd -> %zd\n", p1, b, a);
}
compress
/uncompress
. У меня есть код на C++, который использует zlib. Я хочу на линуксе его скомпилировать в .so библиотеку, но чтобы команда ldd не показывала libz.so или libz.so.1 (чтобы zlib был встроен в .so).
-Bstatic
и -Bdynamic
можно переключать режим линковки библиотек:g++ -shared foo.cc -o libfoo.so -Wl,-Bstatic -lz -Wl,-Bdynamic
-fpic
. Последняя кавычка ни в какую не хочет убираться, не могу понять, в чем дело
std::string variable_value = var.substr(variable_value_start + 1, variable_value_end - 1);
std::string::substr
-- это длина выделяемой подстроки, а не индекс конца.std::string variable_value = var.substr(variable_value_start + 1,
variable_value_end - variable_value_start - 1);
for (int i = 0; i<2; i++){ group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i])); }
group[2].Print();
void Group::Print(){
for (int i = 0; i<sizeof(array); i++){
array[i].Print();
}
};
operator double (){
int summ = 0;
for(int i = 0; i < sizeof(array); i++){
summ += array[i].getCost();
}
Если в официальной доке с++ где-то написано "переопределение возможно тогда и только тогда, когда есть virtual у метода базового класса"
то почему именно так?
error C2835: user-defined conversion 'operator`double'' takes no formal parameters
operator double (int limit)
невозможна. Вторая ошибка -- это следствие первой.Определим в объекте Group две функции с одинаковым именем, например double Age(); и double Age(int limit);.
void EcsSystems::Add(IEcsSystem* system) { _systems.push_back(system); if (IRunSystem* runSystem = static_cast<IRunSystem*>(system)) { _runSystems.push_back(runSystem); } }
Помогите, пожалуйста
MultiplyMatrices
переписать как три обычных вложенных цикла, всё работает нормально. float* vMultiplyMatrices(const float* matrix_1, const float* matrix_2)
{
__m128 vector_2;//переменная для хранения значения второй матрицы
__m128 result_vector;//переменная для записи итоговой марицы
auto* result_matrix = (float*)_mm_malloc(N * N * sizeof(float), 16);//выделение памяти с выравниванием
(2) //memset(result_matrix, 0, N * N * sizeof(float));
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
__m128 element_vector = _mm_set1_ps(matrix_1[i * N + j]);//4 позиции в одно значение
for (int k = 0; k < N; k += 4) {
vector_2 = _mm_load_ps(&matrix_2[j * N + k]);//4 значение по адресу
(1) result_vector = _mm_load_ps(&result_matrix[i * N + k]);
result_vector = _mm_add_ps(result_vector, _mm_mul_ps(element_vector, vector_2));
_mm_store_ps(&result_matrix[i * N + k], result_vector);
}
}
}
return result_matrix;
}
result_vector
неинициализированные значения из result_matrix
и дальше используешь их в арифметике. Если раскомментировать memset
(2), то выполнение доходит до конца без nan.Почему при использовании переменной в методе, выдает ошибку
class Test { static std::string question;
std::string Test::question;
Что будет?
obj->execute()
, т.е. виртуальный вызов конечного переопределения для функции obj1::execute
в объекте класса obj3. См. eelis.net/c++draft/expr.call#3Я не понимаю как это будет работать с классами наследниками и виртуальной функцией.
Почему в 93 строке (bptr = (schoolboy*)&a1;) пишет progress=<Ошибка при чтении символов строки>
cout << *bptr;
, а происходит это потому что bptr указывает на объект, конечный тип которого -- class student
. У такого объекта в его представлении в памяти нет никакого поля progress
, поэтому код который пытается его вывести ведёт себя таким образом. Вообще это пример неопределённого поведения.как это исправить?
C++
Нужно в двумерный массив char записать эти строки
std::string
, массив -- это std::vector
, используй std::getline
и например std::vector::push_back
.