Вопросы по С/С++ (СИ)
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Вопросы по С/С++ (СИ)
есть прога (мое извращение)
#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;
}
т.е. в момент когда я возвращаю строку, то ее в памяти уже нет и она может быть занята другой переменной.. так?
не смотрите на то что она в принципе делает не совсем то что и делфи аналог. очень прошу показать правильную реализацию возвращения строки на примере моей функции.
#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
@hobbyelectronics
-
Integrator
- Нашел транзистор. Понюхал.
- Сообщения: 162
- Зарегистрирован: Пн авг 31, 2009 20:36:43
Re: помогите с поиском ответа ( C си)
ИМХО правильней было бы объявить b в main, а в IntToHex передавать указатель.
- NiTr0
- Друг Кота
- Сообщения: 3051
- Зарегистрирован: Пт авг 10, 2007 12:49:55
- Откуда: kr.ua
- Контактная информация:
Re: помогите с поиском ответа ( C си)
Кислый писал(а):очень прошу показать правильную реализацию возвращения строки на примере моей функции.
3 варианта:
1) static буффер в памяти
2) malloc (и аналогичные по назначению ф-и), с освобождением после обработки результата
3) передача указателя на буффер в 1 из параметров
все 3 варианта успешно применяются... хотя каждый имеет свои плюсы и минусы.
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;
}
Re: помогите с поиском ответа ( C си)
еще можно \0 не писать. он должен быть в sprintf. еще можно воспользоваться строковыми потоками.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
я себе задачу поставил пользоваться с++ только по невозможности использовать с. Как говорится "То что сложно - не нужно, нужно то что просто"
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Re: помогите с поиском ответа ( C си)
Тогда для начала убери
и
поскольку это тоже C++.
Ну а способы на C NiTr0 уже привёл.
Обычно в таком случае используют вариант с буфером в вызывающей функции:
Кислый писал(а):#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;
}
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
господа, буффер это хорошо.. но эффект тот же что и от "static".
просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ????
просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ????
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
- NiTr0
- Друг Кота
- Сообщения: 3051
- Зарегистрирован: Пт авг 10, 2007 12:49:55
- Откуда: kr.ua
- Контактная информация:
Re: помогите с поиском ответа ( C си)
Кислый писал(а):господа, буффер это хорошо.. но эффект тот же что и от "static".
просто что ж получается.. допустим у меня цикл.. с неопределенным количеством повторов.. как тогда ? ведь не могу же я определить заранее сколько будет у меня буферов ????
А в чем проблема?
Кто допустим мешает создать массив указателей на буфферы, и по мере необходимости - выделять новый? Или, если не нравится - двухсвязный список буфферов реализовать?
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
как-то не эстетично ))
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Re: помогите с поиском ответа ( C си)
Кислый писал(а):как-то не эстетично ))
иначе никак.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
тогда поделитесь мы слями теоретического характера.
имеем код, работающий с int, применена так называемая передача аргумента по ссылке.
тот же код но int заменен на char:
работает.
но уже не работает. почему ?
имеем код, работающий с 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
@hobbyelectronics
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
трындец. у меня дофига функций которые должны возвращать символьную строку, или указатель на строку.. у меня псих уже.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Re: помогите с поиском ответа ( C си)
во-первых имена функций разные. во-вторых передавай указатель на строку
Код: Выделить всё
char *fun(char *arg)
{
arg[2] = 'G';
return arg;
}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 всё делается на указателях.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
блин. порой мне кажется что я тупица. ниче не понимаю.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Re: помогите с поиском ответа ( C си)
просто мало опыта и практики
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: помогите с поиском ответа ( C си)
NiTr0 писал(а):Кто допустим мешает создать массив указателей на буфферы, и по мере необходимости - выделять новый? Или, если не нравится - двухсвязный список буфферов реализовать?
покажите пример, плз. а то сам не дойду

RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
- NiTr0
- Друг Кота
- Сообщения: 3051
- Зарегистрирован: Пт авг 10, 2007 12:49:55
- Откуда: kr.ua
- Контактная информация:
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]);
}
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]);
}