Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.015 c
3-47962
KIR
2002-07-25 13:48
2002.08.15
Что за ошибка Key Violation в БД Paradox


6-48239
eSKey
2002-05-31 16:59
2002.08.15
Параметр Socket в обработчике событий ServerSocket


3-47978
vadim2
2002-07-26 14:47
2002.08.15
порядок событий у tdataset?


1-48034
V.Turecky
2002-08-03 20:09
2002.08.15
Меню.Enabled:=false???


14-48313
AlexRya
2002-07-22 22:43
2002.08.15
Как изменить меню загрузки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский