LINUX.ORG.RU

Сообщения Ducol

 

one's complement помогите разобраться

Форум — General

Добрый день!

Пожалуйста, помогите разобраться - просмотрела разные материалы

в интернете, но все же приходится вернуться к этой базовой теме,

потому что не понимаю.

Меня интересует как с помощью one's complement положительное

число переводится в отрицательное. Я понимаю, что нужно

флипануть значения, но я не вижу, что результат дает именно

нужное число.

Например, возьмем 4х битовую систему:

7 in decimal переводим в binary, получается 0111;

чтобы сделать -7 с помощью one's complement, флипую

все цифры и получаю 1000. Если первая единица означает

знак, то получается, что это -8, но потом идут нули, как

получается -7? 1001 похоже на -7, хотя это 9, если

unsigned. тоже самое, если взять 5 и -5:

0101 это 5, тогда 1010 должно быть -5, но -8+2 = -6, а

а не -5.

Спасибо!

как получается именно -7?

 

Ducol ()

Hash table, nodes, linked lists

Форум — General

Добрый день!

Изучаю hash tables и linked lists (совсем на начальной стадии изучения С и вообще программирования). Пожалуйста, помогите разобраться

в предложенном на одном из сайтов примере (вот сайт: http://eternallyconfuzzled.com/tuts/datastructures/jsw_tut_hashtable.aspx).

Пожалуйста, посмотрите код и мои вопросы ниже:

struct jsw_node
{
    void *key;
    struct jsw_node *next;
};

struct hash_table
{
    struct jsw_node **table;
    size_t size;
};

int jsw_find(struct hash_table *table, void *key, size_t size)
{
    /* Get an index for the key */
    size_t h = hash(key, size) % table->size;

    if (table->table[h] != EMPTY)
    {
        /* Find the matching key in the chain, if any */
        struct jsw_node *it = table->table[h];

        while (it != NULL)
        {
            if (compare(key, it->key) == 0)
            {
                return 1;
            }

            it = it->next;
        }
    }

    return 0;
} 

struct jsw_node
{
    void *key;
    struct jsw_node *next;
};

struct hash_table
{
    struct jsw_node **table;
    size_t size;
};

Пишу смесь русского с английским, потому что плохо разбираюсь в русских эквивалентах.

1) struct jsw_node

Декларируется структура jsw_node, которая включает некое значение

key. Данный ключ имеет тип void, потому что предполагается, что

key может быть любого типа - integer, character, string.

Почему в данном случае используется указатель, а не значение key,

то есть почему void *key?

Второй элемент структуры jsw_node - указатель на следующую такую же

структуру (это понятно).

2) struct hash_table

Первый элемент данной структуры указатель на указатель на структуру

jsw_node. Второй элемент - размер данной структуры, то есть насколько

я понимаю количество table.

Что означает и почему используется pointer to pointer, то есть

struct jsw_node **table, как данный эелемент соотносится с предыдущей

структурой?

3) Функция jsw_find имеет один из параметров указатель на структуру

hash_table и данный параметр называется table. В базовой программе,

которая есть в начале страницы, на которую я дала ссылку, есть декларация

array table[].

 if (table->table[h] != EMPTY) 

Я не поняла вот эту часть table->table[h]: в структуре hash_table

нет ни одного элемента array, но есть двойной указатель на struct jsw_node.

В struct jsw_node также нет ни одной array. Как тогда table

указывает на элемент table[h]?

Большое спасибо за помощь!

 ,

Ducol ()

Кино

Форум — Talks

Добрый день!

Пожалуйста, посоветуйте хорошие фильмы, которые отражают или

предвещают развитие технологий, как виртуальная реальность, игры,

кибер спорт и прочее. Я помню только красивый фильм «Her».

Спасибо!

Перемещено Licwin из general

 

Ducol ()

крипто блоки

Форум — General

Добрый день!

Изучаю информацию по цепочкам блоков не только для крипто валют (хотя

развитие в этой области тоже хотелось бы знать), но и их использование

для промышленного интернета и интернета вещей.

Браузеры дают много разного, но хотелось бы посоветоваться с вами, профи,

чтобы прочитать стоящие статьи, а не всякую ерунду. Хотя фантастика

тоже интересна.

Спасибо!

 

Ducol ()

Не могу закрыть выскакивающее окно в Mozilla Firefox - видимо что-то нехорошее

Форум — General

Добрый день!

Пожалуйста, помогите решить проблему. Ниже покажу адрес сайта

который постоянно выскакивает (началось сегодня) при открытии

браузера Firefox. Не могу закрыть, закрываю, снова открывается.

Пожалуйста, не пытайтесь открыть у себя - я не знаю, что это, и откуда,

есть шанс, что это что-то нехорошее.

Как закрыть? Хотела удалить браузер и переустановить, но у меня

там важные закладки, а если не удалять папку с закладками, то

смысл теряется, я же не знаю, как глубоко эта штука «залезла».

Моя система Mac OS x 10.7.5

Вот тот самый адрес, который выскакивает

http://creationsoftwaretips.com

Когда грузиться, показывает внизу разные сообщения, например,

transferring data from bid.g.doubleclick.net

Подскажите, пожалуйста, выход.

Спасибо за помощь!

 , ,

Ducol ()

Количество битов на пиксель в bmp

Форум — General

Добрый день!

Я уже задавала вопрос с похожими цифрами, но суть этого вопроса иная.

Есть файл 6кB 32 цвета. Получается, что на один пиксель приходится

5 бит (2^5). Но bmp используется RGB color, то есть в одном пикселе

есть структура (structure) RGB. Как 5 бит распределяются между

тремя элементами RGB? Также получается, что в одном пикселе нет даже

одного байта. Как это происходит технически?

Спасибо!

 

Ducol ()

Изменение цвета пикселей в простой программе по копированию bmp файла

Форум — General

Добрый день!

Пожалуйста, посмотрите программу, которая копирует один bmp файл в другой bmp файл и при этом меняет пиксели, которые были красными на белые; также она должна выполнить еще одну функцию. Программа была написана ребятами, которые преподают курс по компьютерной граммотности в Америке. Я попробовала дописать небольшой кусок кода, который должен был поменять на синий цвет пискелей, в которых красный цвет не равен 0хff (этот кусок я выделю в программе комментарием на русском языке). Однако мой кусок кода меняет все изображение, делая его полностью заполненным бело-синими пикселями, а не только нужные пиксели. Пожалуйста, помогите понять, почему так происходит. Цель: 1) поменять все пиксели со значеним красного цвета 0xff на белые, то есть ffffff; 2) поменять цвет пикселей, в которых красный *не равен* 0xff (например, ffff83) на синий цвет.

/*
* Copies a BMP piece by piece.
 */
       
#include <stdio.h>
#include <stdlib.h>

#include "bmp.h"

int main(int argc, char* argv[])
{
    // ensure proper usage
    if (argc != 3)
    {
        printf("Usage: ./copy infile outfile\n");
        return 1;
    }

    // remember filenames
    char* infile = argv[1];
    char* outfile = argv[2];

    // open input file 
    FILE* inptr = fopen(infile, "r");
    if (inptr == NULL)
    {
        printf("Could not open %s.\n", infile);
        return 2;
    }

    // open output file
    FILE* outptr = fopen(outfile, "w");
    if (outptr == NULL)
    {
        fclose(inptr);
        fprintf(stderr, "Could not create %s.\n", outfile);
        return 3;
    }

    // read infile's BITMAPFILEHEADER
    BITMAPFILEHEADER bf;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);

    // read infile's BITMAPINFOHEADER
    BITMAPINFOHEADER bi;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);

    // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
    if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || 
        bi.biBitCount != 24 || bi.biCompression != 0)
    {
        fclose(outptr);
        fclose(inptr);
        fprintf(stderr, "Unsupported file format.\n");
        return 4;
    }

    // write outfile's BITMAPFILEHEADER
    fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);

    // write outfile's BITMAPINFOHEADER
    fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);

    // determine padding for scanlines
    int padding =  (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

    // iterate over infile's scanlines
    for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
    {
        // iterate over pixels in scanline
        for (int j = 0; j < bi.biWidth; j++)
        {
            // temporary storage
            RGBTRIPLE triple;

            // read RGB triple from infile
            fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
            
            if (triple.rgbtRed == 0xff && triple.rgbtBlue == 0x00 && triple.rgbtGreen == 0x00)
            {
                triple.rgbtBlue = 0xff;
                triple.rgbtGreen = 0xff;
            }
            
            // этот кусок не работает; вместо отдельных пикселей
            заполняет всю картинку
            if (triple.rgbtRed != 0xff)
            {
                triple.rgbtRed = 0x0a;
                triple.rgbtGreen = 0x84;
            }
        
            // write RGB triple to outfile
            fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
        }

        // skip over padding, if any
        fseek(inptr, padding, SEEK_CUR);

        // then add it back (to demonstrate how)
        for (int k = 0; k < padding; k++)
        {
            fputc(0x00, outptr);
        }
    }

    // close infile
    fclose(inptr);

    // close outfile
    fclose(outptr);

    // that's all folks
    return 0;
}

bmp.h

#include <stdint.h>

/**
 * Common Data Types 
 *
 * The data types in this section are essentially aliases for C/C++ 
 * primitive data types.
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/cc230309.aspx.
 * See http://en.wikipedia.org/wiki/Stdint.h for more on stdint.h.
 */
typedef uint8_t  BYTE;
typedef uint32_t DWORD;
typedef int32_t  LONG;
typedef uint16_t WORD;

/**
 * BITMAPFILEHEADER
 *
 * The BITMAPFILEHEADER structure contains information about the type, size,
 * and layout of a file that contains a DIB [device-independent bitmap].
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/dd183374(VS.85).aspx.
 */
typedef struct 
{ 
    WORD   bfType; 
    DWORD  bfSize; 
    WORD   bfReserved1; 
    WORD   bfReserved2; 
    DWORD  bfOffBits; 
} __attribute__((__packed__)) 
BITMAPFILEHEADER; 

/**
 * BITMAPINFOHEADER
 *
 * The BITMAPINFOHEADER structure contains information about the 
 * dimensions and color format of a DIB [device-independent bitmap].
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx.
 */
typedef struct
{
    DWORD  biSize; 
    LONG   biWidth; 
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount; 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} __attribute__((__packed__))
BITMAPINFOHEADER; 

/**
 * RGBTRIPLE
 *
 * This structure describes a color consisting of relative intensities of
 * red, green, and blue.
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/aa922590.aspx.
 */
typedef struct
{
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;

Спасибо большое!

 

Ducol ()

xxd и значение flags

Форум — General

Добрый день!

Простите, пока буду в каждом сообщении писать оговорку про то, что я новичок и вопросы у меня соответствующие. Разбираю файл bmp. Для того, чтобы вывести в Терминале информацию о файле в задании предложено использовать такую команду:

 
xxd -c 24 -g 3 -s 54 file.bmp
Вот результат:
0000036: ffffff ffffff 0000ff 0000ff 0000ff 0000ff ffffff ffffff  ........................
000004e: ffffff 0000ff ffffff ffffff ffffff ffffff 0000ff ffffff  ........................
0000066: 0000ff ffffff 0000ff ffffff ffffff 0000ff ffffff 0000ff  ........................
000007e: 0000ff ffffff ffffff ffffff ffffff ffffff ffffff 0000ff  ........................
0000096: 0000ff ffffff 0000ff ffffff ffffff 0000ff ffffff 0000ff  ........................
00000ae: 0000ff ffffff ffffff 0000ff 0000ff ffffff ffffff 0000ff  ........................
00000c6: ffffff 0000ff ffffff ffffff ffffff ffffff 0000ff ffffff  ........................
00000de: ffffff ffffff 0000ff 0000ff 0000ff 0000ff ffffff ffffff  ........................ 

Я посмотрела значение flags

 http://linuxcommand.org/man_pages/xxd1.html 
но все же не поняла их использование, особенно значение параметров. Например, -c как я понимаю и как обычно используется - это количество «колонок» и параметр 24 видимо означает 24 бита или 3 байта на «группу». Например, ffffff (белый цвет) = 3 по 8 бит. Это верно?

 -g обозначет количество байтов на "группу", то есть -g 3 как
раз означает, что каждая группа имеет 3 байта. Но если я верно 
поняла первый flag -с, то -g получается повторяет информацию.
Ествественно, я не пытаюсь оспорить стандарт (!), а пытаюсь понять
его.
 -s мне не очень понятен. 54 как я понимаю означает первые
54 байта bmp файла (14 + 40 на два headers). Далее сказано, что
без этого -s flag файл начнется с текущей позиции. Это как? 

Спасибо!

 xxd -c 24 -g 3 file.bmp 

 ,

Ducol ()

BMP: базовая технология run length encoding, вопросы

Форум — General

Добрый день!

Пожалуйста, посмотрите цитату. Я не понимаю, как получается результат. Я новичок, поэтому вопросы у меня соотвествующие (пишу эту оговорку пока в каждом сообщении). Сама картинка черно-белой матрицы не отображается, поэтмоу я ее воспроизвожу в RAW формате битов.

1) при ширине 17 пикселей, как получилось 16 байтов на каждую строку? 
в одном пикселе 1 байт (8 битов), тогда 16 байтов
2) не поняла, как из 16 байтов получилось 2 байта. Я вижу
что есть сочетание только 2х цветов, на каждый видимо по 8 бит, да?
3) и совсем не поняла последний результат:
        
        16 0
	16 0
	2 0 12 1 2 0 
The following is a description of the simplest lossless 
compression technique called run length encoding (RLE) that is 
used with good effect for bitmaps with only a few colours.
Consider the following small, 17 x 10 pixel, 8 bit image.
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
        0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
        0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
        0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
        0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
        0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 
If this was to be stored in RAW form it would need 16 bytes per
row for all 10 rows. However the first two rows are all the same
level so it is more efficient to simply save the number of same
colours in a run along with the run colour. The first two rows
instead of needing 16 bytes only need 2 bytes each.

In raw format the first three rows would be

	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
Using run length encoding the first three rows would be
	16 0
	16 0
	2 0 12 1 2 0 

Спасибо!

 

Ducol ()

bit depth и размер имидживых файлов

Форум — General

Добрый день!

Я читаю статью http://www.aivosto.com/vbtips/imageformats.html

В ней приводятся примеры количества цветов и соответствующих размеров файлов. Пожалуйста, помогите разобраться: - правильно ли я понимаю, что если написано 32 цвета, то это именно на один пиксель изображения, то есть 2^5 на один пиксель? - размер файла зависит от количества пикселей или от других параметров? Например, одна из представленных в статье фотографий имеет 32 цвета и размер файла 6 килобайт. Значит ли это что данная фотография содержит 192 пикселя? Как определяется размер в килобайтах данных фотографий?

Спасибо!

 

Ducol ()

Простая программа в С, проблема с while loop и input

Форум — Development

Добрый день!

Пожалуйста, посмотрите небольшую программу. Я новичок, поэтому прошу снисходительности и помощи.

Задание было следующее: предположим, что количество воды, затраченное в течение одной минуты, проведенной под душем, эквивалентно 12 бутылкам воды. Цель программы запросить пользователя ввести количество минут, которые он/она проводит в душе и выдать количество бутылок воды.

Используются допущения: не проверять на положительные - отрицательные числа (правда я знак добавила). Если вводятся числа, то программа выдает количество бутылок. Если вводится слово (например, foo или 123abc), то программа должна снова ожидать ввод данных.

С последним у меня проблема. Если вводится foo или 123abc, то программа выдает 0. То есть с одной стороны, неверные значения не принимаются, но и запрос на новый ввод тоже не происходит. Вот тест:

reject "foo" minutes
   \ expected prompt for input, not exit code of 0 
 rejects "123abc" minutes
   \ expected prompt for input, not exit code of 0
То есть выдает такой результат: foo 0 Пожалуйста, помогите разобраться.
#include <stdio.h>
#include <ctype.h>

#define MAX 5000
#define BOTTLES_PER_MINUTE 12
int minutes[MAX];

void get_minutes(int minutes[]);
int char_to_digit(int minutes[]);

int main(void)
{
    printf("Please, enter the number of minutes\n");
    get_minutes(minutes);
    
    printf("%d\n", (char_to_digit(minutes) * BOTTLES_PER_MINUTE));
    
    return 0;
}
/* get minutes from the user, fill in the array */
void get_minutes(int minutes[])
{
    int i = 0;
    int c;
    
    while (!isspace(c = getchar()))
    {
        if (isalpha(c))
        {
            continue;
        }
        else
        {
            minutes[i] = c;
            i++;
        }
    }
    
    minutes[i] = '\0';
    
}
/*convert input into digits */
int char_to_digit(int minutes[])
{
    int i = 0;
    int n, sign;
    
    sign = (minutes[i] == '-')? -1: 1;
    if (minutes[i] == '-' || minutes[i] == '+')
    {
        i++;
    }
    
    for (n = 0; minutes[i] != '\0'; i++)
    {
        n = 10 * n + (minutes[i] - '0');
    }
    
    return sign * n;
}

Перемещено beastie из general

 , ,

Ducol ()

Двоичный поиск, математика

Форум — General

Добрый день!

Я новичок, поэтому вопросы у меня соответствующие.

Я услышала на одной из онлайн лекций, что согласно алгоритму двоичного поиска (binary search) если, например, есть 4 милларда данных в телефонной книге, то найти нужного человека по имени (например, Kim Smith) можно за 32 шага. Если удвоить количество данных до 8 млрд, то потребуется 33 шага.

Я понимаю алгоритм (делим попалам, затем еще попалам нужные половины пока не надем), но я плохо владею математикой и не понимаю как получаются 32 и 33 шага, и тем более log(n). Пожалуйста, подскажите где можно про это прочитать и изучить (не в Википедии)?

Спасибо!

 

Ducol ()

Программа из K&R вопросы по warnings, полученные от gcc

Форум — General

Добрый день! Моя система: Mac OS X 10.7.5 gcc: 4.2.1 Ниже я добавлю всю программу из K&R, но перед этим хотела бы показать warnings, которые выдает compiler.

warning: pointer type mismatch in conditional expression warning: ISO C forbids conversion of object pointer to function pointer type

Оба предупреждения выданы в отношении одной строки:

 quicksort((void **) lineptr, 0, nlines - 1,
                  (int (*) (void *, void *)) (numeric ? numcmp : strcmp)); 

Что означают эти предупреждения и почему они возникают и как исправить?

Вся программа:

 /* Program to sort a set of text lines into alphabetic order */
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
 
#define MAXLINES 5000 /* max #lines to be sorted */
 
char *lineptr[MAXLINES]; /* pointers to text lines */
 
int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void quicksort(void *v[], int left, int right,
               int (*comp) (void *, void *));
int numcmp(char *, char *);
 
int main(int argc, char *argv[])
{
    int nlines; /* number of input lines read */
    int numeric = 0;
     
    if (argc > 1 && strcmp(argv[1], "-n") == 0)
    {
        numeric = 1;
    }
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0)
    {
        printf("\n");
        quicksort((void **) lineptr, 0, nlines - 1,
                  (int (*) (void *, void *)) (numeric ? numcmp : strcmp));
 /* the above call to quicksort causes gcc to produce warnings */
    
        writelines(lineptr, nlines);
        printf("%i\n", nlines);
        return 0;
    }
    else
    {
        printf("error: input too big to sort\n");
        return 1;
    }
}
 
#define MAXLEN 1000 /* max length of any input line */
int get_line (char *, int);
char *alloc(int);
 
/* readlines: read input lines */
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];
    nlines = 0;
     
    while ((len = get_line(line, MAXLEN)) > 0)
    {
        if (nlines >= maxlines || (p = alloc(len)) == NULL)
        {
            return -1;
        }
        else
        {
            line[len - 1] = '\0'; /* delete newline */
            strcpy(p, line);
            lineptr[nlines++] = p;
        }
    }
    return nlines;
}
 
/* writelines: write output lines */
void writelines(char *lineptr[], int nlines)
{
    int i;
     
    for (i = 0; i < nlines; i++)
    {
        printf("%s\n", lineptr[i]);
    }
}
 
/* getline: read a line into s, return length */
 
int get_line (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;
}
 
#define ALLOCSIZE 10000 /* size of a varibale space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf;
 
char *alloc(int n) /* return pointer to n characters */
{
    if (allocbuf + ALLOCSIZE - allocp >= n) /* it fits */
    {
        allocp += n;
        return allocp - n; /* previous value of p */
    }
    else   /* not enough room */
        return 0;
}
 
void afree(char *p) /* free storage pointed to by p */
{
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
        allocp = p;
}
 
/*numcmp: compare s1 and s2 numerically */
int numcmp(char *s1, char *s2)
{
    double v1, v2;
     
    v1 = atof(s1);
    v2 = atof(s2);
    if (v1 < v2)
        return -1;
    else if (v1 > v2)
        return 1;
    else
        return 0;
}
 
/* sort v[left] .... v[right] into increasing order */
void quicksort(void *v[], int left, int right,
           int (*comp)(void *, void *))
{
    int i, last;
    void swap(void *v[], int i, int j);
     
    if (left >= right) /* do nothing if array contains */
        return;        /* fewer than two elements; left and right are indeces */
     
    swap(v, left, (left + right)/2); /* move partition elem to v[O]*/
     
    last = left;
     
    for (i = left+1; i <= right; i++) /* partition */
        if ((*comp)(v[i], v[left]) < 0)
            swap(v, ++last, i);
     
    swap(v, left, last); /* restore partition elem */
    quicksort(v, left, last-1, comp);
    quicksort(v, last+1, right, comp);
}
 
void swap (void *v[], int i, int j)
{
    void *temp;
     
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
} 

Спасибо!

 , ,

Ducol ()

Вопросы по коду из K&R readlines() strcpy(p, line)

Форум — General

Добрый день!

Я новичок, поэтому буду благодарна за помощь и терпение - я совершенно не знаю терминологию на русском, поскольку изучаю все на английском. Могу только догадываться как может тот или иной термин звучать на русском на основе смысла того или иного слова.

Пожалуйста, помотрите функцию readlines из K&R, страница 109. Я не очень поняла strcpy(p, line). Пожалуйста, исправьте и дополните мои рассуждения:

Предположим input string «Hello world».

- до того как вызвана функция strcpy(p, line), функция readlines() вызывала ( called) фукцию getline(), которая вернула значение переменной i, равное 11. - readlines() путем line[len - 1] убрала newline character '\n', и в итоге line[10] = '\0'; пока все просто и понятно; - дальше readlines() вызывает strcpy(p, line): - правильно я понимаю, что поскольку line заявлена как character array, то когда была вызвана функция getline(line, MAXLEN), то line в данном случае была pointer и в результате array line в фукции realines получила значения «Hello world»; поэтому когда вызывается strcpy(p, line), то line[] = «Hello world», и именно это значение должно быть скопировано в p? Верно ли это?

- также я хотела бы уточнить: p - pointer, то есть получается что strcpy копирует адреса каждой буквы из line в p? или какой именно процесс происходит? Вот сама функция (и плюс ниже getline()):

/* readlines: read input lines */
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];
    nlines = 0;
    
    while ((len = get_line(line, MAXLEN)) > 0)
    {
        if (nlines >= maxlines || (p = alloc(len)) == NULL)
        {
            return -1;
        }
        else
        {
            line[len - 1] = '\0'; /* delete newline */
            strcpy(p, line);
            lineptr[nlines++] = p;
        }
    }
    return nlines;
}
/* getline: read a line into s, return length */

int get_line (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;
}

Большое спасибо!

 , ,

Ducol ()

RSS подписка на новые темы