На языке 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.
Ну да, это точнее сказано. Думал и так будет понятно, что на 64битном такой пример не стану собирать для 32битного)
К сожалению, моя проблемма не решена. Ув. \\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; }
Code: cout << "ФИО: "; [COLOR=Red]cin.ignore();[/COLOR] cin.getline( row.name, sizeof(row.name)/sizeof(row.name[0]) ); Вот так должно работать
Откомпилируй и сам увидишь различия того что на входе и что на выходе. Кстати, даже если имя писать в одно слово - оно будет корректно только в случае его написания на англ раскладке. Что касается структуры timeinfo типа tm - то она вообще непонятно как заполняется.
Поправил. Но твой код проблемы не решил. Просто проведи компиляцию, заполни и посмотри что на выходе.
Так бы сразу и сказал, что проблема в кодировке. Замени все cout на wcout, все cin на wcin. все char на wchar_t. вместо setlocale() сделай locale::global(locale(".866")); UPD Еще забыл сказать: поставь везде у строковых констант префикс L, но кроме строк в locale() и system. Они не принимают юникод Code: wcout << L"Какой-то текст"
А попроще никак, например с конвертированием? Я конечно понимаю, что мелкософт - это ещё та обитель зла, но не до такой же степени. И твой 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; }
Это называется юникодовые потоки ввода\вывода и юникодовые строковые литералы, и они часть стандарта. Открой для себя какую-нибудь умную книжку по с++. И это самый "попроще" вариант. Это не мой getline, это ты даже не удосужился почитать как он работает, и для чего я перед ним поставил cin.ignore(). А просто бездумно продублировал.
\\ChaOs//, тебе конечно огромное спасибо. Буду дальше думать в решении задачи, но чем больше я узнаю о Visual С++, тем больше мне становится противнее.
Подскажите плз нужно ли освобождать память от строк (string) и как это делаеться? И еще, как память вектора освободить, насколько я знаю vector.clear не делает этого
помогите плз. где-то напутал с {} #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; }
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; }
Подскажите плиз, возможно ли текнически эмулировать перемещение курсора в текущем приложение,ну или в чужом. Не просто эмулировать клик, а эмулировать передвижение мышки по форме. Эмулировать(!)а не направлять туда курсор и водить им. Грубо говоря, можно ли обмануть сайт , где есть JS реагирующий на передвижения мыши, но что бы все это дело было в фоне, а не двигал мышкой на самом деле)) Теоретический вопрос