Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помощь по СИ

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4

Открыть новую тему     Написать ответ в эту тему

Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
я чет понять не могу некоторые вещи
во  имеем код, взятый из книги Кернигана и Ритчи
 

Код:
 
#include <stdio.h>
#define MAXLINE 1000
 
int getline(char s[], int lim);
void copy(char to[], char from[]);
 
main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];
 
    max = 0;
    while ((len = getline(line,MAXLINE)) > 0)
    {
        if (len > max)
        {
            max = len;
            copy(longest,line);
        }
    }
    if (max > 0)
    {
        printf("%s", longest);
    }
    return 0;
}
 
int getline(char s[], int lim)
{
    int c, l;
    for (l = 0; l < lim-1 && (c = getchar()) != EOF && c != '\n'; ++l) {
        s[l] = c;
    }
 
    if (c == EOF) {
        return 0;
    }
 
    if (c == '\n')
        s[l] = c;
        ++i;
 
    s[l] = '\0';
 
    return l;
}
 
void copy(char to[], char from[])
{
    int l;
 
    l = 0;
    while ((to[l] = from[l]) != '\0')
        ++l;
}
 
 

 
основная непонятка с copy(longest,line); в функци main.
 
от куда мы получаем значение line, если мы ее только передаем в функцию getline? как я понимаю функции используют только аргументы, но они же не изменяют саму переменную, агумент которой им передают. Тем более функция getline озвращает инкримент, а не cаму строку. Каким же образом мы плучаем line?
 
а также каким образом мы получаем longest?
 
ну могу я въехать в си, хотя на перле програмлю около 5 лет.

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 19:02 19-01-2005 | Исправлено: Infection, 11:36 23-01-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
объсяните плиз кто-нить область видимости переменной, которую передают из функции в функцию

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 11:37 23-01-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection

Цитата:
а также каким образом мы получаем longest?  


Цитата:
char longest[MAXLINE];  

 

Цитата:
область видимости переменной, которую передают из функции в функцию

Переменная имеет область видимости функции, в которую она передана, как аргумент; и область видимости блока (ограниченого { } ), в которой она объявлена.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 12:02 23-01-2005 | Исправлено: KADABRA, 12:30 23-01-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KADABRA,
как я понимаю
 
 char longest[MAXLINE];  
 
объявляет только о существовании переменной, точно также как в perl
 
use strict;
my @longest;
 
а я не могу я понять в си как мы получаем значения long и longest, если нигде нет оператора присваивания `=`
 
как же это все работает, если функция получает только значение переменой, а не саму переменную или же ссылку на нее

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 14:15 23-01-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection

Цитата:
 
 int getline(char s[], int lim)
{
    int c, l;
    for (l = 0; l < lim-1 && (c = getchar()) != EOF && c != '\n'; ++l) {
        s[l] = c;
    }
...
 

char s[] - тут это ссылка на массив, len = getline(line,MAXLINE) ... и т.д.
c = getchar() - с присваивается то, что ты ввёл в консоли.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 14:34 23-01-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
а где сам признак ссылочности???

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 14:47 23-01-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection
int getline(char s[], int lim)  
 
Можно int getline(char *s, int lim)

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 14:55 23-01-2005
JohnSon77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection
 
Дело в том что в "с" массив всегда передается в виде указателя на его первый элемент, а строка это и есть массив символов char[...]
 
поэтому f(char s[]) абсолютно идентично f(char *s)

Всего записей: 110 | Зарегистр. 26-11-2004 | Отправлено: 14:30 24-01-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
помогите пожалуйста кто-нить переписать на си
 
имеем код в перле
 

Код:
 
$bytes = 0;
open(FOA,"755");
 
str(10);
str(10,0);
 
close(FOA);
 
sub str ($;$){
    ($len,$count) = @_;
    $ret = undef;
 
    read(FOA,$ret,$len);
 
    unless ($count) {
        # Просчитать байты, если не стоит флаг на счет
        $bytes += $len unless $count;
    } else {
        seek(FOA,$bytes,0);
    }
 
    return $ret;
}
 
 

 
пытась написать на си и не получается
 

Код:
 
FILE *FOA;
int bytes = 0;
 
char* str(int len, int count=0);
 
main{
 
    if ( (FOA = fopen("745996", "r") )==NULL)
    {
        fprintf (stderr, "Can't find HPSDFOAFILE\n");
        exit(1);
    };
 
    printf("String: %s\n", str(32,0));
 
    fclose(FOA);
    exit(0);
 
}
 
char* str(int len, int count)
{
    char *ret[MAX];
 
    fread(ret, 1, len, FOA);
 
    if (!count) {
        bytes += len;
    } else {
        fseek(FOA,bytes,0);
    }
 
    return ret;
}
 
 

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 09:02 05-04-2005
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection
а собстна, че этот перловый скрипт делает?

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 13:22 05-04-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
distance, скрипт много чего делает
 
в данном случае читайт байт за байтом данные из файла
 
сделал вот тако вот
 

Код:
 
#define LEN 64
 
int FOA;
char rec[LEN];
int bytes = 0;
 
char * str(int len,...);
 
main()
{
    /*=================================================*/
    // Открытие файла
    FOA = open("745996", O_RDONLY);
    if (FOA == -1)
    {
        fprintf (stderr, "Can't find HPSDFOAFILE\n");
        exit(1);
    };
    str(6);
    printf ("String: %s\n", str(6));
 
    close(FOA);
    return;
}
 
char * str(int len,...)
{
    //---------------------------------------------
    // Вытащим второй необязательный параметр
    //
        int count;
        va_list ap;
        va_start(ap, len);
        count = va_arg(ap, int);
        va_end(ap);
    //
    //---------------------------------------------
 
    read(FOA,rec,len);
 
    if (!count) {
        bytes += len;
    } else {
        lseek(FOA,bytes,0);
    }
 
    return rec;
}
 

 
сейчас вопрос в другом, какие есть средства в си, для упаковки и распаковки значений в и из бинарной структура
 
то есть как реализовать перловую функцию unpack в си

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 14:30 05-04-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection

Цитата:
сейчас вопрос в другом, какие есть средства в си, для упаковки и распаковки значений в и из бинарной структура  

непонял вопрос, но работа с битовыми структурами такая:
struct bitstruct
{
  bool b1:1;
  charl b2:1;
} test_bin;//объявили структуру
test_bin.b1=true;//присвоили 1 биту 0;
int temp=test_bin.b1;//извлекли 1 из бита 0
int temp2=test_bin.b2;//извлекли бит 1
и т.д.

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 16:17 05-04-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
WiseAlex
 
Я и сам не знаю что хочу
 
1===============================================
имеем строку "s.tY.ЪЪЪ"
в шестандцатиричном это выглядит как "73 00 74 59 96 FF FF FF"
нужно из бинарного получить строку "7300745996FFFFFF"
в перле делается вот так вот unpack("H*","s.tY.ЪЪЪ");
================================================
 
2===============================================
имеем строку "..."
в шестандцатиричном это "00 00 07"
в десятичном это 7
в перле делается вот так вот hex(unpack("H*","00 00 07"));
================================================
 
как на сях переконверить строку?
 

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 16:38 05-04-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection

Цитата:
как на сях переконверить строку?  

прямой функции нет.

Цитата:
1===============================================
имеем строку "s.tY.ЪЪЪ"
в шестандцатиричном это выглядит как "73 00 74 59 96 FF FF FF"
нужно из бинарного получить строку "7300745996FFFFFF"
в перле делается вот так вот unpack("H*","s.tY.ЪЪЪ");
================================================  

здесь есть массив байт и нужно их представить в виде строки:
например так
char * input;
unsigned len=10;// число байт в input
char output[256];
output[0]=0;
unsigned i;
for(i=0;i<len;++i)
{
  char tmp[10]
  sprintf(tmp,"%X",input[i]);
  strcat(output,tmp);
};
ну и т.д.

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 17:07 05-04-2005 | Исправлено: WiseAlex, 17:16 05-04-2005
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
обнаружилось, что в си функция не может возвращать массив, только ссылку на него
 
допустим мне как раз таки надо возвратить ссылку на массив
 
1. каков при этом будет прототип функции?
char * func(void)
или
char func(void)
 
2. в самой функции возврат делать return *ret; или return ret; ???
 
3. допустим мне через printf надо распечатать строку (массив символов) , как это сделать, если аргументом printf является вышеуказанная функция?

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 19:12 06-04-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection

Цитата:
1. каков при этом будет прототип функции?
char * func(void)  

такой  

Цитата:
2. в самой функции возврат делать return *ret; или return ret; ???  

ret

Цитата:
3. допустим мне через printf надо распечатать строку (массив символов) ,

printf("%s",func());
---
следует быть внимательным при возврате указателей - кто-то ведь должен удалять, выделенное под них место.
т.е. этот кусок потенциально опасен
char * func()
{
  char * p= alloc(12);
  strcpy(p,"hello");
 return p;
}

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 20:14 06-04-2005
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Infection

Цитата:
обнаружилось, что в си функция не может возвращать массив, только ссылку на него

В Си ссылок нет; и массив можно вернуть
 

Код:
 
typedef (*Array10)[10];
Array10 MakeArray()
{
    Array10 a = (Array10) malloc(sizeof(*a));
    return (a);
}
 

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 02:31 07-04-2005
begem0t



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
компилятор (сс) говорит что ошибка в 3 строке:  
syntax error before numeric constant
что ему не нравится?

Код:
#include <stdio.h>
#define MAXLINE 1000 /* максимальный размер вводимой строки */
int getline(char line[], int MAXLINE);
void copy(char to[], char from[]);
/*Печать самой длинной строки*/
main()
{
int len;/*длина текущей строки*/
int max;/*длина максимальной из просмотренных строк*/
char line[MAXLINE];/*текущая строка*/
char longest[MAXLINE];/*самая длинная строка*/
max=0;
while((len=getline(line, MAXLINE))>0)
if (len>max){
max=len;
copy(longest, line);
}
if(max>0)/*была ли хоть одна строка?*/
printf("%s", longest);
return 0;
}
/*getline: читаест строку в s, возвращает длину*/
int getline(char s[], int lim)
{
int c, i;
 
for(i=0; i<lim-1 && (c=getchar()) !=EOF && c != '\n'; ++i)
s[i]=c;
 
if (c=='n'){
s[i]=c;
++i;
}
s[i]='\0';
return i;
}
 
/* copy: копирует из 'from' в 'to' */
void copy(char to[], char from[])
{
int i;
while((to[i]=from[i]) != '\0')
++i;
}
 

 
вот скриншот если кому лениво в редактор вставить для проверки синтаксиса
   
 

Всего записей: 901 | Зарегистр. 06-01-2003 | Отправлено: 10:42 05-06-2005 | Исправлено: begem0t, 10:45 05-06-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
begem0t
Правильно, в третьей строке имеем:
 
 int getline(char line[], int MAXLINE);  
 
Тогда как во второй:
 
 #define MAXLINE 1000 /* максимальный размер вводимой строки */  
 
После прохода препроцессора получаем:
 
 int getline(char line[], int 1000);
 
Так и было задумано?
 
На будущее: слово const весьма полезно!
 
И еще: объявление
 
main()
 
по Стандарту не положено. Если хочется, то писать надо
 
int main()

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 18:59 05-06-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
begem0t
10:42 05-06-2005
Цитата:
компилятор (сс) говорит что ошибка в 3 строке:  

Строка 2
Код:
#define MAXLINE 1000 /* максимальный размер вводимой строки */
Строка 3
Код:
int getline(char line[], int MAXLINE);
Идентификатор MAXLINE одновременно и константа и аргумент функции -> ошибка
 
 
Добавлено:
TheChampion
18:59 05-06-2005
Цитата:
И еще: объявление  
 
main()  
 
по Стандарту не положено.

Если читать стандарт внимательнее, выяснится, что функции без определения типа, по умолчанию являются int, следовательно писать main() вполне допустимо.

----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 19:00 05-06-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помощь по СИ


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru