2narsad: Code: int _tmain(int argc, _TCHAR* argv[]) { char str23[] = "Hello World";//<<<<< char *str = &str23[0];//<<<<< printf("%c\n", *str); test(&str); printf("%c\n", *str); system("pause"); return 0; } void test(char **str1 ) { **str1 = 'd'; printf("%c\n", **str1); } P.S первый пример свой, еще раз посмотри ...
edge911, спасибо, так понял, просто так как *str23, уже является указателем на нулевой элемент, то подумал что если еще и указатель на него, а потом уже это в функцию, то это уже получится указатель на указатель на указатель..) спасибо еще раз
Всем привет! Вот решил заранее написать диплом. Тему выбрал "СИСТЕМА ЦИФРОВОЙ ОБРАБОТКИ АУДИОСИГНАЛОВ" (тема интересная и обширная). И так, теории хватает (что такое аудиосигнал, задержки, эффекты, фильтрация и т.д.), но в плане кода что то ничего Кто чем может помочь, кто сталкивался с написанием такого софта? Предпочтительный язык С# или C++, но возможны и другие. Во общем подскажите на чём удобней писать и подтолкните в правильном направлении. Любая критика приветствуется
2return: тема так тема, первая ссылка на готовый диплом (правда Delphi(думаю, что не проблема разобраться)): http://www.google.ru/search?q=диплом СИСТЕМА ЦИФРОВОЙ ОБРАБОТКИ АУДИОСИГНАЛОВ
Это жеж в сторону рядов вроде, фурье, вейвлеты, жуткие вещи) Есть неплохая книжка на эту тему, "Тим Кинтцель, Руководство программиста по работе со звуком", когда то нашел там объяснения многих непонятных вещей.
Lee_fx за книгу спасибо посмотрю. Низкоуровневое программирование звука в Windows нашел интересный материальчик. Если ещё кто то может что то подкинуть, буду благодарен.
Странное поведение указателей Здравствуйте. Не могу прочитать член класса через метод getProcessName() Сам класс. PHP: class CProcess { public: CProcess(); const LPTSTR getProcessName() const; private: LPTSTR mProcessName; }; Вот его методы. PHP: #include "Process\Process.hpp" #include <tchar.h> CProcess::CProcess() { this->mProcessName = 0; } // getter of process' priority const LPTSTR CProcess::getProcessName() const { return this->mProcessName; } // set the process' name void CProcess::setProcessName(LPTSTR processName) { copyString(processName, this->mProcessName); _tprintf(L"%s\n", this->mProcessName); } Тест код. PHP: void test() { CProcess proc; proc.setProcessName(L"System32.exe"); _tprintf(L"String %s\n", proc.getProcessName()); } Он вызывает процедуру copyString() PHP: void copyString(LPTSTR source, LPTSTR dest) { // amount of symbols size_t symbols; StringCchLength(source, STRSAFE_MAX_CCH, &symbols); _tprintf(L"Symbols %i\n", symbols); if (dest != 0) { delete []dest; dest = 0; } _tprintf(L"Source %s\n", source); // number of symbols + plus the terminating null! dest = new TCHAR[symbols*sizeof(TCHAR)+1]; StringCchCopy(dest, symbols+1, source); _tprintf(L"%s\n", dest); } Тест код выдает, что по адресу mProcessname ничего нет. В отладчике смотрю, что процедура copyString() работает. В чем трудность, я не понимаю.
PHP: #include <Windows.h> #include <tchar.h> #include <strsafe.h> #include <string> class CProcess { public: CProcess(); const LPTSTR getProcessName() const; void setProcessName(LPTSTR processName); private: LPTSTR mProcessName; }; CProcess::CProcess() { this->mProcessName = 0; } void copyString(LPTSTR source, LPTSTR& dest) //вот тут я добавил & { // amount of symbols size_t symbols; StringCchLength(source, STRSAFE_MAX_CCH, &symbols); if (dest != 0) { delete []dest; dest = 0; } // number of symbols + plus the terminating null! dest = new TCHAR[symbols*sizeof(TCHAR)+1]; StringCchCopy(dest, symbols+1, source); } const LPTSTR CProcess::getProcessName() const { return this->mProcessName; } void CProcess::setProcessName(LPTSTR processName) { copyString(processName, this->mProcessName); } int main() { CProcess proc; proc.setProcessName(L"System32.exe"); _tprintf(L"String %s\n", proc.getProcessName()); return 0; } А теперь вопрос - зачем столько секса с копированием, памятью? На С++ же пишем: PHP: #include <string> #include <iostream> class CProcess { public: const std::wstring& getProcessName() const { return mProcessName; } void setProcessName(const std::wstring& processName) { mProcessName = processName; } private: std::wstring mProcessName; }; int main() { CProcess proc; proc.setProcessName(L"System32.exe"); std::wcout << L"String " << proc.getProcessName() << std::endl; return 0; } Сравни количество кода и его сложность.
Спасибо. Я так понимаю, там не получилась цепочка из указателей, и адрес не записывался с объект класса. Заточка идет специально под Wn32 API - требует руководство.
Адрес записывался во временную переменную на стеке, которой функция пользовалась. Передав аргумент по ссылке, эту проблему решили. Не понимаю, в чем проблема совмещать stl и WinAPI. stl - просто очень удобная обертка над тем же АПИ, а сроки разработки, сложность и объем кода сильно снизятся.
А зачем это? В php, скрипт может получить пользовательские переменные. Требуется проверить их существование, перед работой с ними (действительно ли пользователь передал переменную?). А в C++ зачем такая функция, если это компилируемый язык и в нем переменные задает сам программист?
eсли тeбe нужно провeрить нe пустa ли пeрeмeннaя(a eсли онa нe пустa - знaчит устaновлeнa) - для тaких типов кaк стринг и вeктор и пр. eсть мeтод empty(). провeряй нa !eмпри и будeт тeбe иссeт. Упд:или я нe вeрно понимaю eго нaзнaчeниe?