LINUX.ORG.RU

Дефолтное значение для параметра типа unsigned char*

 


0

1

У функции типа foo(unsigned char* bar). нужно значение по умолчанию задать.
Пытался сделать foo(unsigned char* bar = «testng»), но в итоге ругается:

аргумент по умолчанию для параметра типа «unsigned char*» имеет тип «const char [9]»
Как правильно привести тип и вообще задать дефолтное значение?

★★★★★

Ответ на: комментарий от deterok

Возможно я упорот и старомоден, но я бы передавал некий NULL, а внутри уже бы проверял там все что нужно. Значения по - умолчанию я считаю злом.

Seraph ()
Ответ на: комментарий от seed_stil

Как бы мне заставить все это работать. Мало того, что в хейдере объявлять переменные дурно тон(насколько мне известно)...
Делаю так:

unsigned char bar_default[] = "ttesting";
class Some {
	public:
		Some(unsigned bar[] = bar_default);
...
Получаю:
./src/HCEngine.o:(.data+0x0): multiple definition of `bar_default'
./src/HCEWindow.o:(.data+0x0): first defined here
Как мне правильно разрулить эту ситуацию?

deterok ★★★★★ ()

аргумент по умолчанию для параметра типа «unsigned char*» имеет тип «const char [9]»

Почему ты хочешь привести тип, а не вдуматься в ошибку и понять, что ты делаешь не так? Строковая константа «testng» на то и константа, что ее нельзя изменить. Если твоя foo() не изменяет передеваемый ей параметр, то передавай его как const char*. Если изменяет - тогда вызов с параметром по умолчанию будет пытаться изменить константу, что есть ошибка.

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

В смысле объявить ее с параметром типа const unsigned char*?

deterok ★★★★★ ()
Ответ на: комментарий от Pavval

Нет, ну с const char* работать то будет, а вот как правильно это(задать значение по умолчанию) сделать для const unsigned char*

deterok ★★★★★ ()
Ответ на: комментарий от deterok

char может быть как signed, так и unsigned на усмотрение компилятора. Строковые константы имеют тип const char*. В твоем случае у тебя видимо компилятор, который представляет char как signed. Нафиг тебе именно unsigned?

Pavval ★★★★★ ()
Ответ на: комментарий от deterok

эмм... я бы оставил все это порно в .cpp, а в хидере просто поставил бы комментарий // default value = «testing»

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

seed_stil ★★ ()
Ответ на: комментарий от Pavval

Eсть функция

int XChangeProperty(
    Display*		/* display */,
    Window		/* w */,
    Atom		/* property */,
    Atom		/* type */,
    int			/* format */,
    int			/* mode */,
    _Xconst unsigned char*	/* data */,
    int			/* nelements */
);
Ее предпоследний параметр _Xconst unsigned char*.

deterok ★★★★★ ()
Ответ на: комментарий от deterok
//tt.hpp
#pragma once
#include <string>

class TT
{
	public:
		TT(std::string a = std::string("hello"));
};
//tt.cpp
#include "tt.hpp"
#include <cstdio>

TT::TT(std::string a)
{
	puts(a.c_str());
}
//tt_main.cpp
#include "tt.hpp"

int main()
{
	TT t1;
	TT t2("tt");
}
nanoolinux ★★★★ ()
Ответ на: комментарий от Pavval

Еще небольшой вопрос немного не в тему:
Делаю:

const_cast<char*>(&"qwertyui")
Получаю:
 некорректное применение const_cast от типа «const char (*)[9]» к типу «char*»
Почему так?
Что означает (*)?

deterok ★★★★★ ()
Ответ на: комментарий от deterok

Звездочка означает, что это указатель на const char [9].

anonymous ()
Ответ на: комментарий от deterok

Во первых, нужно const_cast<char*>(«qwertyui»). Во-вторых, за такой const_cast нужно руки отрывать, т.к. чревато крешем проги.

Pavval ★★★★★ ()
Ответ на: комментарий от deterok

_Xconst unsigned char*

А _Xconst - видимо какой-то дефайн на const, так? Если нет, то как-то странно.

Если у тебя ф-ция принимает unsigned char и тебе нужно передать ASCII строку (т.е. такую, в которой коды букв не превышают 127), то static_cast прокатит.

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

Упс, я имел ввиду reinterpret_cast:

reinterpret_cast<const unsigned char*>(«shit»);

Pavval ★★★★★ ()
Последнее исправление: Pavval (всего исправлений: 1)
Ответ на: комментарий от Pavval

Еще один вопросик возник:
Нашел на просторах такой код

void * tmp = const_cast<char*>("abcdg");
unsigned char *p = static_cast<unsigned char*>(tmp);
Чем он лучше
char * tmp = const_cast<char*>("abcdg");
unsigned char *p = reinterpriter_cast<unsigned char*>(tmp);
?
Есть дополнительные проверки?

deterok ★★★★★ ()
Ответ на: комментарий от deterok

Достаточно reinterpret_cast<unsigned char*>(«shit»). Но любой ценой избегай убирания const при передаче параметра в неизвестную функцию. Уж лучше что-то типа:

unsigned char buf[100];
strcpy(reinterpret_cast<char*>(buf), "shit");
foo(buf);
Pavval ★★★★★ ()
Ответ на: комментарий от deterok

слушай, будь другом, скажи пожалуйста, у тебя есть реальная аргументация против std::string? я не хотел бы тебя задалбывать, решай свои проблемы так, как тебе кажется правильным, но я например вообще не вижу смысла во всей этой ахинее, типа const_cast и прочее. ты можешь ответить конкретно почему ты не хочешь использовать std::string? спасибо.

nanoolinux ★★★★ ()
Ответ на: комментарий от nanoolinux

Я не против string, даже всеми руками за.
В данном случае мне необходимо было использовать для параметра именно char*, ибо он используется всего в одной функции, а из-за нее тянуть либу было неохота.
Может я в чем то не прав(2 года назад ушел с C++ на Python и многое позабыл), но мне кажется это логичным.

deterok ★★★★★ ()
Ответ на: комментарий от nanoolinux

В любом случае придется приводить к типу unsigned char*, а если использовать string то придется еще сначала привести его к char*.

deterok ★★★★★ ()
Ответ на: комментарий от nanoolinux

Вообще я повсеместно стараюсь использовать string.

deterok ★★★★★ ()
Ответ на: комментарий от deterok

а если использовать string то придется еще сначала привести его к char*.

А в чем проблема?

Dudraug ★★★★★ ()
Ответ на: комментарий от deterok

Ты завязывай с грибами, скоро не сможешь шнурки завязать.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.