Привет, знатоки. Помогаю писать лабораторку одной особе, но вообщем это не важно. Столкнулся с каллапсом. Помогите разобраться, в чём прикол и как из этого выйти. Сразу хочу сказать, что структуру я буду сохранять в файл, поэтому перейти на динамику мне не предлагайте. Забыл сказать, работаю в Visual C++ 2008. Здесь всё нормально. Code: char val[128]; val = "Советский цирк творить умеет чудеса"; А вот здесь нет: Code: struct myStruct { int number; char name[256]; char group[128]; }; ... myStruct tmp; tmp.number = 1; tmp.name = "Задорнов Михаил Николаевич"; tmp.group = "юмористы"; Отказывается присваивать и выдаёт ошибку.
Code: myStruct tmp = {1, "Задорнов Михаил Николаевич", "юмористы" }; п.с. если нужно будет присвоить значение после объявления то пользуйся функции strcpy/strcat
Жуть... Что бы не заморачиваться - импользуй string.(если условиями лабы, конечноЮ разрешено) Code: string text = "Здесь мой текст"; Если уж хочешь использовать непременно char и строка зарание задана, то так: Code: const char* val; val = "Советский цирк творить умеет чудеса";
немного поправил чтобы так же компилировался на Dev-C++ и древнем Visual C++ 6.0 еще скомпилировал для x64 кросс компилятором предупреждений нет но бинарик на своей машине не смог проверить для сборки без CRT надо выполнить следующее Code: Configuration Properties \ C/C++ \ Language \ Enable Run-Time Type Info Yes => No (/GR-) пример использования: подключаем заголовки Code: #include <windows.h> #include <stdio.h> #include <tchar.h> #include "SearchFiles.h" как минимум метод DoSmth обязательно надо переопределить для получения файлов Code: struct SearchFiles : ISearchFiles { VOID DoSmth(SearchData& Data) { _tprintf(_T("%s\n"), Data.Fullname); } }; или так если ошибки тоже надо хендлить Code: struct SearchFiles : ISearchFiles { VOID DoSmth(SearchData& Data) { _tprintf(_T("%s\n"), Data.Fullname); } VOID What(ErrorData& Data) { DWORD Error = GetLastError(); if (Error != Data.Success) { _tprintf(_T("ERROR: %s ***Func: %s with code %x***\n"), Data.Path, ERROR_NO_MORE_FILES == Data.Success ? TEXT("FindNextFile") : TEXT("FindFirstFile"), Error); } } }; ну и вызывать так Code: int main() { SearchFiles e; e.Search(TEXT("c:"), TEXT("*.txt")); e.Search(TEXT("c:\\windows"), TEXT("*.exe"), TRUE, FILE_ATTRIBUTE_HIDDEN); e.Search(TEXT("c:"), _T("*.*"), FALSE); return 0; } вот полный пример Code: #include <windows.h> #include <stdio.h> #include <tchar.h> #include "SearchFiles.h" struct SearchFiles : ISearchFiles { VOID DoSmth(SearchData& Data) { _tprintf(_T("%s\n"), Data.Fullname); } VOID What(ErrorData& Data) { DWORD Error = GetLastError(); if (Error != Data.Success) { _tprintf(_T("ERROR: %s ***Func: %s with code %x***\n"), Data.Path, ERROR_NO_MORE_FILES == Data.Success ? TEXT("FindNextFile") : TEXT("FindFirstFile"), Error); } } }; int main() { SearchFiles e; e.Search(TEXT("c:"), TEXT("*.txt")); e.Search(TEXT("c:\\windows"), TEXT("*.exe"), TRUE, FILE_ATTRIBUTE_HIDDEN); e.Search(TEXT("c:"), _T("*.*"), FALSE); return 0; } файл с реализацией Code: /* * FILE: SearchFiles.h * PURPOSE: recursive scan directory * PROGRAMMERS: greki_hoy (http://forum.antichat.ru/member.php?u=116830) */ #pragma once #include <windows.h> #ifndef _countof # define _countof(array) (sizeof(array) / sizeof(*array)) #endif #ifdef _MSC_VER # define DECLSPEC_NOVTABLE __declspec(novtable) #else # define DECLSPEC_NOVTABLE #endif struct DECLSPEC_NOVTABLE ISearchFiles { enum {FILE_ATTRIBUTE_ALL}; VOID Search(LPCTSTR Path, LPCTSTR Extension, BOOL bInnerFolders = TRUE, DWORD FileAttributes = FILE_ATTRIBUTE_ALL) { bDone = FALSE; lstrcpyn(Buf, Path, _countof(Buf) - _countof("\\*.*")); DoSearch(Buf, Extension, bInnerFolders, FileAttributes); } VOID Stop() { bDone = TRUE; } protected: struct SearchData { LPWIN32_FIND_DATA Struct; LPCTSTR Fullname; }; struct ErrorData { DWORD Success; LPCTSTR Path; }; virtual VOID DoSmth(SearchData& Data) = 0; virtual VOID What(ErrorData& Data) { UNREFERENCED_PARAMETER(Data); } private: volatile BOOL bDone; TCHAR Buf[MAX_PATH * 2]; VOID DoSearch(LPTSTR Path, LPCTSTR Extension, BOOL bInnerFolders, DWORD FileAttributes) { HANDLE hSearch; WIN32_FIND_DATA FindData; if (bDone) return; PTSTR Break = Path + lstrlen(Path); lstrcat(Break, TEXT("\\*.*")); ++Break; // сначало поиск внутри вложенных папках ... if (bInnerFolders) { // если папки существуют, то делаем поиск hSearch = FindFirstFile(Path, &FindData); if (INVALID_HANDLE_VALUE != hSearch) { do { if (bDone) { FindClose(hSearch); return; } // в каждой папке есть две папки с именами "." и ".." // и эти папки мы не трогаем if ('.' == *FindData.cFileName) continue; if (FILE_ATTRIBUTE_DIRECTORY & FindData.dwFileAttributes) { lstrcpy(Break, FindData.cFileName); DoSearch(Path, Extension, bInnerFolders, FileAttributes); } } while (FindNextFile(hSearch, &FindData)); lstrcpy(Break, TEXT("*.*")); ErrorData Data = { ERROR_NO_MORE_FILES, Path }; What(Data); FindClose(hSearch); } else { ErrorData Data = { ERROR_FILE_NOT_FOUND, Path }; What(Data); return; } } if (bDone) return; lstrcpyn(Break, Extension, _countof(Buf) - (Break - Path)); hSearch = FindFirstFile(Path, &FindData); if (INVALID_HANDLE_VALUE != hSearch) { do { if (bDone) { FindClose(hSearch); return; } if (!(FILE_ATTRIBUTE_DIRECTORY & FindData.dwFileAttributes)) { lstrcpy(Break, FindData.cFileName); if (FILE_ATTRIBUTE_ALL != FileAttributes) { if (FileAttributes & FindData.dwFileAttributes) { SearchData Data = { &FindData, Path }; DoSmth(Data); } } else { SearchData Data = { &FindData, Path }; DoSmth(Data); } } } while (FindNextFile(hSearch, &FindData)); lstrcpy(Break, Extension); ErrorData Data = { ERROR_NO_MORE_FILES, Path }; What(Data); FindClose(hSearch); } else { ErrorData Data = { ERROR_FILE_NOT_FOUND, Path }; What(Data); } } }; /* * #include <windows.h> * #include <stdio.h> * #include <tchar.h> * #include "SearchFiles.h" * * struct SearchFiles : ISearchFiles * { * VOID DoSmth(SearchData& Data) * { * _tprintf(_T("%s\n"), Data.Fullname); * } * * VOID What(ErrorData& Data) * { * DWORD Error = GetLastError(); * * if (Error != Data.Success) * { * _tprintf(_T("ERROR: %s ***Func: %s with code %x***\n"), Data.Path, * ERROR_NO_MORE_FILES == Data.Success ? TEXT("FindNextFile") : * TEXT("FindFirstFile"), Error); * } * } * }; * * int main() * { * SearchFiles e; * e.Search(TEXT("c:"), TEXT("*.txt")); * e.Search(TEXT("c:\\windows"), TEXT("*.exe"), TRUE, FILE_ATTRIBUTE_HIDDEN); * e.Search(TEXT("c:"), _T("*.*"), FALSE); * return 0; * } */
пацаны помогите! Как можно создать яндкс чекер? Чтоб на писма чекала потом и на денги! Кто небудь может помочь в создание отблогадарю $$$ В долгу не останусь! Жду ответов!
Кто нибудь ставил cURL на wxDev C++? http://forum.antichat.ru/nextnewesttothread211548.html Так пробовал не работало, ошибки были... ------------------------------------------------------------------------------ Стоит вообще winsock изучать если cURL есть?
Стоит. WinSock основа сетевого программирования на Windos, а cURL как не трудно догодаться по названии предназначен только для работы с веб сервером.
Всем премного благодарен за помощь. Поставил плюсы. Теперь подскажите мне ещё ответ на такой вопрос: А как бы поладней заполнить эту структуру, а ещё попутно заполнить структуру tm? Приведённый мной код работает не совсем корректно. Code: struct myStruct { int number; char name[256]; char group[128]; time_t birthday; }; ... void scanmyStruct(myStruct &row) { tm timeinfo; cout << "*Заполните профиль*"; cout << "Номер: "; cin >> row.number; cout << "ФИО: "; cin >> row.name; 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); }
По умолчанию cin считает пробелы разделителями. Считать целую строку можно так: Code: //... cout << "ФИО: "; cin.getline( row.name, sizeof(row.name)/sizeof(row.name[0]) ) //...
помогите плз #include <iostream> using namespace std; int main() { int n,x,r; char* s; cout << "vvedite chislo n\n" << endl; cin>>n; x=n / 10; r=n % 10; if ((n==1) || (x>1) && (r==1)) s=”god”; else { if ((n>1) && (n<5) || ((x>1) && (x<5) && (r>1) && (r<5))) s=”goda”; }; if (r>=5) s=”let”; cout<<”mne ”<<n<<” “<<s; return 0; } выдает в 14,18,21,22 строке ошибки
По порядку. Размер массива известен до начала компиляции? Известен, значит sizeof(row.name) вернет размер массива в байтах. Дальше, стандарт хоть и оговаривает, что размер sizeof(char) всегда 1, но код может быть изменен. Например автор захочет использовать wchar_t, и попросту забудет изменить код, это приведет к ошибкам. Отсюда и вычисление размера одного элемента массива - sizeof(row.name[0]). Деление я думаю пояснять уже не нужно.
Нет. Получаем именно размер массива. Это истинно только для массивов, размер которых известен на этапе компиляции. Code: void main() { char[256] buf; std::cout << sizeof(buf); } tim-oleksii, ты откуда такой умный взялся? Из стандарта: Code: When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) [B]the result is 1[/B].
Тут нужно только учесть, что байт это минимальная единица адресуемой памяти. На некоторых микропроцессорах байт например равен 32 бита. Но sizeof(char) все тот же 1 байт. Только вот в битах 32, а не 8.