Форум программистов, компьютерный форум CyberForum.ru

Переменная не инициализирована - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
smothdrive
6 / 0 / 1
Регистрация: 29.12.2011
Сообщений: 9
26.06.2012, 17:43     Переменная не инициализирована #1
Всем привет решил написать простенький класс.Вот обьявление:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include <iostream>
#include <windows.h>
using namespace std;
#define UNLEN 256
class Name{
public:
    Name();
    ~Name();
    SYSTEMTIME GetuserTime(){return time;}
    wstring  * GetuserName(){return compname;}
    wstring * GetuserComputerName(){return name;}
private:
    wstring* name;
    wstring* compname;
    SYSTEMTIME time;
 
};
вот определеение
C++
1
2
3
4
5
6
7
8
9
10
Name::Name(){
    name[UNLEN+1];
    DWORD size = sizeof(name);
GetUserName((LPWSTR)name,&size);
compname[MAX_COMPUTERNAME_LENGTH+1];
    DWORD sizecomp=sizeof(compname);
    GetComputerName((LPWSTR)compname,&sizecomp);
    GetSystemTime(&time);
}
Name::~Name(){}
А вот сама прога использующая этот класс
C++
1
2
3
4
5
6
7
int _tmain(int argc, _TCHAR* argv[])
{
    Name * i =new Name;
    wstring * ifd = i->GetuserName();
    MessageBox(0,(LPWSTR)ifd,L"blabla",MB_OK);
    return 0;
}
Пишет что переменная не инициализирована.Пробую использовать new пишет в дебаге наршение прав доступа.А в релизе просто вылетает.Скажите что у меня может быть не правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 17:43     Переменная не инициализирована
Посмотрите здесь:

C++ переменная
C++ строковая переменная
C++ Переменная
C++ Идентификатор и Переменная
C++ Переменная в TextBox
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
edward_jonson
 Аватар для edward_jonson
157 / 157 / 25
Регистрация: 23.02.2011
Сообщений: 388
26.06.2012, 18:16     Переменная не инициализирована #2
Не совсем по сути вопроса, но:
C++
1
2
    wstring  * GetuserName(){return compname;}
    wstring * GetuserComputerName(){return name;}
Здесь вы перепутали возвращаемые значения, я так думаю что должно быть
C++
1
2
    wstring  * GetuserName(){return name;}
    wstring * GetuserComputerName(){return compname;}
smothdrive
6 / 0 / 1
Регистрация: 29.12.2011
Сообщений: 9
26.06.2012, 20:17  [ТС]     Переменная не инициализирована #3
Знаю.Уже исправил.

Добавлено через 34 минуты
Не ужели не кто не поможет.

Добавлено через 1 час 20 минут
ну помогите а то расплачусь
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 00:13     Переменная не инициализирована #4
smothdrive, да память под name и compname ты неверно выделял да ещё и с new накосил. Вот работоспособный код на сонове твоей логики построения класса (я убрал из него юникод, т.к. смысла вообще в нём не вижу)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <string>
#include <iostream>
#include <windows.h>
using namespace std;
 
#define UNLEN 256
class Name
{
public:
    Name();
    ~Name();
    SYSTEMTIME GetuserTime(){return time;}
    char * GetuserName()    {return name;}
    char * GetuserComputerName(){return compname;}
private:
    char name    [UNLEN];
    char compname[UNLEN];
    SYSTEMTIME time;
};
 
Name::Name()
{
    DWORD size = sizeof(name);
    GetUserName(name,&size);
    DWORD sizecomp=sizeof(compname);
    GetComputerName(compname,&sizecomp);
    GetSystemTime(&time);
}
 
Name::~Name()
{
 
}
 
int main()
{
    Name * ptr =new Name();
    MessageBox(NULL,ptr->GetuserName(),"Caption",MB_OK);
    return 0;
}
Миниатюры
Переменная не инициализирована  
Вложения
Тип файла: rar smothdrive1.exe.rar (18.9 Кб, 2 просмотров)
Тип файла: rar smothdrive1_project.rar (24.5 Кб, 2 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 00:29     Переменная не инициализирована #5
Что же касается меня, то я бы построил класс таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <windows.h>
#include <lmcons.h>//UNLEN is defined in Lmcons.h.
using namespace std;
 
class Name
{
public:
    Name();
    ~Name();
    SYSTEMTIME GetuserTime();
    char * GetuserName();
    char * GetuserComputerName();
private:
    char *name    ;
    char *compname;
    SYSTEMTIME ptime;
};
 
Name::Name()
{
    name     = new char[UNLEN];
    compname = new char[UNLEN];
    ZeroMemory(&ptime,sizeof(SYSTEMTIME));
}
 
Name::~Name()
{
    if(name)
        delete [] name;
    if(compname)
        delete [] compname;
}
 
SYSTEMTIME Name::GetuserTime()
{
    GetLocalTime(&ptime);
    return ptime;
}
 
char * Name::GetuserName()
{
    DWORD size = UNLEN;
    GetUserName(name,&size);
    return name;
}
 
char * Name::GetuserComputerName()
{
    DWORD size = UNLEN;
    GetComputerName(compname,&size);
    return name;
}
 
int main()
{
    Name * ptr =new Name();
    MessageBox(NULL,ptr->GetuserName(),"INFO",MB_OK);
    MessageBox(NULL,ptr->GetuserComputerName(),"INFO",MB_OK);
    return 0;
}
Вложения
Тип файла: rar smothdrive2.exe.rar (21.5 Кб, 3 просмотров)
Тип файла: rar smothdrive2_project.rar (4.9 Кб, 3 просмотров)
smothdrive
6 / 0 / 1
Регистрация: 29.12.2011
Сообщений: 9
27.06.2012, 20:50  [ТС]     Переменная не инициализирована #6
Спасибо большое все заработало.Но есть одна маленькая проблема.Я ниписал программу которая записывает данные класса в файл.Время системное выводит нормально но вот имя пользователя и компа нет(какие то каракули).вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int _tmain(int argc, _TCHAR* argv[])
{
    char filename[80];
    char close[82];
    cout<<"Enter File name: ";
    cin >> filename;
   ifstream fin(filename,ios::binary);
    Name file;
   fin.read((char*)&file,sizeof file);
   cout<<"\n User name is:"<<file.GetuserName();
   cout<<"\n User Computer name is:"<<file.GetuserComputerName();
   SYSTEMTIME time =file.GetuserTime();
   cout<<"\n User Year is: "<<time.wYear<<" User Month is: "<<time.wMonth<<" User DayOfWeek is: "<<time.wDayOfWeek<<" User Day is: "<<time.wDay<<" User Hour is: "<<time.wHour<<" User Minute is: "<<time.wMinute<< "User Second is: "<<time.wSecond<<" User Millisecond is: "<<time.wMilliseconds;
   cin >> close;
    return 0;
}
Добавлено через 1 час 59 минут
Опять все кинули меня?
-=ЮрА=-
Заблокирован
Автор FAQ
28.06.2012, 09:24     Переменная не инициализирована #7
Цитата Сообщение от smothdrive Посмотреть сообщение
Опять все кинули меня?
- никто тебя не кидал, к примеру у людей могут быть свои дела и заботы, более важные чем писанина кода. По поводу каракулей скажу - они от того что русские символы без специальных методов преобразования некорректно будут отображаться что в контексте консоли, что в контексте файла
Вариантов множество, но я предлагаю наиболее простой - использовать setlocale
Код класса абсолютно не требует никаких изменений, а вот код main я немножко преобразовал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    Name * ptr =new Name();
    setlocale(LC_ALL,"RUS");
    ofstream ofs("info.txt");
    ofs<<"UserName     : "<<ptr->GetuserName()<<endl;
    ofs<<"ComputerName : "<<ptr->GetuserComputerName()<<endl;
    ofs.close();
    cout<<"UserName     : "<<ptr->GetuserName()<<endl;
    cout<<"ComputerName : "<<ptr->GetuserComputerName()<<endl;
    system("pause");
    return 0;
}
Вложения
Тип файла: rar smothdriveRUS.exe.rar (52.5 Кб, 4 просмотров)
Тип файла: rar smothdriveRUS_project.rar (3.7 Кб, 2 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
28.06.2012, 09:30     Переменная не инициализирована #8
После отработки алгоритма в каталоге с экзешником (а если отлаживаем то в каталоге проекта появиться файл info.txt с полученной инфой). Отработка приложения на скрине (имя своего компьютера я стёр, так что вместо белых полей идут конкретные имя пользователя и компьютера)
Миниатюры
Переменная не инициализирована  
smothdrive
6 / 0 / 1
Регистрация: 29.12.2011
Сообщений: 9
28.06.2012, 16:54  [ТС]     Переменная не инициализирована #9
Вот доработаная версия моей проги.Русские буквы так и не отображает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    char filename[80];
    char close[82];
    setlocale(LC_ALL,"RUS");
    cout<<"Enter File name: ";
    cin >> filename;
   ifstream fin(filename,ios::binary);
    Name file;
   fin.read((char*)&file,sizeof file);
   cout<<"\n User name is:"<<file.GetuserName();
   cout<<"\n User Computer name is:"<<file.GetuserComputerName();
   SYSTEMTIME time =file.GetuserTime();
   cout<<"\n User Year is: "<<time.wYear<<" User Month is: "<<time.wMonth<<" User DayOfWeek is: "<<time.wDayOfWeek<<" User Day is: "<<time.wDay<<" User Hour is: "<<time.wHour<<" User Minute is: "<<time.wMinute<< "User Second is: "<<time.wSecond<<" User Millisecond is: "<<time.wMilliseconds;
   cin >> close;
-=ЮрА=-
Заблокирован
Автор FAQ
28.06.2012, 22:02     Переменная не инициализирована #10
smothdrive, прошу тебя перестань ты делать всё по своему!
Цитата Сообщение от smothdrive Посмотреть сообщение
ifstream fin(filename,ios::binary);
- прости за некую грубость, НО НА КОЙ ЧЁРТ ТЫ УПОРНО СТАВИШЬ ПОТОК ЧТЕНИЯ ifstream???!!!!!
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ofstream ofs
, в файл пишут ofstream-ом а ifstream читают, как можно данные читать из файла, если логика твоей программы получить инфу и записать её в файл.
Цитата Сообщение от smothdrive Посмотреть сообщение
fin.read((char*)&file,sizeof file);
- объясни мне пожалуйста, чё это за хренотень написана???Ты privat поля класса считать хочешь, парень, думаешь головой что делаешь???Структуру ещё можно так считать, но для этого она хотябы в теле класса должна быть и не приват переменной. Рекомендую для этого в классе сделать реализовать отдельный метод.
Далее
Цитата Сообщение от smothdrive Посмотреть сообщение
Русские буквы так и не отображает.
, версия того в чём ты пишешь, что это DevC, 6-ая студия?Я подавал код для 9-й версии, причём проект надо открывать не через срр а через sln файл(если открывал срр и делал построение из существующего кода то гробил настройки проекта
Вобщем друг не расстаривай меня, вначале всё у тебя было гуд, я лишь только подталкивал, но сейчас когда уже подал код пишуший в файл инфу, на кой чёрт вот это делал
Цитата Сообщение от smothdrive Посмотреть сообщение
fin.read((char*)&file,sizeof file);
, жду от тебя переосмысления, возможно вопросов, а также чёткого указания компилятора на котором всё пытаешся реализовать.
НЕ злись на меня а пиши конкретно зачем ввёл чтение из файла и вообще
smothdrive
6 / 0 / 1
Регистрация: 29.12.2011
Сообщений: 9
01.07.2012, 20:13  [ТС]     Переменная не инициализирована #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
smothdrive, прошу тебя перестань ты делать всё по своему!
- прости за некую грубость, НО НА КОЙ ЧЁРТ ТЫ УПОРНО СТАВИШЬ ПОТОК ЧТЕНИЯ ifstream???!!!!!, в файл пишут ofstream-ом а ifstream читают, как можно данные читать из файла, если логика твоей программы получить инфу и записать её в файл.
- объясни мне пожалуйста, чё это за хренотень написана???Ты privat поля класса считать хочешь, парень, думаешь головой что делаешь???Структуру ещё можно так считать, но для этого она хотябы в теле класса должна быть и не приват переменной. Рекомендую для этого в классе сделать реализовать отдельный метод.
Далее , версия того в чём ты пишешь, что это DevC, 6-ая студия?Я подавал код для 9-й версии, причём проект надо открывать не через срр а через sln файл(если открывал срр и делал построение из существующего кода то гробил настройки проекта
Вобщем друг не расстаривай меня, вначале всё у тебя было гуд, я лишь только подталкивал, но сейчас когда уже подал код пишуший в файл инфу, на кой чёрт вот это делал
, жду от тебя переосмысления, возможно вопросов, а также чёткого указания компилятора на котором всё пытаешся реализовать.
НЕ злись на меня а пиши конкретно зачем ввёл чтение из файла и вообще
Мне нужно чтение из бинарного файла.У меня уже есть прога для записи в фаил там проблемм нет.Приват переменную я получаю функцией.У меня 10 студия(2010)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 21:09     Переменная не инициализирована
Еще ссылки по теме:

C++ Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
Условие того, что переменная не инициализирована C++
Переменная не инициализирована C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
smothdrive
6 / 0 / 1
Регистрация: 29.12.2011
Сообщений: 9
02.07.2012, 21:09  [ТС]     Переменная не инициализирована #12
алё люди
Yandex
Объявления
02.07.2012, 21:09     Переменная не инициализирована
Ответ Создать тему
Опции темы

Текущее время: 21:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru