Форум РадиоКот https://radiokot.ru/forum/ |
|
Вопросы по С/С++ (СИ) https://radiokot.ru/forum/viewtopic.php?f=62&t=37190 |
Страница 1 из 380 |
Автор: | Кислый [ Чт ноя 04, 2010 12:50:00 ] |
Заголовок сообщения: | Вопросы по С/С++ (СИ) |
есть прога (мое извращение) #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; //function IntToHex ( DecimalValue : Integer; MinimumWidth : Integer ) : string; char* IntToHex(long DecimalValue, int MinimumWidth) { char b[256]; sprintf(b, "%lX", DecimalValue); b[3] = '\0'; return b; } int main() { long dv = 20; int mw = 2; cout << IntToHex(dv,mw) << endl; return 0; } т.е. в момент когда я возвращаю строку, то ее в памяти уже нет и она может быть занята другой переменной.. так? не смотрите на то что она в принципе делает не совсем то что и делфи аналог. очень прошу показать правильную реализацию возвращения строки на примере моей функции. |
Автор: | lix [ Чт ноя 04, 2010 13:41:08 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
объяви b как static Код: static char b[256]; ну или сделай ее глобальной. |
Автор: | Integrator [ Чт ноя 04, 2010 14:41:52 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
ИМХО правильней было бы объявить b в main, а в IntToHex передавать указатель. |
Автор: | NiTr0 [ Чт ноя 04, 2010 15:01:41 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
Кислый писал(а): очень прошу показать правильную реализацию возвращения строки на примере моей функции. 3 варианта: 1) static буффер в памяти 2) malloc (и аналогичные по назначению ф-и), с освобождением после обработки результата 3) передача указателя на буффер в 1 из параметров все 3 варианта успешно применяются... хотя каждый имеет свои плюсы и минусы. |
Автор: | Murav [ Чт ноя 04, 2010 16:40:26 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
Насколько я вижу, здесь используется C++. Тогда можно задействовать стандартный C++ класс std::string: Код: #include <string>
std::string IntToHex(long DecimalValue, int MinimumWidth) { char b[256]; sprintf(b, "%lX", DecimalValue); b[3] = '\0'; return b; } int main() { cout << IntToHex(20,2) << endl; return 0; } |
Автор: | lix [ Чт ноя 04, 2010 18:16:11 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
еще можно \0 не писать. он должен быть в sprintf. еще можно воспользоваться строковыми потоками. |
Автор: | Кислый [ Чт ноя 04, 2010 19:26:21 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
я себе задачу поставил пользоваться с++ только по невозможности использовать с. Как говорится "То что сложно - не нужно, нужно то что просто" |
Автор: | Murav [ Чт ноя 04, 2010 19:37:51 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
Тогда для начала убери Кислый писал(а): #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> и Кислый писал(а): cout << IntToHex(dv,mw) << endl; поскольку это тоже C++. Ну а способы на C NiTr0 уже привёл. Обычно в таком случае используют вариант с буфером в вызывающей функции: Код: #include <stdio.h>
void IntToHex(char *b,long DecimalValue, int MinimumWidth) { sprintf(b, "%lX", DecimalValue); b[3] = '\0'; return b; } int main() { long dv = 20; int mw = 2; char b[256]; IntToHex(b,dv,mw); printf("%s",b); return 0; } |
Автор: | Кислый [ Вс ноя 07, 2010 22:25:15 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
господа, буффер это хорошо.. но эффект тот же что и от "static". просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ???? |
Автор: | NiTr0 [ Вс ноя 07, 2010 23:22:42 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
Кислый писал(а): господа, буффер это хорошо.. но эффект тот же что и от "static". просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ???? А в чем проблема? Кто допустим мешает создать массив указателей на буфферы, и по мере необходимости - выделять новый? Или, если не нравится - двухсвязный список буфферов реализовать? |
Автор: | Кислый [ Вс ноя 07, 2010 23:29:07 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
как-то не эстетично )) |
Автор: | lix [ Пн ноя 08, 2010 08:42:16 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
Кислый писал(а): как-то не эстетично )) иначе никак. |
Автор: | Кислый [ Пн ноя 08, 2010 10:12:37 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
тогда поделитесь мы слями теоретического характера. имеем код, работающий с int, применена так называемая передача аргумента по ссылке. Код: int fn(int &pnArg) { pnArg = 10; return pnArg; } int main() { int n = 1; cout << f(n) << endl; return 0; } тот же код но int заменен на char: Код: char fn(char &pnArg) { pnArg = 'A'; return pnArg; } int main() { char n = '2'; cout << f(n) << endl; return 0; } работает. но Код: char fn(char &pnArg[]) уже не работает. почему ?
{ pnArg[2] = 'A'; return pnArg; } int main() { char n[4] = "012"; cout << f(n) << endl; return 0; } |
Автор: | Кислый [ Пн ноя 08, 2010 10:40:12 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
трындец. у меня дофига функций которые должны возвращать символьную строку, или указатель на строку.. у меня псих уже. |
Автор: | lix [ Пн ноя 08, 2010 11:07:06 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
во-первых имена функций разные. во-вторых передавай указатель на строку Код: char *fun(char *arg)
{ arg[2] = 'G'; return arg; } |
Автор: | Murav [ Пн ноя 08, 2010 12:19:24 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
Кислый писал(а): но Код: char fn(char &pnArg[]) { pnArg[2] = 'A'; return pnArg; } int main() { char n[4] = "012"; cout << f(n) << endl; return 0; } уже не работает. почему ? Забыл * в типе возвращаемого значения а так же имена функций разные в объявлении и вызове. И, кстати, ссылки - это тоже C++, а в C всё делается на указателях. |
Автор: | Кислый [ Пн ноя 08, 2010 17:45:19 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
блин. порой мне кажется что я тупица. ниче не понимаю. |
Автор: | lix [ Пн ноя 08, 2010 18:05:26 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
просто мало опыта и практики |
Автор: | Кислый [ Пн ноя 08, 2010 23:08:18 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
NiTr0 писал(а): Кто допустим мешает создать массив указателей на буфферы, и по мере необходимости - выделять новый? Или, если не нравится - двухсвязный список буфферов реализовать? покажите пример, плз. а то сам не дойду |
Автор: | NiTr0 [ Вт ноя 09, 2010 00:14:37 ] |
Заголовок сообщения: | Re: помогите с поиском ответа ( C си) |
char* c[100]; int count=0; for (i=........) { c[count] = malloc(STRSIZE); if (c[count]!=NULL) count++; else break; func(c[count-1]); } while count>0; do { free(c[--count]); } |
Страница 1 из 380 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |