[ 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. #Smith

    #Smith New Member

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

    Привет, знатоки.
    Помогаю писать лабораторку одной особе, но вообщем это не важно.
    Столкнулся с каллапсом.
    Помогите разобраться, в чём прикол и как из этого выйти.
    Сразу хочу сказать, что структуру я буду сохранять в файл, поэтому перейти на динамику мне не предлагайте.
    Забыл сказать, работаю в 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 = "юмористы";
    
    Отказывается присваивать и выдаёт ошибку.
     
    #7221 #Smith, 17 Apr 2012
    Last edited: 17 Apr 2012
  2. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    const char * не записывается в char*.
    Нужно через strcpy
     
    1 person likes this.
  3. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    Code:
    myStruct tmp = {1, "Задорнов Михаил Николаевич", "юмористы" };

    п.с.
    если нужно будет присвоить значение после объявления то пользуйся функции strcpy/strcat
     
    #7223 R0nin, 17 Apr 2012
    Last edited: 17 Apr 2012
    1 person likes this.
  4. Spot

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

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Жуть...

    Что бы не заморачиваться - импользуй string.(если условиями лабы, конечноЮ разрешено)
    Code:
    string text = "Здесь мой текст";
    
    Если уж хочешь использовать непременно char и строка зарание задана, то так:
    Code:
    const char* val;
     val = "Советский цирк творить умеет чудеса";
    
     
    1 person likes this.
  5. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    немного поправил чтобы так же компилировался на 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;
     * }
     */
    
    
     
    #7225 greki_hoy, 17 Apr 2012
    Last edited: 27 Apr 2012
    1 person likes this.
  6. Br_O

    Br_O Banned

    Joined:
    14 Apr 2012
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    пацаны помогите! Как можно создать яндкс чекер? Чтоб на писма чекала потом и на денги! Кто небудь может помочь в создание отблогадарю $$$ В долгу не останусь! Жду ответов!
     
  7. Spot

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

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1

    $$$ = 500$ ? если да - то обращайся.
     
  8. weInc

    weInc New Member

    Joined:
    29 Mar 2012
    Messages:
    40
    Likes Received:
    3
    Reputations:
    0
    Кто нибудь ставил cURL на wxDev C++?

    http://forum.antichat.ru/nextnewesttothread211548.html

    Так пробовал не работало, ошибки были...

    ------------------------------------------------------------------------------
    Стоит вообще winsock изучать если cURL есть?
     
    #7228 weInc, 18 Apr 2012
    Last edited: 18 Apr 2012
  9. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    Стоит. WinSock основа сетевого программирования на Windos, а cURL как не трудно догодаться по названии предназначен только для работы с веб сервером.
     
  10. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    Всем премного благодарен за помощь.
    Поставил плюсы.

    Теперь подскажите мне ещё ответ на такой вопрос:
    А как бы поладней заполнить эту структуру, а ещё попутно заполнить структуру 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);
    }
     
  11. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    По умолчанию cin считает пробелы разделителями.

    Считать целую строку можно так:
    Code:
    //...
    cout << "ФИО: "; cin.getline( row.name, sizeof(row.name)/sizeof(row.name[0]) )
    //...
    
     
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Лол, что это?
     
  13. KNOT

    KNOT Member

    Joined:
    7 Apr 2010
    Messages:
    107
    Likes Received:
    26
    Reputations:
    3
    помогите плз
    #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 строке ошибки
     
  14. GRRRL Power

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

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    А ты в этих строках вместо каких-то стремных кавычек используй обычные двойные.
     
  15. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    По порядку. Размер массива известен до начала компиляции? Известен, значит sizeof(row.name) вернет размер массива в байтах.
    Дальше, стандарт хоть и оговаривает, что размер sizeof(char) всегда 1, но код может быть изменен. Например автор захочет использовать wchar_t, и попросту забудет изменить код, это приведет к ошибкам. Отсюда и вычисление размера одного элемента массива - sizeof(row.name[0]). Деление я думаю пояснять уже не нужно.
     
  16. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Когда мы делаем sizeof(row.name), мы получаем размер указателя на первую ячейку массива, нет?
     
  17. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Лол што?
     
  18. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Нет. Получаем именно размер массива. Это истинно только для массивов, размер которых известен на этапе компиляции.

    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].
     
  19. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Здесь согласен, я всегда опирался на ниже следующее правило.

     
  20. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Тут нужно только учесть, что байт это минимальная единица адресуемой памяти. На некоторых микропроцессорах байт например равен 32 бита. Но sizeof(char) все тот же 1 байт. Только вот в битах 32, а не 8.
     
Thread Status:
Not open for further replies.