[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Nelz.

    Nelz. Member

    Joined:
    2 Aug 2010
    Messages:
    151
    Likes Received:
    7
    Reputations:
    0
    есть такой код,как сделать месте int чтоб вводилось все double,int,float,string =\

    Code:
    #include <stdio.h>
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
        int x;
        cin >> x ;
        std::cout << x;
        getch();
    			
    }
    
    
     
  2. edge911

    edge911 Active Member

    Joined:
    21 Feb 2009
    Messages:
    105
    Likes Received:
    142
    Reputations:
    15
    хелп плиз..

    msvs 2008
    windows form app

    (в консольном варианте не каких исключений не выдавало!!!! :(((()

    Code:
    ...............
    strcpy(gHost,"google.com");
    
    hostent *hHost = new hostent();  
    
    hHost = gethostbyname(gHost);  
    	
    vkaddr.sin_family = AF_INET; 
    	
    vkaddr.sin_port = htons(80);  
    	CopyMemory(&vkaddr.sin_addr,hHost->h_addr_list[0],hHost->h_length); 	
    .............
    
    строка c функц copymemory выдает исключение

    Code:
    System.NullReferenceException was unhandled   Message="В экземпляре объекта не задана ссылка на объект."   Source="vk_"   StackTrace:        в avtoriz.avt(avtoriz* , massive* , SByte* gHost, SByte* gRequest) в c:\users\администратор\documents\visual studio 2008\projects\vk_\vk_\vk_avtoriz.h:строка 44        в vk_.Form1.button1_Click(Object sender, EventArgs e) в c:\users\администратор\documents\visual studio 2008\projects\vk_\vk_\form1.h:строка 211        в System.Windows.Forms.Control.OnClick(EventArgs e)        в System.Windows.Forms.Button.OnClick(EventArgs e)        в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)        в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)        в System.Windows.Forms.Control.WndProc(Message& m)        в System.Windows.Forms.ButtonBase.WndProc(Message& m)        в System.Windows.Forms.Button.WndProc(Message& m)        в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)        в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)        в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)        в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)        в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)        в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)        в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)        в System.Windows.Forms.Application.Run(Form mainForm)        в main(String[] args) в c:\users\администратор\documents\visual studio 2008\projects\vk_\vk_\vk_.cpp:строка 16   InnerException: 
    чо делать :(
     
    #5942 edge911, 14 Dec 2010
    Last edited: 14 Dec 2010
  3. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    Nelz., может быть, так?
    Code:
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int main()
    {
        char str[100]; // 100 символов
    
        gets(str);
        cout << str;
    
        return 0;
    }
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    cupper
    Берешь и делаешь test2.h таким:

    PHP:
    #ifndef __TEST_2__
    #define __TEST_2__

    #include "test1.h"
    #include <vector>


    class Address;
    class 
    Persone
    {
        
    std::vector<Addressaddress;
    };

    #endif
    И твой пример начинает компилироваться. В таком случае прокатило даже с условием, что используется не указатель на класс, потому что хедер все-таки подключен.

    Кстати, вместо всяких #ifndef используй #pragma once и больше ничего.
     
    #5944 GRRRL Power, 14 Dec 2010
    Last edited: 14 Dec 2010
    1 person likes this.
  5. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    неа. Так вообще не какой разницы. Смотри, в test2.h используется класс из test1.h, предположим что мы подключаем в main.c хедер test2.h тогда в нем от начала файла вначале будет развернут tets1.h (подключенный в test2.h) потом test2.h. Таким образом в test2.h спокойно можно использовать все что есть в test1.h

    Смотри дальше. test1.h сделан абсолютно также как и test2.h. Таким образом если мы в Main.c подключаем вначале test1.h то развертка хедеров выклядет так test2.h test1.h ... в получается в test1.h можно использовать все из test2.h

    думаю ты уже догадался к чему я. Таким образом в зависимости от того какой хедер первым вы подключаем в main.c тот и будет работать. А второй хедер ссылается на первый, но логически он находится ниже него по коду и он о нем не знает, и как жалуется.

    Какая то мрачная картина получается :(

    Единственным выходом из этого дедлока вижу только полное не взаимодействие этих двух классов между собой.
    И добавлении двух новых классов каждый их которых содержит элемент первого класса и список из элементов другого классов.

    Это даже как то лучше с точки зрения инкапсуляции выглядит :)
     
    #5945 cupper, 15 Dec 2010
    Last edited: 15 Dec 2010
  6. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    Ну если ты делаешь new то и delete нужно делать)
     
  7. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    но если ты делаешь new[] то и delete[] нужно делать.
     
  8. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Не вижу проблем добавить объявления используемых классов в каждый файл)
     
  9. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    дык все что я написал выше идет с учетом всего что раньше было предложено
    Code:
    #include "test2.h"
    class Address;
    
    class Persone{... 
    --------------------------------------
    #include "test1.h"
    class Persone;
    
    class Address{... 
    
     
  10. ivankrljov

    ivankrljov New Member

    Joined:
    24 Sep 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Пишу программу-заглушку (проблемы с кодом)

    Доброго времени суток. Пишу программу заглушку, которая создает ЭЦП (на С++Builder6). Проблема такая. Не могу вычислить количество оперативной памяти.
    Вот Весь код (выкладываю с целю примера вычисления c других параметров).
    Code:
    #define NO_WIN32_LEAN_AND_MEAN
    #include <vcl.h>
    #include <shlobj.h>          
    #include <vcl\registry.hpp>     
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TRegistry *RegKey=new TRegistry; //для работы с реестром
        HCRYPTHASH hHash;          //для работы с хеш-обьектом
        HCRYPTPROV hProv;           //криптопровайдер
        HCRYPTKEY hSignKey;               //ключ ЭЦП
        BYTE Sign[MAX_PATH];             //буфер для ЭЦП
        DWORD SigLen=sizeof(Sign);       //длина ЭЦП
    //получение доступа к криптопровайдеру
       if(!CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0))
            if((unsigned)GetLastError()==NTE_BAD_KEYSET)
                    CryptAcquireContext(
                    &hProv,NULL,NULL,
                    PROV_RSA_FULL,
                    CRYPT_NEWKEYSET);
            else throw Exception("Ошибка при инсталяции CryptoAPI!"); 
     
    // создание хеш-объекта и хеширование имени пользователя
    // имя пользователя
        char Buf1[MAX_COMPUTERNAME_LENGTH+1]; 
        int data;
    [b]void GlobalMemoryStatus(LPMEMORYSTATUS  lpBuffer);[/b]
    // длина имени пользователя
        unsigned long Len;
    //создание пустого хеш-объекта
        CryptCreateHash(hProv,CALG_SHA,0,0,&hHash);
    //получение имени пользователя и добавление его в хеш-объект
        Len=sizeof(Buf1);
        if(GetUserName(Buf1,&Len)) CryptHashData(hHash,Buf1,lstrlen(Buf1),0);
    //хеширование ширины экрана монитора
        data=GetSystemMetrics(SM_CXSCREEN);
        if (data) CryptHashData (hHash, (BYTE*) data, sizeof (data), 0);
     /////////////////////////////////// 
    //определение количества оперативной памяти
    [b] typedef struct _MEMORYSTATUS
            {
                    DWORD dwLength;
            }
     MEMORYSTATUS, *LPMEMORYSTATUS;
     MEMORYSTATUS mem;           
     IntToStr(mem.dwLength ) = sizeof(MEMORYSTATUS);
     unsigned int value;            //количество Мб в ОП
    // передача переменной mem для её заполнения информацией об ОП
     GlobalMemoryStatus(&mem);                    // [u]<---------здесь ругается[/u]
     value = mem.dwTotalPhys/1024/1024;    //из байт в Мб[/b]
    //в хеш-объект пока не могу добавить т.к. выше ошибка
    /////////////////////////////////////////////////////////
       CopyFile((GetCurrentDir()+"\\Project1.exe").c_str(), "C:\\temp\\Project1.exe",FALSE);
    RegKey->OpenKey(RegKey->CurrentPath+"\\SOFTWARE\\"+Edit1->Text,true);
    SetCurrentDir("C:\\temp");
        if(!CryptGetUserKey(hProv,AT_SIGNATURE,&hSignKey))
            CryptGenKey(hProv,AT_SIGNATURE,0,&hSignKey);
        CryptSignHash(hHash,AT_SIGNATURE,NULL,0,Sign,&SigLen);
         RegKey->WriteBinaryData("Signature",(void*)Sign,SigLen);
        RegKey->CloseKey();
        CryptDestroyHash(hHash);
    CryptDestroyKey(hSignKey);
    CryptReleaseContext(hProv,0);
    delete RegKey;
    }
    Описание ошибки
    Code:
    E2034 Cannot convert '_MEMORYSTATUS *' to '_MEMORYSTATUS *'
    E2342 Type mismatch in parameter 'lpBuffer' (wanted '_MEMORYSTATUS *', got '_MEMORYSTATUS *')
     
  11. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    наследование и operator<<

    Как при наследовании и использовании виртуальных функций решить проблему дружественных функции, а именно оператор <<

    Тобишь можно ли какнить объявить в базовом классе оператор <<, и в классах наследникак переопределить его что бы можно было правильно юзать примерно следующий код

    Code:
    Base* b = new Derrived(/*какието данные*/);
    cout << b;
    
     
  12. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    закоменитруй это
    typedef struct _MEMORYSTATUS
    {
    DWORD dwLength;
    }
    MEMORYSTATUS, *LPMEMORYSTATUS;



    потому как в файле winbase.h
    есть такая структура
    typedef struct _MEMORYSTATUS {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    SIZE_T dwTotalPhys;
    SIZE_T dwAvailPhys;
    SIZE_T dwTotalPageFile;
    SIZE_T dwAvailPageFile;
    SIZE_T dwTotalVirtual;
    SIZE_T dwAvailVirtual;
    } MEMORYSTATUS, *LPMEMORYSTATUS;


    И ты её какбы локально переопределяешь получается
     
    #5952 rudi, 18 Dec 2010
    Last edited: 18 Dec 2010
  13. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    2cupper
    принимаеш ссылку на базовый класс вторым параметром
    Code:
    ostream& operator<<(ostream &o, sometype &s){
        s.print();
        return o;
    }
    
    print делаеш виртуальной она "знает" как себя выводить
     
    1 person likes this.
  14. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    namespace

    полная лажа с пространствамиимен.

    1-я лажа.
    Я всегда думал (раньше толи не приходилось так делать, толи как то обходилось) что если определяю пространство имен в файле a.h
    Code:
    namespace A_
    {
           class A
           {...};
    }
    
    а затем в файле a.c содержащем реализации методов описанного выше класса, namespace нужно продлевать
    Code:
    namespace A_
    {
          A::A();
    }
    
    два дня я не мог понять с чем связано безумная куча абсолютно мне непонятнызх ошибок, до тез пор пока не решил попробывать в a.c вместо продление наймспейса просто подключить его
    Code:
    using namespace A_;
    {
          A::A();
    }
    
    И главное, пытался чтонибуть нагуглить на эту тему, но так ничего и не нашол :(

    2-я лажа.
    имеються файлы database.h database.c с реализующие класс для работы с БД. Определен namespace DatabaseLayer и в нутри него подключается namespace BussinesObject;

    имеются файлы persone.h persone.c реализующие класс персона. Определен namespace BussinesObject; Подключается database.h

    при сборке database.o компилируется нормально, но когда доходит до сборки persone.o я получаю несколько экранов безумных ошибок типа
    Code:
    database.hpp:46:3: error: ‘string’ in namespace ‘BussinesObject::std’ does not name a type
    ...
     error: ‘move’ is not a member of ‘BussinesObject::std’
    /usr/include/c++/4.5/bits/stl_list.h: In member function ‘void BussinesObject::std::list<_Tp, _Alloc>::splice(BussinesObject::std::list<_Tp, _Alloc>::iterator, BussinesObject::std::list<_Tp, _Alloc>&, BussinesObject::std::list<_Tp, _Alloc>::iterator)’:
    
    
    тобишь по какимто невообразимым для меня причинам в файле database.h директива using namespace BussinesObject приписивается вообще всему что там используется. какойто ахтун в общем :(

    PS. вопросе вмеренно закрыт, т.к. кажется ошибка нашлась.
     
    #5954 cupper, 19 Dec 2010
    Last edited: 20 Dec 2010
  15. ciklop

    ciklop New Member

    Joined:
    16 Dec 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Доброе времени суток уважаемые программеры(и наченающии)
    решил учить С++
    скачал книгу и т.д. но не разобрался с 1 уроком) в книге пишет такое
    #include <iostream.h>

    int main()
    {
    cout << "Hello World!";
    return 0;
    }
    заменил <iostream.h> на <iostream>
    и добавил using namespace std;
    жму на "Начать Отладку"
    появляется черное окно и тут же изчезает что я делаю не ТО ?
     
  16. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    допиши в конце
    Code:
    cin.ignore().get();
    Или же запускай из консоли.
     
  17. ciklop

    ciklop New Member

    Joined:
    16 Dec 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    а что делает етот тег ?
    и его надо во все программы добавить ?
     
  18. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    твоя программа при запуске отрабатывает и закрывается. Для того чтобы она не закрывалась моментально нужно заставить ее ожидать чего либо. Проеще всего ввода от пользователя.
    самый простой вариант, везде рабоающий, ничего не требующий это
    Code:
    char stop;
    cin>>stop;
    в конце функции main.
     
  19. Nickotin

    Nickotin Elder - Старейшина

    Joined:
    15 Feb 2007
    Messages:
    84
    Likes Received:
    20
    Reputations:
    5
    Всем привет.
    Суть задачи заключается в следующем:
    Я вставляю флешку, появляется съемный диск, к примеру Е, заранее известно, что съемный диск будет один.
    Каким образом я могу определить имя съемного диска?
     
  20. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Например, получить список букв логических дисков с помощью GetLogicalDriveStrings, а потом использовать GetDriveType, чтобы определить тип диска
     
Thread Status:
Not open for further replies.