(Часть 1) (*Закрыта*)Я начинающий, подскажите пожалуйста, как...
Если вы только начинаете осваивать среду разработки ВСВ - предлагаю возникающие вопросы размещать в данной теме. Не создавайте пожалуста отдельные темы - типа "Как мне запустить свое приложение на другом компьютере", "Как перевести String в char*" и тому подобное. Такие темы будут закрываться с отсылку в эту. Не обижайтесь.
Кроме того, не брезгуйте плиз, пользоваться поиском хотя бы, по нескольким критериям. Иногда бывает так, вопрос который возник у вас не столь оригинален - вполне возможно, кто то уже спрашивал его до вас :) Поверьте, отвечать на одни и теже вопросы тоже не всегда интересно.
Если вы задаете свой вопрос на форуме - что бы получить наиболее эффективный ответ - следуйте пожалуйста несложным правилам. Они просты:
0. Опишите чего вы хотели добиться.
1. Опишите ошибку которая у вас возникла, по возможности с текстом самой ошибки.
2. Если вы считаете это необходимым - приведите фрагмент(пожалуста не помещайте в свой вопрос весь листинг) кода, на который жалуется компилятор, коротко описав переменные которые используются, и как они инициализируются. Исходники высылайте или выкладывайте только в том случае, если вас об этом просят.
3. Если проблема связана с функцией какой либо библиотеки - не стесняйтесь залезть в хелп и найти там ее описание. То чтовы не рубите в английском, зато читаете Рабле в оригинале - отнюдь не оправдание. Людей для которых английский - родной, здесь немного. Пользуйтесь словарем, это дает результаты :)
4. Не забывайте - может быть ВСВ и имеет раширения по сравнению со стандартом - но тем не менее это С++. Не забывайте проверить, что в ваш проект подключены все необходимые заголовочные файлы, а так же файлы библиотек.
5. Если вы задали вопрос один раз - не нужно его повторять или дублировать, или размещать посты типа "Ну что никто не знает" и т.д. Вы рискуете узнать много разных путей, но так и не получить нужный вам ответ.
6. Форум - дело сугубо добровольное. Здесь ни кто НЕ ОБЯЗАН искать ответы на ваши вопросы. Если вам отвечают - то это только исключительно из любви к вам. :)
7. Исходя из выше сказанного, если вам не отвечают - ну возможно вас не любят :)
8. Для тех, кому нужно написать курсовую, программу, решить контрольную или тому подобное - существует раздел форума Студентам
Размещайте, плиз, свои посты там. Сообщения размещенные в данной теме - не будут перемещаться - они будут удаляться.
9. Если вы хотите пообщаться, обсудить тему, не связанную с ВСВ - милости просим: В "Отдохнем". Флуд в данном разделе не приветствуется.
Ну вроде все. Если что забыл - или не так - поправьте.
Удачи.
Однако когда я пишу такое
Application->Initialize();
//....
Application->Run();
}
catch (AnsiString &exception){
// мои действия
}
то мне выдается окошко External exception.
(Если же писать подобный try catch в каждой функции, то всё ок)
Как такое победить?
------------
У меня одно число постоянно меняется,
нужно сделать так, чтобы, когда это число совпадёт с числом, которое написано в Edit'е появился Message.
Этот вопрос наверное самый дебильный, который я когда-либо писал, но он не даёт мне доделать программу.
------------
У меня одно число постоянно меняется,
нужно сделать так, чтобы, когда это число совпадёт с числом, которое написано в Edit'е появился Message.
Ну так в тот момент, когда оно меняется сравнивай с числом в Edit'е - если числа равны - выводи сообщение. Неужели быстрее написать, чем подумать?
Я хочу отлавливать эксепшены в одном месте, наивно предполагал, что для этого предназначена конструкция try catch в функции WinMain
Однако когда я пишу такое
Application->Initialize();
//....
Application->Run();
}
catch (AnsiString &exception){
// мои действия
}
то мне выдается окошко External exception.
(Если же писать подобный try catch в каждой функции, то всё ок)
Как такое победить?
Прочесть о обработке исключений, прежде чем садится "программировать". Тогда наивных предположений будет меньше.
Ну так в тот момент, когда оно меняется сравнивай с числом в Edit'е - если числа равны - выводи сообщение. Неужели быстрее написать, чем подумать?
Возможно, я не совсем правильно выразился я хотел сказать следующее:
Я не могу сравнить Caption Label'а с Text'ом в Edit'е.
В Edit'е написано число, а в Label'е оно постоянно меняется. Мне нужно при совпадении этих цифр, что бы появлялся Message(я знаю как прицепить Message). Я незнаю как их сравнить, нужен приблезительный код.(Я делаю напоминатель)
Вот вродебы объяснил всё нормально...
Возможно, я не совсем правильно выразился я хотел сказать следующее:
Я не могу сравнить Caption Label'а с Text'ом в Edit'е.
Что мешает? Религиозные убеждения? Так вроде ни в одной из религиий мира не запрещается сравнивать две строки? :)
В Edit'е написано число, а в Label'е оно постоянно меняется. Мне нужно при совпадении этих цифр, что бы появлялся Message(я знаю как прицепить Message). Я незнаю как их сравнить, нужен приблезительный код.(Я делаю напоминатель)
Представляю себе - о чем будет напоминать это чудо. Надо было начинать сразу с ОС. Чего мелочится с напоминателями.
Label1-Caption = IntToStr(Var);
try{
if(StrToInt(Edit1->Text)==Var){
ShowMessage("Ogo-go-go!");
}
else
....
}
catch(...){
ShowMessage("Введено не число. Фтопку!");
Edit1->Text = 0;
}
или второй вариант:
ShowMessage("Ogo-go-go!");
}
else ShowMessage("Nifiga!");
Прочесть о обработке исключений, прежде чем садится "программировать". Тогда наивных предположений будет меньше.
Эта тема специально создана для реализации ваших нераскрытых амбиций, господин "модератор"?
Переформулирую вопрос - почему порожденное исключение не ловится в winmain, если вопрос слишком сложный, чтобы ответить на него без ёрничания, то прошу вас воздержаться от флуда
И ещё более конкретнее - есть ли возможность централизованно ловить исключения от обработчиков контролов формы (не импользуя TApplicationEvents).
Переформулирую вопрос - почему порожденное исключение не ловится в winmain, если вопрос слишком сложный, чтобы ответить на него без ёрничания, то прошу вас воздержаться от флуда
Да ловится оно в winmain. Ловится. Просто не нужно учится программировать по форуму. И хоть немного думать (желательно головой), перед тем как задать вопрос. Если вы не обработаете исключение в месте его возникновения, то за вас это попытается сделать ОС, попытается завершить процесс и передаст(вероятно, если не обработает сама) управление ветке обработки исключений в момент завершения программы. Что бы этого не произошло - необходимо обрабатывать исключения там где они возникают. Если нужно делать это централизовано - нет проблем - пишется свой класс обработки исключений или функция в глобальной области видимости. Эти вопросы хорошо рассматриваются Рихтером, да и любая мало мальски серьезная литература по системному программированию как минимум одну главу посвящает SEH. Но ламерам читать некогда, у них масса проектов и дел, им нужно внимание и ответы на вопросы, возникающие у них в том месте на котором нормальные люди сидят.. ...
Звени без ерничанья не получилось. :) ;):D
Но ламерам читать некогда, у них масса проектов и дел, им нужно внимание и ответы на вопросы, возникающие у них в том месте на котором нормальные люди сидят.. ...
Звени без ерничанья не получилось. :) ;):D
За внимание оно конечно спасибо, но хочу заметить, раз назвался модератором ветки "Вопросы из того места, где сидят" (кстати, почему бы не переименовать :), то не стоит ждать здесь вопросов о клинчах и семафорах, имхо.
За внимание оно конечно спасибо, но хочу заметить, раз назвался модератором ветки "Вопросы из того места, где сидят" (кстати, почему бы не переименовать :), то не стоит ждать здесь вопросов о клинчах и семафорах, имхо.
Ладно, не бери в голову. :) Если погорячился - извини. Но мой первый совет - прежде чем создать пост, хотябы попытаться разобраться самому - остается в силе.
прежде чем создать пост, хотябы попытаться разобраться самому
Признаю, уже стыдно, ларчик то просто открывается.. Время создания моего поста шибко позднее, надо popup на форуме добавить "подумайте и заходите утром". Спасибо и можно мой флуд удалить
8) 8)
Как создать программу на Borland C++, которая может изменять байты в PE-файлах?
Желательно исходник, статью, сайт, где это описано-короче говоря всё что может хоть как-то помочь.
Извените, что я опять со своим сверх глупыми вопросами, но мож кто поможет:
Как создать программу на Borland C++, которая может изменять байты в PE-файлах?
Желательно исходник, статью, сайт, где это описано-короче говоря всё что может хоть как-то помочь.
...
ofstream file("my.exe",ios::binary|ios::app);
file.seekp(0);
file.seekp(pos);
char *buff[3] ={0x22,0x23,0x24};
file.write(buff,sizeof(buff));
file.close();
{
__published:
__fastcall void OnClick(TObject *Sender){ Application->MessageBox("!!!", "!!!", MB_OK); };
};
В данном коде должно появляться MessageBox() при двойном клике. Заменил в TForm1 TGroupBox на THGroupBox. При попытке сохранить исходный файл, или скомпилировать программу, выдается ошибка, что у меня неправильно объявлены типы. После отказа от замены на "правильные" программа запускается, но "не отрабатывает" событие?
Где здесь ошибка? И как надо правильно? Спасибо.
Мне необходимо в TGroupBox добавить некоторые свойства (например, смена цвета названия при двойном клике мышкой). Для этого создал класс-наследник:
{
__published:
__fastcall void OnClick(TObject *Sender){ Application->MessageBox("!!!", "!!!", MB_OK); };
};
В данном коде должно появляться MessageBox() при двойном клике. Заменил в TForm1 TGroupBox на THGroupBox. При попытке сохранить исходный файл, или скомпилировать программу, выдается ошибка, что у меня неправильно объявлены типы. После отказа от замены на "правильные" программа запускается, но "не отрабатывает" событие?
Где здесь ошибка? И как надо правильно? Спасибо.
Приведи пожалуйста сообщение об ошибке в оригинале. Объявление переопеределенных методов выглядит так:
{
protected:
TNotifyEvent FOnClick;
void __fastcall Click(void){ Application->MessageBox("!!!", "!!!", MB_OK);
if(FOnClick)
FOnClick(this);
}
__published:
__property TNotifyEvent OnClick{read=Click,write=Click};
Приблизительно так. Только функцию Сlick лучше вынести в .cpp файл естествено.
char recvbuf[500] = "";
после коннекта к серверу она забивается инфой о сервисе
как еще очистить(без цикла)???
если просто сделать
recvbuf[500] = "";
то компилер ругается
[C++ Error] Unit1.cpp(95): E2034 Cannot convert 'char *' to 'char'
есть
char recvbuf[500] = "";
после коннекта к серверу она забивается инфой о сервисе
как еще очистить(без цикла)???
если просто сделать
recvbuf[500] = "";
то компилер ругается
[C++ Error] Unit1.cpp(95): E2034 Cannot convert 'char *' to 'char'
есть еще вопрос
есть
char sendbuf[100]="CWD soft\r\n";
как вместо soft вставить строку из RichEdit
( RichEdi1->Lines->Strings[0]; ) ???
если использовать
int b=123;
AnsiString a="Asdasd"+b+"qwer"
и вывести все это дело на экран то получится
Asdasd123qwer
но использовать Ansistring c сокетами то билдер ругается а проделать такую же фигню с
char sendbuf[100]="CWD soft\r\n"; не знаю как..
Сделал так!Если можно какнибудь упростить то все еще жду ответа!
char *b = P.c_str();
. Плюс формочка с combobox. Плюс форма с 12 speedbutton и pagecontrol.
Все это взаимосвязано, попросту для заполнения обычной структуры и отгрузки ее в файл.
Это весит 1.4 мегабайт. Поставил Full Release, убрал Build With Runtime Packages, убралось там Debug Info.
Код примерно 200 строк, если убрать комментарии. Никаких встроенных картинок и вообще встроенной лажи нет. Вопрос - что я мог натупить, что приложуха такая тяжелая? Спасибо, извините за дурацкий вопрос
Есть небольшая программа. 1 форма. на ней около 40 гаджетов типо edit, radiobutton, listbox, groupbox
...
Код примерно 200 строк, если убрать комментарии. Никаких встроенных картинок и вообще встроенной лажи нет. Вопрос - что я мог натупить, что приложуха такая тяжелая? Спасибо, извините за дурацкий вопрос
Не понятен вопрос - что тебя удивляет? Это твоего кода 200 строк - а объем кода компонентов тебе в голову не пришло посчитать? :) тем более что большинство функциий вызываются как __fastcall т.е. если есть такая возможность компилятор преобразует ее в inline - функциию. Дополнитпельно ко всему этому компилятор линкует с ехе библиотеки менеджера памяти и все остальные.
Не понятен вопрос - что тебя удивляет? Это твоего кода 200 строк - а объем кода компонентов тебе в голову не пришло посчитать? :) тем более что большинство функциий вызываются как __fastcall т.е. если есть такая возможность компилятор преобразует ее в inline - функциию. Дополнитпельно ко всему этому компилятор линкует с ехе библиотеки менеджера памяти и все остальные.
Понятно. Но как уменьшить? Быть может убрать как то из списка линковки лишние модули, ну, это к примеру. я не даже знаю, привык принтф, сканф
Вообщем, за компактность надо заплатить прямым программированием API... Жаль, а так, задумка Борланда с RAD отличнейшая (На мой взгляд)
Если стадия разработки твоего проекта - именно оптимизация - первое - установи в свойствах компилятора оптимизация по размеру, соответственно в некоторых случаях программа будет работать неного медленнее (зависит от задач), но размер файла уменьшится (от 2% до 30% - опять же в зависимости от проекта). Затем в опциях компилятора установи - "Объединять идентичные строки". Для уменьшения размера так же можно отказаться от использования класса String & AnsiString - использовать символьные массивы. Использовать модульное программирование - т.е. вынести большинство функций в длл. Использовать упаковщик.
включить Build With Runtime Packages
В зависимости от твоего кода (sic!) и правильного использования вышеуказанного в различных сочетаниях можно добиться вполне приличных размеров.
Вобще если размер на столько уж критичен - лучше включить Build With Runtime Packages а необходимые библиотеки добавить на компьютер конечного пользователя при инсталляции.
char** text_enter( int *n )
{
char **user_text;
int i, j, text_entered;
i = 0,
j = 0,
text_entered = 0; // Tekst eshe ne vveden
clrscr();
puts ( "\n Vvedite ishodniy tekst:" );
puts ( "\n (konec stroki - Enter, konec teksta - Ctrl+N)\n" );
user_text = (char**) malloc( sizeof (char*) ); // Pam'at' pod 1 simvol
for ( i = 0; *(*(user_text + i) + (j + 1)) != 0xe; i++ )
{
user_text = (char**) realloc( user_text, i*sizeof (char*)); // Pam'at' pod stroki
for ( j = 0; *(*(user_text + i) + (j + 1)) != '\r'; j++ )
{
*(user_text + i) = (char*) realloc ( *(user_text + i),(j + 2)*sizeof (char*) );
*(*(user_text + i) + j) = getche(); // Pam'at' pod // simvoli
}
printf( "\n" );
}
*(*(user_text+i)+(j+1)) = eot;// Dobavlenie //priznaka konca stroki
*n = i - 1; // Sohranenie kolichestva strok v // tekste
text_entered = 1; // Tekst vveden
return ( user_text );
Если делать одномерным массивом, то все работает прекрасно, а так не хочет. Буду благодарен, если укажете мне на мою ошибку. :-?
Подскажите пожалуйста, как организовать ввод и вывод двумерного символьного массива. Вот, что получилось у меня:
char** text_enter( int *n )
{
char **user_text;
int i, j, text_entered;
i = 0,
j = 0,
text_entered = 0; // Tekst eshe ne vveden
clrscr();
puts ( "\n Vvedite ishodniy tekst:" );
puts ( "\n (konec stroki - Enter, konec teksta - Ctrl+N)\n" );
user_text = (char**) malloc( sizeof (char*) ); // Pam'at' pod 1 simvol
for ( i = 0; *(*(user_text + i) + (j + 1)) != 0xe; i++ )
{
user_text = (char**) realloc( user_text, i*sizeof (char*)); // Pam'at' pod stroki
for ( j = 0; *(*(user_text + i) + (j + 1)) != '\r'; j++ )
{
*(user_text + i) = (char*) realloc ( *(user_text + i),(j + 2)*sizeof (char*) );
*(*(user_text + i) + j) = getche(); // Pam'at' pod // simvoli
}
printf( "\n" );
}
*(*(user_text+i)+(j+1)) = eot;// Dobavlenie //priznaka konca stroki
*n = i - 1; // Sohranenie kolichestva strok v // tekste
text_entered = 1; // Tekst vveden
return ( user_text );
Если делать одномерным массивом, то все работает прекрасно, а так не хочет. Буду благодарен, если укажете мне на мою ошибку. :-?
Пока можно указать на одну ошибку - наивно думать что у большинства достаточно времени что бы разбираться с плохоотформатированным и непрокоментированным чужим кодом, при том строя предположения о том - что имел виду автор говоря - неполучается. Для меня к примеру вовсе не очевидно - зачем передавать в функцию указатель на число, счем єто связано, с какой ошибкой столкнулся автор? Далеко не факт что мне сейчас интересны вопросы строковых массивов, что я сразу кинусь создавать и тестировать данный проект. По тому, что бі получить внятній ответ - лучше и вопрос задавать внятно.
как можно сделать перетаскиваение элементов из 1 листбокса в другой???
Ключевые слова Drag, OnDragOver, OnDragDrop
как можно сделать перетаскиваение элементов из 1 листбокса в другой???
TObject *Source, int X, int Y)
{
TListItem *LI;
TListView *S = ((TListView*)Source);
LI = ((TListView*)Sender)->Items->Add();
}
void __fastcall TfmMain::lvTimeDragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{
if(Sender!=Source)Accept = Source->ClassNameIs("TListView");
}
void __fastcall TfmMain::lvTimeDragDrop(TObject *Sender, TObject *Source,
int X, int Y)
{
Equal=false;
bDown = true;
TListView *S = ((TListView*)Source);
TListItem *LIG;
int Count = lvTime->Items->Count;
for(int i=0;i<Count;i++){
if(*(AnsiString*)(lvTime->Items->Item->SubItems->Objects[0])==*(AnsiString*)(S->Items->Item[S->ItemIndex]->SubItems->Objects[0]))
{
LIG = lvTime->Items->Item;
Equal= true;
lvListProd->EndDrag(false);
return;
}
}
LIG = ((TListView*)Sender)->Items->Add();
LIG->Caption = S->Items->Item[S->ItemIndex]->Caption;
LIG->SubItems->AddObject(S->Items->Item[S->ItemIndex]->SubItems->Strings[0],S->Items->Item[S->ItemIndex]->SubItems->Objects[0]);
}
/
Это пример для TListView- для листбокса - тоже самое - но соответственно так как для листбокса.
Пример взят из рабочего кода, он не полный и использовать копи/пасте НЕ НУЖНО.
Осталось токо селать проверку на индекс(
-1) ато вылетает с ошыбкой когда промахиваешься и цепляешь пустое место
void __fastcall TForm1::OnDragOver(TObject *Sender, TObject *Source, int X,
int Y, TDragState State, bool &Accept)
{
Accept=Source=ListBox2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DragDrop(TObject *Sender, TObject *Source, int X,
int Y)
{
ListBox2->Items->Add(ListBox1->Items->Strings[ListBox1->ItemIndex]);
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnDrGover(TObject *Sender, TObject *Source, int X,
int Y, TDragState State, bool &Accept)
{
Accept=Source=ListBox1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnDragDrop(TObject *Sender, TObject *Source, int X,
int Y)
{
ListBox1->Items->Add(ListBox2->Items->Strings[ListBox2->ItemIndex]);
ListBox2->Items->Delete(ListBox2->ItemIndex);
}
//---------------------------------------------------------------------------
Сделал так:(таскать можно из 1 во второй и из 2 в первый)
Осталось токо селать проверку на индекс(
-1) ато вылетает с ошыбкой когда промахиваешься и цепляешь пустое место
Чтоб не промахиваться - обрабатывай нажатие клавиши мыши и там проверяй индекс
Хочу написать такую программу, которая запрещает доступ к различным настройкам компьютера. Это в общем.
Подробнее: Нужно, чтобы пользователь Windows XP без прав администратора не мог менять обои раб.стола, удалять или перемещать значки на рабочем столе и в "Программах".
Скорее всего, это будет самостоятельная программка, без дистанционного контроля (хотя, такой варинт не исключаю).
По ходу дела могут возникнуть дополнительные требования, но на первом этапе хотелось бы знать с чего начать? Под силу ли новичку написать такую прогу?
P.S. Установил C++Builder несколько дней назад, впервые. Т.е. - я полный..., мягко говоря, начинающий.
В форуме найти ничего не смог, потому что даже не знаю, как назвать такую прогу и какие термины могут употребляться.
Заранее спасибо.
Привет всем!
Хочу написать такую программу, которая запрещает доступ к различным настройкам компьютера. Это в общем.
Подробнее: Нужно, чтобы пользователь Windows XP без прав администратора не мог менять обои раб.стола, удалять или перемещать значки на рабочем столе и в "Программах".
Скорее всего, это будет самостоятельная программка, без дистанционного контроля (хотя, такой варинт не исключаю).
По ходу дела могут возникнуть дополнительные требования, но на первом этапе хотелось бы знать с чего начать? Под силу ли новичку написать такую прогу?
P.S. Установил C++Builder несколько дней назад, впервые. Т.е. - я полный..., мягко говоря, начинающий.
В форуме найти ничего не смог, потому что даже не знаю, как назвать такую прогу и какие термины могут употребляться.
Заранее спасибо.
Для начинающего, ИМХО, весьма неподъемная задача. Твое приложение должно по сути подменить рабочий стол винды, или как другой минимальный вариант - при запуске проверять права доступа на папки "Рабочий стол" и "Главное меню" и при необходимости выставлять нужные. Если у тебя есть опыт системного программирования в других средах разработки (С++) - то в общем то проблем не будет - задача геморная, но вполне решаемая. Если весь опыт программирования у тебя - несколько дней - тогда ...гы :)
Если у тебя есть опыт системного программирования в других средах разработки (С++) - то в общем то проблем не будет - задача геморная, но вполне решаемая. Если весь опыт программирования у тебя - несколько дней - тогда ...гы :)
Да, полный ГЫ... :-)
А если, скажем... ну, для начала, попробовать сделать программку, которая просто отключает мышь и клавиатуру, пока не получит комманду с сервера по сети.
Это проще?
Да, полный ГЫ... :-)
А если, скажем... ну, для начала, попробовать сделать программку, которая просто отключает мышь и клавиатуру, пока не получит комманду с сервера по сети.
Это проще?
:) Ну пробуй - узнаешь :) :) :)
:) Ну пробуй - узнаешь :) :) :)
Хе-хе... Ну, спасибо за совет.. :-)
Если бы еще подсказали как попробовать....
Хе-хе... Ну, спасибо за совет.. :-)
Если бы еще подсказали как попробовать....
Посмотри в билдеровких примерах - как работать с сетью, как слушать сокет и т.д.
Есть ли в С++ аналог процедуры или как заставить функцию возвращать больше одного значения? В Паскале для этого были процедуры, и все было просто и понятно.
Begin
C:=A+B;
D:=A*B;
End;
Потом вызов процедуры Example(5, 3, C1, D1) и все ок
А в return и C и D не затолкаешь. Неужели только через глобальные переменные? Просто сложно перейти сразу с Паскаля ни Си :(
Здравствуйте. Я очень долго сидел на Delphi, и С++ только начал изучать (+ курс лекций), поэтому мой вопрос так туп.
Есть ли в С++ аналог процедуры или как заставить функцию возвращать больше одного значения? В Паскале для этого были процедуры, и все было просто и понятно.
Begin
C:=A+B;
D:=A*B;
End;
Потом вызов процедуры Example(5, 3, C1, D1) и все ок
А в return и C и D не затолкаешь. Неужели только через глобальные переменные? Просто сложно перейти сразу с Паскаля ни Си :(
В билдере это будет выглядеть так:
C = A+B;
D = A*B;
}
int C1,D1;
Example(5,3,C1,D1);
это называется - передача значения по ссылке. Так же в фукцию можно передать указатель на переменную. Смысл один и тот же - в функцию передается адрес переменной и по этому адресу помещается результирующее значение.
В билдере это будет выглядеть так:
C = A+B;
D = A*B;
}
int C1,D1;
Example(5,3,C1,D1);
это называется - передача значения по ссылке. Так же в фукцию можно передать указатель на переменную. Смысл один и тот же - в функцию передается адрес переменной и по этому адресу помещается результирующее значение.
Правильно ли я понял:
В результате в С1 и D1 запишется значения С и D. &C - это адрес переменной-параметра (в нашем сл это адрес С1), те в функции переменная С - это ссылка на С1 и при ее изменании меняесся и С1. И return писать не нужно. Верно я понял?
Про указатель: те если есть какая -то глобальная переменная С то можно создать Функцию с параметром *С и *D:
C = A+B;
D = A*B;
}
int C1,D1;
Example(5,3,C1,D1);
Опять верно ли я понял: *С - при вызове функции это указатель на С1, и тогда в функции С это сама С1? Примерно так?
Правильно ли я понял:
В результате в С1 и D1 запишется значения С и D. &C - это адрес переменной-параметра (в нашем сл это адрес С1), те в функции переменная С - это ссылка на С1 и при ее изменании меняесся и С1. И return писать не нужно. Верно я понял?
Да. Этот прием используется достаточно часто если функция должна вернуть более одного параметра. Единственно, что бы не плодить функции с сумашедшим числом параметров в нее как правило передают указатель на структуру - т.е. этот пример можно переписать примерно так:
int C;
int D;
};
void Example(const int A,const int B,TParam *param){
param->C = A+B;
param->D = A*B;
}
TParam param;
param.C = 0;param.D = 0;
Example(5,3,¶m);
Про указатель: те если есть какая -то глобальная переменная С то можно создать Функцию с параметром *С и *D:
C = A+B;
D = A*B;
}
int C1,D1;
Example(5,3,C1,D1);
Опять верно ли я понял: *С - при вызове функции это указатель на С1, и тогда в функции С это сама С1? Примерно так?
Примерно так. Только если функция требует указатель тогда ее вызов будет выглядеть так:
*C = A+B;
*D = A*B;
//Что бы присвоить значение указатель нужно разименовать обязательно.
}
Example(5,3,&C1,&D1);
или надо объявлять указатель на переменные С1 и D1 или иначе ты получишь ошибку при компиляции. Простые типы как правило передаются или по ссылке - если планируется использовать ее значение в дальнейшем или непосредственно. По указателю как правило передаются пользовательские типы данных(классы структуры массивы). Если переменная не будет изменятся в процессе работы функции ее лучше передавать как константную. Ну и еще нюанс - в реальной программе переменные лучше инициализировать перед тем как использовать. Будет меньше проблем.
Ну и рекомендую читать Страуструпа - с начала может будет тяжело и непонятно - зато когда въедеш - проблем не будет.