Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как преобразовать значение из файла в переменную? как преобразовать значение в int? 
V
    Опции темы
BlackSkull
Дата 20.6.2016, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.6.2016

Репутация: нет
Всего: нет



Приложение должно считывать из файла(.ini) значения width и height. При создании окна использовать эти параметры. Но, при запуске, открывается input.c и указывает на строку:

Код

if ( integer64 )
                                    *(__int64 UNALIGNED *)pointer = (unsigned __int64)num64;
                                else
                                if (longone)
                     =========>     *(long UNALIGNED *)pointer = (unsigned long)number;
                                else
                                    *(short UNALIGNED *)pointer = (unsigned short)number;



Как я понимаю, полученное значение(8 байт), превышает допустимый(4 байта).

Есть две структуры:
Код

struct ConfigStruct
    {
      int iSW, iSH;
    }ini;

    struct ConfigResult
    {
      int cSW, cSH;
    }res;



В ConfigStruct, записываются полученные из файла значения. В ConfigResult, я хотел записать преобразованные в int значения.

Код

int ConfigRW::ReadConfig(char* filename)
{
    ifstream fcf;

    string line;
    fcf.open(filename,ios::in);

    while (!fcf.eof())
    {
        getline(fcf,line);

        if(line.find("iScreenWidth = ")!=line.npos)
        {
            sscanf_s(line.c_str(),"iScreenWidth = %d",&ini.iSW);
            //Нужно преобразовать значения в int
            res.cSW = ini.iSW;
        }
        if(line.find("iScreenHeight = ")!=line.npos)
        {
            sscanf_s(line.c_str(),"iScreenHeight = %d",&ini.iSH);
            //Нужно преобразовать значения в int
            res.cSH = ini.iSH;
        }
    }
    fcf.close();
    return 0;
}


В WinMain, присвоить значения из структуры ConfigResult, к переменным: ScreenWidth, ScreenHeight. 

Код

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdLine, int nCmdShow)
{
    Config->ReadConfig("../Test/Settings.ini");
    int ScreenWidth, ScreenHeight;

    ScreenWidth = Config->res.cSW;
    ScreenHeight = Config->res.cSH;
    //ScreenWidth = 1280;
    //ScreenHeight = 720;

    Prog->WinClass(hInstance);
    Prog->WinCreate(hInstance,"Test Application",ScreenWidth, ScreenHeight);
    Prog->WinLoop(msg);
}


Подскажите, пожалуйста, как правильно преобразовать значения?

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Test.zip 4,81 Kb
PM MAIL   Вверх
vol4ek
Дата 21.6.2016, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



GetPrivateProfileString() потом atoi(S.c_str())
PM MAIL ICQ   Вверх
BlackSkull
Дата 21.6.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.6.2016

Репутация: нет
Всего: нет



Цитата

GetPrivateProfileString() потом atoi(S.c_str())


Боюсь, моего скромного уровня знаний не хватит.

Как я понял из документации, необходимо написать так:

Код

int ConfigRW::ReadConfig(char* filename)
{
    char RetStr [4096];

    ini.iSW = GetPrivateProfileStringA("Dispaly Settings","iScreenWidth",NULL,RetStr,4096 * sizeof(char),filename);
    res.cSW = atoi(RetStr);
    ini.iSH = GetPrivateProfileStringA("Dispaly Settings","iScreenHeight",NULL,RetStr,4096 * sizeof(char),filename);
    res.cSH = atoi(RetStr);
    
    return 0;


Пишет: чтение памяти невозможно. RetStr возвращает необходимое значение, но подсвечен красным. Переменные iSW,iSH,cSW,cSH = ???
PM MAIL   Вверх
tierswar
Дата 21.6.2016, 16:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Может быть, в функции "ReadConfig" установить позицию в файле fcf на начало числа "высота", а затем сделать
как-то так
Код

fcf >> ini.iSH;


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
tierswar
Дата 21.6.2016, 16:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











насколько я понимаю, тогда "всё само там сделается" 

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
vol4ek
Дата 21.6.2016, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



максимальная длинна строки для функции 256 символов. зачем вы юзаете столько памяти для строк которые содержат всего 4 символа. (мониторов с разрешением более 10к не встречал) 
PM MAIL ICQ   Вверх
vol4ek
Дата 21.6.2016, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



Код

4096 * sizeof(char)

это какое-то новое извращение, которого я еще не видел. 
Код

char str[10];
GetPrivateProfileStringA("бла-бла", "бла-бла", NULL, str, sizeof(str) - 1, "бла-бла");

проверки не забудьте.
PM MAIL ICQ   Вверх
BlackSkull
Дата 21.6.2016, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.6.2016

Репутация: нет
Всего: нет



Указывает на строку:
Код

res.cSW = atoi(RetStr);


В коде:
Код

GetPrivateProfileStringA("Dispaly Settings","iScreenWidth",NULL,RetStr,sizeof(RetStr)-1,filename);
res.cSW = atoi(RetStr);


cSW,cSH - <чтение памяти невозможно>
Не понимаю. Может, с переменными(int cSW, cSH) что-то не так?
PM MAIL   Вверх
vol4ek
Дата 21.6.2016, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



накосячили со структурой
PM MAIL ICQ   Вверх
vol4ek
Дата 21.6.2016, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



сделайте конструктор инициализирующий свойства структуры раз вы запихнули ее в класс
вот тут разобрана ваша проблема

Это сообщение отредактировал(а) vol4ek - 21.6.2016, 19:20
PM MAIL ICQ   Вверх
BlackSkull
Дата 21.6.2016, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.6.2016

Репутация: нет
Всего: нет



Цитата

сделайте конструктор инициализирующий свойства структуры раз вы запихнули ее в класс


Не помогло. Та же ошибка. Может есть другой вариант осуществления задуманного?
PM MAIL   Вверх
vol4ek
Дата 21.6.2016, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



все помогло я собирал ваш проект на работе.
делаете конструктор, а обращаться к переменным так:
Код

 class clsAngle
{
    private:

        struct strctCoordinate
        {
            short siGrad;
            float fMinutes;
            char cDirection;

            strctCoordinate(short siGrad_, float fMinutes_, char cDirection_) :
               siGrad(siGrad_), fMinutes(fMinutes_), cDirection(cDirection_) 
            {
            };
        };

        strctCoordinate NS, WE;


    public:

        clsAngle() : NS(0, 0, ' '), WE(0, 0, ' ')
        {
        }
}


Код

clsAngle myAngle;
myAngle.NS.siGrad = 0;

PM MAIL ICQ   Вверх
BlackSkull
Дата 22.6.2016, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.6.2016

Репутация: нет
Всего: нет



Цитата

все помогло я собирал ваш проект на работе.
делаете конструктор, а обращаться к переменным так:


У меня, программа возвращает в ScreenWidth и ScreenHeight = -858993460.
Как я понял, считывает не те байты. С конструктором проблема. Я лишь умею создавать таким образом:

.h
Код

class DefClass
{
public:
Constructor();
~Constructor();
};


.cpp
Код

DefClass::Constructor()
{}
DefClass::~Constructor()
{}


А с конструктором, инициализирующим свойства структуры, впервые сталкиваюсь.

Вот, как я написал:
.h
Код

class ConfigRW
{
public:
    struct ConfigResult
    {
      int cSW, cSH;

      ConfigResult(int cSW_,int cSH_) : 
          cSW(cSW_), cSH(cSH_)
      {
      };
    };

    ConfigResult CRW;
public:
    ConfigRW() : CRW(0,0)
    {
    }
public:
    int ReadConfig(char*);
};


.cpp
Код

int ConfigRW::ReadConfig(char* filename)
{
    char RetStr [10];

    ConfigRW myConfig;

    GetPrivateProfileStringA("Dispaly Settings","iScreenWidth",NULL,RetStr,sizeof(RetStr),filename);
    myConfig.CRW.cSW = atoi(RetStr);
    GetPrivateProfileStringA("Dispaly Settings","iScreenHeight",NULL,RetStr,sizeof(RetStr),filename);
    myConfig.CRW.cSH = atoi(RetStr);
    
    return 0;
}


Я ничего не понимаю. Скажите, пожалуйста, как правильно это написать?
P.S. Извините, что надоедаю.
PM MAIL   Вверх
xvr
Дата 3.7.2016, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Ваш код можно отправлять на соревнование 'как сделать простое действие максимально сложным способом'  smile 

Исправьте ReadConfig так:

Код

int ConfigRW::ReadConfig(char* filename)
{
    char RetStr [10];
    GetPrivateProfileStringA("Dispaly Settings","iScreenWidth",NULL,RetStr,sizeof(RetStr),filename);
    CRW.cSW = atoi(RetStr);
    GetPrivateProfileStringA("Dispaly Settings","iScreenHeight",NULL,RetStr,sizeof(RetStr),filename);
    CRW.cSH = atoi(RetStr);
    
    return 0;
}


А еще лучше вообще не вводить ConfigResult -  в вашем воплощении он никакой полезной сущности не представляет.

Код

class ConfigRW
{
public:
      int cSW, cSH;
public:
    ConfigRW() : cSW(0), cSH(0)
    {
    }
public:
    void ReadConfig(char*);
};


Код

void ConfigRW::ReadConfig(char* filename)
{
    char RetStr [10];
    GetPrivateProfileStringA("Dispaly Settings","iScreenWidth",NULL,RetStr,sizeof(RetStr),filename);
    cSW = atoi(RetStr);
    GetPrivateProfileStringA("Dispaly Settings","iScreenHeight",NULL,RetStr,sizeof(RetStr),filename);
    cSH = atoi(RetStr);
}



Это сообщение отредактировал(а) xvr - 3.7.2016, 21:29
PM MAIL   Вверх
BlackSkull
Дата 6.7.2016, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.6.2016

Репутация: нет
Всего: нет



xvr, спасибо за ответ. Сделал так, как Вы сказали. Все равно, приложение считывает не те байты. Возвращает значение -858993460. smile 
Может, с файлом .ini что то не так или с самим проектом?
Ссылка прилагается.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Test.zip 4,97 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.2079 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.