[ 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. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    На языке C sizeof является оператором, а не функцией. На C++ думаю тоже. Поэтому sizeof определяет размер не во время работы программы, а при компиляции, это значит если создать стат. поле с размером 128, sizeof вернет 128. Если создать указатель, то sizeof вернеть размер указателя, а не размер данных куда указывает указатель.
    Code:
    #include <stdio.h>
    
    int main(void) {
    
    	char arr[128];
    	char *ptr = arr;
    	
    	printf("Size = %d\n", sizeof arr);
    	printf("Size = %d\n", sizeof ptr);
    }
    В первом случаи получаем 128, во втором 8. Размер в байтах естественно. 8 я получаю, потому что процессор 64бит. На 32битном процессоре получите 4.
     
  2. GRRRL Power

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

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Не потому что процессор 64-битный, а потому что собираешь под архитектуру x86-64.
     
  3. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    Ну да, это точнее сказано. Думал и так будет понятно, что на 64битном такой пример не стану собирать для 32битного)
     
  4. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    К сожалению, моя проблемма не решена.
    Ув. \\ChaOs//, ваш метод решения оказался нерабочим.

    Чтобы наглядно показать суть проблеммы я приведу полный исходный код тестового примера:
    Code:
    #include "stdafx.h"
    
    #include <iostream>
    #include <fstream>
    #include <ctime>
    #include <conio.h>
    #include <cstdlib>
    #include <time.h>
    #include <iomanip>
    #include <cassert>
    #include <io.h>
    #include <math.h>
    #include <time.h>
    
    using namespace std;
    
    
     struct myStruct
     {
     	int number;
    	char name[256];
    	char group[128];
    	time_t birthday;
     };
    
    void scanmyStruct(myStruct &row)
    {
    	tm timeinfo;
    	cout << "*Заполните профиль*\n";
    	cout << "Номер: "; cin >> row.number;
    	cout << "ФИО: "; cin >> row.name; //cin.getline( row.name, sizeof(row.name)/sizeof(row.name[0]) );
    	cout << "Группа: "; cin >> row.group;
    	cout << "Дата рождения\n";
    	cout << "День: "; cin >> timeinfo.tm_mday;
    	cout << "Месяц: "; cin >> timeinfo.tm_mon;
    	cout << "Год: "; cin >> timeinfo.tm_year;
    	
    	row.birthday = mktime(&timeinfo);
    }
    
    void printmyStruct(myStruct row)
    {
    	tm timeinfo;
    	cout << "*Данные профиля*\n";
    	cout << "Номер: " << row.number << endl;
    	cout << "ФИО: " << row.name << endl;
    	cout << "Группа: " << row.group << endl;
    	cout << "Дата рождения в unixtime: " << row.birthday << endl;
    	//timeinfo = *localtime(&row.birthday);
    	//cout << "Дата рождения: " << timeinfo.tm_mday << "." << timeinfo.tm_mon << "." << timeinfo.tm_year + 1900 << endl;
    }
    
    int main(int argc, _TCHAR* argv[])
    {
    	//устанавливаем рускоязычный ввод с клавиатуры
    	setlocale(LC_CTYPE, "rus");
    	
    	myStruct mydata;
    	scanmyStruct(mydata);
    	cout << "\n";
    	printmyStruct(mydata);
    	
    	system("pause");
    	return 0;
    }
     
  5. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8


    Что именно не работает? Не заполняется структура или что?
     
  6. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Code:
    cout << "ФИО: "; [COLOR=Red]cin.ignore();[/COLOR]  cin.getline( row.name, sizeof(row.name)/sizeof(row.name[0]) );
    Вот так должно работать
     
  7. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0

    Откомпилируй и сам увидишь различия того что на входе и что на выходе.

    Кстати, даже если имя писать в одно слово - оно будет корректно только в случае его написания на англ раскладке.
    Что касается структуры timeinfo типа tm - то она вообще непонятно как заполняется.
     
  8. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    Поправил.
    Но твой код проблемы не решил.
    Просто проведи компиляцию, заполни и посмотри что на выходе.
     
  9. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Так бы сразу и сказал, что проблема в кодировке.

    Замени все cout на wcout, все cin на wcin. все char на wchar_t. вместо setlocale() сделай locale::global(locale(".866"));

    UPD

    Еще забыл сказать: поставь везде у строковых констант префикс L, но кроме строк в locale() и system. Они не принимают юникод

    Code:
    wcout << L"Какой-то текст"
     
    #7249 \\ChaOs//, 18 Apr 2012
    Last edited: 18 Apr 2012
    1 person likes this.
  10. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    А попроще никак, например с конвертированием?
    Я конечно понимаю, что мелкософт - это ещё та обитель зла, но не до такой же степени.
    И твой getline почему-то при повторном вызове срезает первый символ след строки.

    Пример кода:
    Code:
    #include "stdafx.h"
    
    #include <iostream>
    #include <fstream>
    #include <ctime>
    #include <conio.h>
    #include <cstdlib>
    #include <time.h>
    #include <iomanip>
    #include <cassert>
    #include <io.h>
    #include <math.h>
    #include <windows.h>
    #include <iostream>
    #include <atlstr.h>
    
    using namespace std;
    
    
     struct myStruct
     {
     	int number;
    	char name[256];
    	char group[128];
     };
    
    void scanmyStruct(myStruct &row)
    {
    	system("cls");
    	cout << "*Заполните профиль*\n";
    	cout << "Номер: "; cin >> row.number;
    	cout << "ФИО: "; cin.ignore(); cin.getline(row.name, 256);
    	cout << "Группа: "; cin.ignore(); cin.getline(row.group, 128);
    }
    
    void printmyStruct(myStruct row)
    {
    	cout << "*Данные профиля*\n";
    	cout << "Номер: " << row.number << endl;
    	cout << "ФИО: " << row.name << endl;
    	cout << "Группа: " << row.group << endl;
    }
    
    int main(int argc, _TCHAR* argv[])
    {
    	//устанавливаем рускоязычный ввод с клавиатуры
    	setlocale(LC_CTYPE, "rus");
    	
    	myStruct my = {0};
    	scanmyStruct(my);
    	cout << "\n";
    	printmyStruct(my);
    	
    	system("pause");
    	return 0;
    }
    
    
     
    #7250 #Smith, 19 Apr 2012
    Last edited: 19 Apr 2012
  11. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Это называется юникодовые потоки ввода\вывода и юникодовые строковые литералы, и они часть стандарта. Открой для себя какую-нибудь умную книжку по с++.
    И это самый "попроще" вариант.

    Это не мой getline, это ты даже не удосужился почитать как он работает, и для чего я перед ним поставил cin.ignore(). А просто бездумно продублировал.
     
  12. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    \\ChaOs//, тебе конечно огромное спасибо.
    Буду дальше думать в решении задачи, но чем больше я узнаю о Visual С++, тем больше мне становится противнее.
     
  13. 1NtR0

    1NtR0 Elder - Старейшина

    Joined:
    14 Apr 2007
    Messages:
    235
    Likes Received:
    89
    Reputations:
    35
    Подскажите плз нужно ли освобождать память от строк (string) и как это делаеться?
    И еще, как память вектора освободить, насколько я знаю vector.clear не делает этого
     
  14. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Знаешь или пробовал? Попробуй типа
    std::vector<T>().swap(vec);
     
    _________________________
    1 person likes this.
  15. KNOT

    KNOT Member

    Joined:
    7 Apr 2010
    Messages:
    107
    Likes Received:
    26
    Reputations:
    3
    помогите плз. где-то напутал с {}
    #include <iostream>

    using namespace std;

    int main()
    {
    int N,i,f;
    cout << "vvedite chislo N\n" << endl;
    cin>>N;
    if(N==0)
    cout << "delitelei net\n"<<endl;
    else
    {
    for(i=1;i<N+1;i++)
    }
    if ((i%2==0)&&(N%i==0))
    f=f+i;
    cout<<" otvet:"<<f;
    return 0;
    }
     
  16. sl1k

    sl1k Member

    Joined:
    31 Jul 2009
    Messages:
    106
    Likes Received:
    26
    Reputations:
    5
    Code:
     for(i=1;i<N+1;i++)
    после фора нет оператора, если так и надо до поставь ;
     
  17. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8

    Чтобы в будущем не "путать с {}" пользуйтесь табуляцией, эту кнопку дали не от нечего делать.
     
  18. ree4

    ree4 New Member

    Joined:
    9 Mar 2011
    Messages:
    28
    Likes Received:
    2
    Reputations:
    0
    а зачем цикл нужен? не проще ли просто написать

    i = N + 1?
     
  19. cipa21

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

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    Code:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int N,f = 0;
    	cout << "vvedite chislo N\n" << endl;
    	cin>>N;
    	if(N==0)
    		cout << "delitelei net\n"<<endl;
    	else
    		for(int i=1;i<N+1;i++)
    			if ((i%2==0)&&(N%i==0))
    			f+=i;
    	cout<<" otvet:"<<f;
    	return 0;
    }
    
     
  20. InfectedM

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

    Joined:
    4 Nov 2007
    Messages:
    155
    Likes Received:
    12
    Reputations:
    0
    Подскажите плиз, возможно ли текнически эмулировать перемещение курсора в текущем приложение,ну или в чужом.
    Не просто эмулировать клик, а эмулировать передвижение мышки по форме.
    Эмулировать(!)а не направлять туда курсор и водить им.


    Грубо говоря, можно ли обмануть сайт , где есть JS реагирующий на передвижения мыши, но что бы все это дело было в фоне, а не двигал мышкой на самом деле))

    Теоретический вопрос
     
Thread Status:
Not open for further replies.