Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Внизкак объявить функцию в C? Найти похожие ветки
← →
ev (2002-07-20 18:24) [0]савсем забыл C... :(
функция возвращает массив типаchar buf[33];
и как писатьreturn
?
← →
Viewer (2002-07-20 18:25) [1]Тут о паскале вроде разговор.
← →
ev (2002-07-20 18:27) [2]поэтому и написал в потрепаться :)
p.s. больще конференций не знаю :(
← →
Oleg_Gashev (2002-07-20 18:43) [3]Не проще ли возвращать
char*
?
Например:
#include <stdio.h>
char* myFunction(void);
void main(void)
{
puts(myFunction());
}
char* myFunction(void)
{
return "MyFunction() run.";
}
← →
ev (2002-07-20 18:45) [4]Я пишу в IAR C (для микроконтроллеров ATMEL).
И там проблемы с памятью (уж очень ее мало).
Экономится каждый байт :(
← →
Oleg_Gashev (2002-07-20 18:50) [5]Ну тогда передавай в myFunction буфер и размер буфера, чтобы myFunction обрезала результат.
← →
ev (2002-07-20 18:53) [6]у меня есть char buf[33]; и есть char* temp;
как мне весь buf поместить в temp?
← →
ev (2002-07-20 18:57) [7]p.s.
будет ли корректно temp=buf;
← →
Suntechnic (2002-07-20 19:03) [8]Массивы в С возврашаются так как тебе Oleg_Gashev © рассказал.
>у меня есть char buf[33]; и есть char* temp;
>как мне весь buf поместить в temp?
Тут ещё вопрос что у тебя в buf находится? Если обычная строка, тогдаstrcpy(temp,buff);
Если в массиве бинарные данные тогдаmemcpy(temp,buff,30);
И ещё совет.... проследи внимательно чтобы что-нибудь подобное не написать:
char * fun()
{
char array[30];
return array;
}
а то проблем потом не оберёшься...
← →
Desdechado (2002-07-20 19:03) [9]как buf, так и temp - указатели. поэтому temp=buf дает эффект указания ими обоими на один адрес в памяти.
← →
Oleg_Gashev (2002-07-20 19:04) [10]Нет.
Воспользуйся strcpy.
Не забудь #include <string.h>
← →
Suntechnic (2002-07-20 19:10) [11]В догонку...
Под temp память выделить не забудь. А потом естественно и освободить.
← →
Viewer (2002-07-20 19:12) [12]В отличие от паскаля в C строку просто так (как в паскале) не вернуть.
В функцию передаешь указатель на тип и размер, она заполняет по указателю указанный размер известным типом.
Вот пример возврата (возвращается указатель на сгенерир.строку длиной num)
static char* RandStr(int num)
{
int i;
char *ret = new char[num+1];
for ( i=0; i < (num); i++)
ret[i] = char(65+(rand()/10)%(91-65));
ret[i] = szNULL;
return(ret);
}
char *s1;
s1 = RandStr(SLEN);
..
delete [] s1;
Впрочем у тебя чистый C, так что сделай поправку на создание и удаление буфера.
← →
ev (2002-07-20 19:13) [13]дело в том, что это не обычный С (все не понимает) :(
не могу string.h найти :(
← →
ev (2002-07-20 19:15) [14]компилятор не понимает char *ret = new char[num+1]; :(
← →
ev (2002-07-20 19:19) [15]делаю так
char* df_rb() {
int i;
char buf[33];
char* temp;
for (i=0;i<33;i++) { buf[i]=SPDR; }
strcpy(temp,buf);
return temp;
}
......
char xxx[33];
char* ccc;
ccc=df_rb();
for (i=0;i<33;i++) { xxx[i]=ccc[i]; }
1. будет корректно работать ?
2. очень сложно, может есть чего проще?
← →
Огурцова Е. М. (2002-07-20 19:26) [16]ev, переходите на AVR ассемблер :)
AVR Studio 3.0 просто сказка.
← →
Suntechnic (2002-07-20 19:53) [17]>ev © (20.07.02 19:19)
Не будет это корректно работать. У тебя под temp память не выделена.
Если через new не получается попробуй malloc из stdlib.h
← →
Viewer (2002-07-20 19:54) [18]Вот бабай..
new - это для С++
..
char s[33], *sptr;
*sptr=s;
void function my(sptr);
char *sptr;
{
*sptr="a";
sptr++;
*sptr="b"; // до 33-х попугаев
...
}
← →
Suntechnic (2002-07-20 20:00) [19]>Viewer (20.07.02 19:54)
>char s[33], *sptr;
>*sptr=s;
Это чистый бред с точки зрения С....
Расскажи толком что надо, если хочешь нормальный код получить.
← →
limon (2002-07-20 20:12) [20]тогда уж
sptr = s;
my(sptr);
← →
Viewer (2002-07-20 20:12) [21]Сорри
char s[33], *sptr;
sptr=s;
← →
ev (2002-07-20 22:46) [22]> Огурцова Е. М. (20.07.02 19:26)
> ev, переходите на AVR ассемблер :)
> AVR Studio 3.0 просто сказка.
С него и начинал :) В AVRStudio и сейчас прошиваю :)
Но поставленная задача сложна при реализации на ассемблере :(
> Suntechnic © (20.07.02 20:00)
> Расскажи толком что надо, если хочешь нормальный код получить.
Надо примерно так:
char* df_rb() {
int i;
char buf[33];
for (i=0;i<33;i++) { buf[i]=SPDR; }
return buf;
}
......
char xxx[33];
xxx=df_rb();
Но такое будет не совсем корректно, или я не прав?
← →
Suntechnic (2002-07-21 00:29) [23]>ev © (20.07.02 22:46)
Я ж тебя предупреждал по поводу статических массивов!!!
Сравни свой код
char* df_rb() {
int i;
char buf[33];
for (i=0;i<33;i++) { buf[i]=SPDR; }
return buf;
}
и вот этот
>Suntechnic © (20.07.02 19:03)
>И ещё совет.... проследи внимательно чтобы что-нибудь подобное >не написать:
>char * fun()
>{
> char array[30];
> return array;
>}
>а то проблем потом не оберёшься...
В них есть нечто общее не правда ли?
Ты размешаешь статический массив на стеке, это значит, что по выходу из ф-ции произойдёт раскрутка стека и массив будет уничтожен, а указатель останется. Улавливаешь?
Для того чтобы написать корректный код надо знать задачу, твоих исходников мало... для меня допустим до сих пор загадка что такое SPDR.
← →
evgeg (2002-07-21 00:39) [24]Куча ошибок:
char buf[33] -- локальная переменная, память из под нее освободится после выхода из функции, указатель на нее нальзя возвращать
xxx[33]=df_rb() -- в этой строке сразу две ошибки
1) присваивается значение указателя другому указателю, а не копируется массив, как вы хотели
2) xxx[33] -- массив - это константный указатель, присваивать ему нельзя, просто не скомпилируется
Если вы хотите, чтобы корректно работали функции работы со строками, строка должна завершаться нулевым символом.
Надо так:
void df_rb(char *s, int n)
{
int i;
for (i=0;i<n-1;i++)
s[i] = SPDR;
s [n-1] = 0;
}
......
df_rb(xxx, 33);
← →
Igorek (2002-07-21 10:48) [25]2ev
1) Определись, как хранить массив char[33] - статически или динамически. Есть плюсы и минусы и там и там.
1) Если статически, то определись где его определить. Внутри df_rb или нет. Ничего страшного нет, если ты определишь его внутри df_rb, (память под статические данные выделяется один раз в не зависимости от того, где они описаны). Если внутри, то ты можешь просто его заполнять и возвращать указатель на начало. Если снаружи, то ты можешь вообще ничего не возвращать, а менять память, на которую ссылается параметр-указатель (т.е. использовать параметр вместо)
2) Если динамически, то опять же определись, кто создает массив. А лучше, что бы он и уничтожал его. Если вообще в этом C есть работа с выделением памяти (malloc). По логике, если работа с массивом будет идти за пределами функции, то не она должна его создавать. Передавай ей указатель параметр и ничего не возвращай. Если она все же создает, а кто-то другой уничтожает, то об этом надо позаботиться (хотя код получится немного "дурнопахнущий"). Но тогда смело внутри создавай и возвращай указатель на созданную память.
Также можешь определить структуру напр.
struct MyString{char s[33];}; и ее использовать. Она немного заменит класс в С++, хотя если каждый байт на счету, то наверное не надо.
← →
ev (2002-07-21 21:21) [26]> Suntechnic © (21.07.02 00:29)
В посте от (20.07.02 22:46) я написал, как бы мне хотелось...
> для меня допустим до сих пор загадка что такое SPDR
Это просто байт.
> evgeg © (21.07.02 00:39)
> Если вы хотите, чтобы корректно работали функции работы
> со строками, строка должна завершаться нулевым символом.
А если мне не нужна работа со строками, а нужны только массивы - то 0 не нужен?
← →
evgeg (2002-07-21 22:05) [27]> А если мне не нужна работа со строками, а нужны только массивы - то 0 не нужен?
Не нужен.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c