Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Сообщения без ответов | Активные темы
Страница 1 из 384
[ Сообщений: 7669 ]
, , , , ...
Автор
Сообщение
Кислый
Заголовок сообщения: Вопросы по С/С++ (СИ)
Добавлено: Чт ноя 04, 2010 12:50:00
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
есть прога (мое извращение) #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; } т.е. в момент когда я возвращаю строку, то ее в памяти уже нет и она может быть занята другой переменной.. так? не смотрите на то что она в принципе делает не совсем то что и делфи аналог. очень прошу показать правильную реализацию возвращения строки на примере моей функции.
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
Реклама
lix
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 13:41:08
Карма: 5
Рейтинг сообщений: 0
Зарегистрирован: Вс янв 17, 2010 15:32:19Сообщений: 701Откуда: Курган
Рейтинг сообщения: 0
Медали: 1
объяви b как static
Код:
static char b[256];
ну или сделай ее глобальной.
Вернуться наверх
Реклама
Integrator
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 14:41:52
Нашел транзистор. Понюхал.
Карма: 12
Рейтинг сообщений: 32
Зарегистрирован: Пн авг 31, 2009 20:36:43Сообщений: 162
Рейтинг сообщения: 0
ИМХО правильней было бы объявить b в main, а в IntToHex передавать указатель.
Вернуться наверх
NiTr0
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 15:01:41
Друг Кота
Карма: 1
Рейтинг сообщений: 4
Зарегистрирован: Пт авг 10, 2007 12:49:55Сообщений: 3051Откуда: kr.ua
Рейтинг сообщения: 0
Кислый писал(а):
очень прошу показать правильную реализацию возвращения строки на примере моей функции.
3 варианта:
1) static буффер в памяти
2) malloc (и аналогичные по назначению ф-и), с освобождением после обработки результата
3) передача указателя на буффер в 1 из параметров
все 3 варианта успешно применяются... хотя каждый имеет свои плюсы и минусы.
Вернуться наверх
Реклама
В продаже новые LED-драйверы XLC компании MEAN WELL с диммингом нового поколения
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Подробнее>>
Murav
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 16:40:26
Зарегистрирован: Чт фев 18, 2010 13:51:56Сообщений: 877
Рейтинг сообщения: 0
Насколько я вижу, здесь используется 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
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 18:16:11
Карма: 5
Рейтинг сообщений: 0
Зарегистрирован: Вс янв 17, 2010 15:32:19Сообщений: 701Откуда: Курган
Рейтинг сообщения: 0
Медали: 1
еще можно \0 не писать. он должен быть в sprintf. еще можно воспользоваться строковыми потоками.
Вернуться наверх
Реклама
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 19:26:21
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
я себе задачу поставил пользоваться с++ только по невозможности использовать с. Как говорится "То что сложно - не нужно, нужно то что просто"
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
Murav
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Чт ноя 04, 2010 19:37:51
Зарегистрирован: Чт фев 18, 2010 13:51:56Сообщений: 877
Рейтинг сообщения: 0
Тогда для начала убери
Кислый писал(а):
#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; }
Вернуться наверх
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Вс ноя 07, 2010 22:25:15
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
господа, буффер это хорошо.. но эффект тот же что и от "static". просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ????
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
Реклама
NiTr0
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Вс ноя 07, 2010 23:22:42
Друг Кота
Карма: 1
Рейтинг сообщений: 4
Зарегистрирован: Пт авг 10, 2007 12:49:55Сообщений: 3051Откуда: kr.ua
Рейтинг сообщения: 0
Кислый писал(а):
господа, буффер это хорошо.. но эффект тот же что и от "static". просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ????
А в чем проблема?
Кто допустим мешает создать массив указателей на буфферы, и по мере необходимости - выделять новый? Или, если не нравится - двухсвязный список буфферов реализовать?
Вернуться наверх
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Вс ноя 07, 2010 23:29:07
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
как-то не эстетично ))
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
lix
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 08:42:16
Карма: 5
Рейтинг сообщений: 0
Зарегистрирован: Вс янв 17, 2010 15:32:19Сообщений: 701Откуда: Курган
Рейтинг сообщения: 0
Медали: 1
Кислый писал(а):
как-то не эстетично ))
иначе никак.
Вернуться наверх
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 10:12:37
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
тогда поделитесь мы слями теоретического характера.
имеем код, работающий с 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; }
уже не работает. почему ?
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 10:40:12
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
трындец. у меня дофига функций которые должны возвращать символьную строку, или указатель на строку.. у меня псих уже.
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
lix
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 11:07:06
Карма: 5
Рейтинг сообщений: 0
Зарегистрирован: Вс янв 17, 2010 15:32:19Сообщений: 701Откуда: Курган
Рейтинг сообщения: 0
Медали: 1
во-первых имена функций разные. во-вторых передавай указатель на строку
Код:
char *fun(char *arg) { arg[2] = 'G'; return arg; }
Вернуться наверх
Murav
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 12:19:24
Зарегистрирован: Чт фев 18, 2010 13:51:56Сообщений: 877
Рейтинг сообщения: 0
Кислый писал(а):
но Код: char fn(char &pnArg[]) { pnArg[2] = 'A'; return pnArg; } int main() { char n[4] = "012"; cout << f(n) << endl; return 0; } уже не работает. почему ?
Забыл * в типе возвращаемого значения а так же имена функций разные в объявлении и вызове. И, кстати, ссылки - это тоже C++, а в C всё делается на указателях.
Вернуться наверх
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 17:45:19
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 1
блин. порой мне кажется что я тупица. ниче не понимаю.
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
lix
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 18:05:26
Карма: 5
Рейтинг сообщений: 0
Зарегистрирован: Вс янв 17, 2010 15:32:19Сообщений: 701Откуда: Курган
Рейтинг сообщения: 0
Медали: 1
просто мало опыта и практики
Вернуться наверх
Кислый
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Пн ноя 08, 2010 23:08:18
Поставщик валерьянки для Кота
Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01Сообщений: 2095Откуда: Краснодар
Рейтинг сообщения: 0
NiTr0 писал(а):
Кто допустим мешает создать массив указателей на буфферы, и по мере необходимости - выделять новый? Или, если не нравится - двухсвязный список буфферов реализовать?
покажите пример, плз. а то сам не дойду
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
Вернуться наверх
NiTr0
Заголовок сообщения: Re: помогите с поиском ответа ( C си)
Добавлено: Вт ноя 09, 2010 00:14:37
Друг Кота
Карма: 1
Рейтинг сообщений: 4
Зарегистрирован: Пт авг 10, 2007 12:49:55Сообщений: 3051Откуда: kr.ua
Рейтинг сообщения: 0
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 из 384
[ Сообщений: 7669 ]
, , , , ...
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения