Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Получить адрес глобальной переменной.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
хочу получить адрес глобальной переменной
делаю так
Код
uint32_t SetVariable(char *var)
{
    if(strcmp(var,"temp")==0) return &temperature;
    if(strcmp(var,"hum")==0)  return &humidity;
    return 0;
}

Получаю
return makes integer from pointer without a cast [enabled by default]
gerber
Цитата(Jenya7 @ Jan 21 2016, 12:21) *
хочу получить адрес глобальной переменной
делаю так

Хотите получить адрес - адрес и возвращайте:
Код
uint32_t* SetVariable(char *var)
{
    if(strcmp(var,"temp")==0) return &temperature;
    if(strcmp(var,"hum")==0)  return &humidity;
    return 0;
}

Хотите получить значение переменной:
Код
uint32_t SetVariable(char *var)
{
    if(strcmp(var,"temp")==0) return temperature;
    if(strcmp(var,"hum")==0)  return humidity;
    return 0;
}

В обоих случаях название функции не отражает её сути, это скорее GetVariable.
skripach
Цитата(Jenya7 @ Jan 21 2016, 12:21) *
хочу получить адрес


Код
uint32_t SetVariable(char *var)
{
    if(strcmp(var,"temp")==0) return (uint32_t)&temperature;
    if(strcmp(var,"hum")==0)  return (uint32_t)&humidity;
    return 0;
}

..если действительно нужен адрес.
Jenya7
Цитата(skripach @ Jan 21 2016, 14:38) *
Код
uint32_t SetVariable(char *var)
{
    if(strcmp(var,"temp")==0) return (uint32_t)&temperature;
    if(strcmp(var,"hum")==0)  return (uint32_t)&humidity;
    return 0;
}

..если действительно нужен адрес.

действительно нужен адрес. но так ругается - return makes integer from pointer without a cast [enabled by default]


а понял. спасибо.

компайлер осторожничает. требует явного приведения.
SlavaV
Вам же gerber написал, если хотите возвращать адрес укажите что функция возвращает адрес (указатель) uint32_t* SetVariable(char *var)

PS если возвращаете адрес это ни есть хорош return 0, есть nullptr.
Jenya7
Цитата(SlavaV @ Jan 21 2016, 14:58) *
Вам же gerber написал, если хотите возвращать адрес укажите что функция возвращает адрес (указатель) uint32_t* SetVariable(char *var)

PS если возвращаете адрес это ни есть хорош return 0, есть nullptr.

так я получаю - return from incompatible pointer type [enabled by default]
SlavaV
приведите пожалуйста код где объявлена глобальная переменная.

И объявлена она в этом же файле?
skripach
Цитата(SlavaV @ Jan 21 2016, 12:58) *
aдрес (указатель)

Адрес и указатель всё же разные вещи.
Сергей Борщ
Чтобы не было мучительно больно в дальнейшем, для хранения адреса используйте не uint32_t, а специально предназначенный для этого uintptr_t. Тогда этот код будет работать и на AVR и под 64-битной Windows. А в общем случае, да, надо использовать указатель.
Цитата(Jenya7 @ Jan 21 2016, 11:49) *
компайлер осторожничает. требует явного приведения.
Компилятор строго выполняет требования Стандарта о неявном приведении типов.
Jenya7
извиняюсь.моя ошибка - у меня переменная флоат.
то есть так я получу адрес переменной?
Код
float * SetVariable(char *var)
{
    var = ToLower(var);
    if(strcmp(var,"temp")==0) return &temperature;
    if(strcmp(var,"hum")==0)  return &humidity;
       return 0;
}

конечная цель сохранить адрес в структуре и иметь доступ к переменной.
Код
struct sTaskParams
{
    float *var;
    float compValue;
    uint8_t logicGate    
       uint8_t compare
};

struct sTaskParams param;

param.var = SetVariable(“temp”);
if(*(param.var) > 100)
  //do something
CrimsonPig
Цитата(Jenya7 @ Jan 21 2016, 10:56) *
извиняюсь.моя ошибка - у меня переменная флоат.
то есть так я получу адрес переменной?


Гы-гы-гы, нет, конечно..
Вас тут половина форума уже почти год пытается научить кодить пристойно , а воз и ныне там.
Ваша гениальная SetVariable() функция обладает следующими методологическими недостатками:
- Как уже указывалось выше, ее имя не соответствует тому, что она делает
- У нее есть замечательный side effect: либо она пытатся изменить данные по указателю, передаваемому в качестве параметра (привет ToLower("abcd")), либо ToLower() работает криво (одно из двух: теряет память, или возвращает указатель на удаленные данные на стеке).

Jenya7
вобщем то, несмотря на ущербные названия функции и прочие страсти все работает.
а если я хочу сделать обратную операцию? вернуть название переменой по ее адресу?
Код
char *GetVariable(float var)
{
    float * fptr;
    fptr = &var;
    switch ((uint32_t)fptr)
    {
        case 0: return "TEMP";  break;
        case 1: return "HUM";   break;
        case 2:    return "SOIL";  break;
        case 3:    return "LIGHT"; break;
        default: return " ";    break;
    }
}

как мне в кейсах прописать адреса переменных?
gerber
Цитата(Jenya7 @ Jan 25 2016, 10:58) *
а если я хочу сделать обратную операцию? вернуть название переменой по ее адресу?

В вашем примере var - локальная переменная на стеке, поэтому сравнивать её адрес с чем-то бессмысленно.
И break после return тоже лишний.
В функцию нужно передавать уже адрес глобальной переменной.
Код
const char *GetVariableName(float* var_addr)
{
    switch (var_addr)
    {
        case &temperature:  return "TEMP";
        case &humidity:        return "HUM";
        case &soil:            return "SOIL";
        case &light:           return "LIGHT";
        default:                    return "";
    }
}
Сергей Борщ
Цитата(Jenya7 @ Jan 25 2016, 09:58) *
как мне в кейсах прописать адреса переменных?
Для начала вам надо усвоить такие понятия, как передача параметра в функцию по значению и по указателю.
Код
char * GetVariable(float * var)
{
    if(var == &temperature)
        return "TEMP"
    elseif(var == &humidity)
        return "HUM";
   ....
}

Со switch() не получится - он требует, чтобы метки case были константными выражениями времени компиляции. А адреса переменным присваивает линкер, т.е. на этапе компиляции они неизвестны.
Jenya7
понял. спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.