LINUX.ORG.RU

0
Всего сообщений: 57

Как работает read -a и readarray?

Нужно прочитать выхлоп и занести его в массив. Разделитель - новая строка. Пример

dig +noall +short yandex.ru
77.88.55.55
77.88.55.50
5.255.255.80
5.255.255.88

dig +noall +short yandex.ru | readarray arr1
echo ${arr1[@]}
пустота

Тоже самое с read -a, тоже самое с readarray -d '\n', тоже самое с

dig +noall +short yandex.ru | while read -r i; do arr1+=( $i ); done

Судя по всему, дело не в сепараторе элементов (IFS=$‘\n’ не помогает). Как занести все в массив?

 , ,

Entmatix ()

Массивы в awk

Люди добрые, помогите. Являюсь новичком, сейчас изучаю awk. Не могу разобраться со след проблемой. Имеется текст c 5 строками:

2 second row
5 fifth row
3 third row
1 first row
4 fourth row

Идея след:
Нужно создать скрипт, который отсортирует строки по их порядковым номерам тем самым формируя массив, индексами которых будут номера строк. После, напечатать строки в порядке их номеров. Буду благодарен за ответ.

 , ,

Orzu1998 ()

Изменение адреса массива структур после выхода из функции

Добрый день! После помещения адреса массива структур в функцию и изменения некоторых полей, адрес массива изменяется. Я не так давно начал учиться, и не первый раз сталкиваюсь с этой проблемой, перерыл много ресурсов и никак не могу найти ответ: почему???))

Есть файл struct_list.h, в котором нечто подобное:

struct tegTODO_STRUCT
{
char task[100];
char date[15];
};
typedef struct tegTODO_STRUCT TODO;

В main.c я инициализирую массив структур:

...
TODO todo_list[100];

Далее идёт функция (вынесенная в отдельный файл operations.c, объявляется в operations.h): В main’е:

...
add_task(todo_list, ...);
...

Файл operations.h:

...
void add_task(TODO* todo_list, ...);
...

В самой функции я добавляю значения в одну структуру массива todo_list:

void add_task(TODO* todo_list, ...)
{
...
sscanf(task, "%[^\n]%*c", todo_list[i].task);
sscanf(task, "%s", todo_list[i].date);
}

После чего начинаются интересные и непонятные мне вещи. Причём код в одном файле работал, проблемы начались после экспериментов (хочу научиться на маленьких задачах делать большие проекты) с разнесением кода по разным файлам. Программа компилируется, запускается до места следующего использования данной структуры, дальше Segmentation falt. Выяснил, что внутри функции всё работает, данные в структуру записываются (выводил всё через printf в консоль). Веселье начинается на выходе из функции, при возвращении в main. Выводил адреса массива структур todo_list: в main’е до функции, внeтри функции до самого конца адрес массива один, а сразу после функции печатаю тот же адрес массива -, а он другой.. Соответственно, отсюда и Segmentation falt: адреса то нет такого. Объясните, пожалуйста, знающие люди, в чём загвоздка, и чего я не понимаю. Везде, где печатал адрес, строка:

printf("%d", todo_list);

Заранее спасибо!!!

 , , , ,

konsin1988 ()

Как сделать размерность матрицы вводом с клавиатуры

Есть задание, помогите разобраться. Собственно, вопрос в том, как сделать мерность массива (тобиш размерность матрицы) вводом с клавиатуры? Остальное +- понял как прикрутить. https://ibb.co/qsRdX8Q

 , ,

PURGEN143 ()

Bash заполнение массива

Необходимо пройтись по всем элементам массива ${MAIN[@]}, и занести результат переменной serial в новый массив INFO_ARRAY.

INFO_ARRAY=()
for i in ${MAIN[@]}
do
  serial=$(echo $i | sed -r "s/\s.*//g")
  INFO_ARRAY[n]+=$serial
done
clear
echo ${INFO_ARRAY[@]}
Просьба подсказать как правильно заполнить массив INFO_ARRAY в цикле

 ,

vesta ()

параллельное перемешивание массива

Например, есть массив xs[N] и M тредов, M<N в среднем. Нужно случайно перемешать элементы массива как можно более быстрым способом. При этом, «качество» рандомизации не играет роли, скорее нужно что бы в среднем, каждый элемент массива побывал в каждой позиции. Как это правильно называется на английском языке, и какими алгоритмами реализуется?

 , ,

thunar ()

Простите бога ради ``\/^.^\/``

Но что-то я туплю конкретно.

Есть к примеру такая сетка 8x8

 _0_1_2_3_4_5_6_7                         _0__1__2__3__4__5__6__7
0|0 0 0 0 0 0 0 0                        0|0  1  2  3  4  5  6  7
1|0 0 0 0 0 0 0 0                        1|8  9  10 11 12 13 14 15
2|0 0 0 0 0 0 0 0 (с вот таким порядком) 2|16 17 18 19 20 21 22 23
3|0 0 0 0 0 x 0 0 ---------------------> 3|24 25 26 27 28 x  30 31 
4|0 0 0 0 0 0 0 0                        4|32 33 34 35 36 37 38 39
5|0 0 0 0 0 0 0 0                        5|40 41 42 43 44 45 46 47
6|0 0 0 0 0 0 0 0                        6|48 49 50 51 52 53 54 55
7|0 0 0 0 0 0 0 0                        7|56 57 58 59 60 61 62 63 

Тут позиция по ординатам x = 3x5, номер x = 29

Как быстро преобразовывать позицию x в координату x:y и обратно, без циклов.

Ну например ячейка 43 вычисляем 5x3, есть позиция 5x3 вычисляем 43.

Реальная сетка у меня 255x255 то есть 65536 позиций. Так что switch() не прокатит.

Я вот прям чёт не догоняю и меня переклинило уже, аж прям бесит и ощущение что я придурок =(


UDP: >>>>>> Решено

UDP:2 >>>> Фикс косяка

 , , , ,

LINUX-ORG-RU ()

Массив в классе и странности

Всем привет. Давно не писал на C++, захотелось вспомнить этот язык. Накатал следующий класс.

plane.hpp

class Plane
{
    public:
        Plane(int planetype);
        float *bodyx;
};

plane.cpp

#include "plane.hpp"
float bx[][6] = {{0, -5, -6, 0, 6, 5}, {1, 1, 1}};

Plane::Plane(int planetype)
{
    cout << sizeof(bx[planetype]) << " " << sizeof(bx[planetype][0]) << " " << sizeof(bx[planetype]) / sizeof(bx[planetype][0]) << endl;
    for(unsigned int k=0; k<sizeof(bx[planetype])/sizeof(bx[planetype][0]); k++)
    {
        bodyx[k] = bx[planetype][k];
        cout << bodyx[k] << " ";
    }
    cout << endl;
}

main.cpp

#include "plane.hpp"
int main(int argc, char* args[])
{
    Plane* player = new Plane(0);
    cout << sizeof(player->bodyx) << " " <<  sizeof(player->bodyx[0]) << " " << sizeof(player->bodyx) / sizeof(player->bodyx[0]) << endl;
    for(unsigned int k=0; k<sizeof(player->bodyx)/sizeof(player->bodyx[0]); k++)
    {
        cout << player->bodyx[k] << " ";
    }
    cout << endl;
}

Вывод:

24 4 6
0 -5 -6 0 6 5 
8 4 2
0 -5 
Ошибка сегментирования (стек памяти сброшен на диск)

То есть в конструкторе в массив благополучно перешли все 6 значений. А куда же по дороге делись 4 из них и что я делаю не так?

 , ,

al_exquemelin ()

Как в Laravel получить из таблицы-справочника массив вида id=>name ?

Есть таблица, у которой есть поля id и name, ее содержимое, например, такое:

id name
1 name1
5 name5
7 name7


Есть ли какой-нибудь метод, чтобы одним махом получить ассоциативный массив вида:

[ 1=>'name1', 5=>'name5', 7=>'name7' ]


?

 , , , ,

Xintrea ()

Отличия понятий «список» и «массив»?

Допустим, если взять список в Python. Он может хранить значения разных типов, он динамический, у него есть свои методы. По сути список в Python = массив в JS

 ,

KRex ()

Изменение размера массива по указателю

Необходимо динамически изменять размер массива, помогите исправить код, ошибка скорее всего в неправильном обращении к realloc, пишет на несовместимый тип первого аргумента realloc.

struct str
{
	 int **a;
};

void changeSize (struct str * ps);

int main()
{
        struct str s;
        s.a = (int*)malloc(1);
        changeSize (&s);
        return 0;
}

void changeSize (struct str * ps)
{
        ps->a=(int*)realloc(ps->a, 2);
}

 , , ,

vodozheg ()

error: invalid array assignment

int main() {
  int a[10], b[10];
  a = b;
}

https://ideone.com/BdUzkI

prog.cpp: In function ‘int main()’:
prog.cpp:3:7: error: invalid array assignment
   a = b;
       ^

Почему компилятор выдаёт эту ошибку? Стандарт говорит:

http://eel.is/c++draft/expr.ass#1

The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand;

Может, тут не modifiable lvalue? Да вроде нет:

http://eel.is/c++draft/basic.lval#def:modifiable

An lvalue is modifiable unless its type is const-qualified or is a function type.

Так в чём проблема? Почему компилятор выдаёт ошибку, а не делает то, что велит стандарт:

http://eel.is/c++draft/expr.ass#2

In simple assignment (=), the value of the expression replaces that of the object referred to by the left operand.

 ,

sostupid ()

Разбить массив, на слова python

Например вот:

a = input()
d = a.split()
Вывод массива d:
['привет','дела']
И мне нужно эти слова разбить на отдельные переменные, причем кол-во слов может быть больше или меньше.

 ,

IndiGuy ()

Работа с массивом на СИ

Здравствуйте.

Суть вот в чём: мне нужно проверить наличие подстроки (она всегда в самом начале строки) в строке, и всё что идёт после этой подстроки записать в другой массив.

Допустим делаю так:

char *restr;
char str[32] = {0,};
char res_mas[16] = {0,};
...

if((restr = strstr(str, "xa-xa")) != NULL) 
 {
   strcpy(res_mas, restr + 5);
...

То есть я сдвигаю указатель на длину подстроки и оставшееся копирую в конечный массив.

Вопрос заключается в том, могу ли я сделать так?

char str[32] = {0,};
char res_mas[16] = {0,};
...

if(strstr(str, "xa-xa") != NULL) 
 {
   strcpy(res_mas, str + 5);
...

В обоих случаях всё работает, но правильно ли так делать?

(только не пишите пожалуйста, что лучше использовать strncpy или memcpy, речь не об этом, strcpy нарисована в качестве примера)

...

И ещё «подвопрос»: если я использую несколько конструкций «if()» подряд...

char *restr;
char str[32] = {0,};
char res_mas[16] = {0,};
char res_mas2[16] = {0,};
char res_mas3[16] = {0,};
...

if((restr = strstr(str, "xa-xa")) != NULL) 
 {
   strcpy(res_mas, restr + 5);
 }

if((restr = strstr(str, "xo-xo")) != NULL) 
 {
   strcpy(res_mas2, restr + 5);
 }

if((restr = strstr(str, "xy-xy")) != NULL) 
 {
   strcpy(res_mas3, restr + 5);
 }

...то нужно ли после каждого блока if() «обнулять» указатель *restr? И если да, то как это делать правильно?

Заранее спасибо.

 ,

stD ()

perl добавить элементы в массив, cоздать массив...

Суть проблемы, к примеру такой код:

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
local @ARGV = ('1.txt', '2.txt');
while (<>) 
{
    if (/YES/i)
    {
    	my @List = ();
    	
    	push (@List, $ARGV);
    	#print "$ARGV\n" ;
    	say Dumper \@List
    }
} 
continue 
{
   	close ARGV if eof;
}
на выходе получается вот такое:
$VAR1 = [
          '1.txt'
        ];

$VAR1 = [
          '2.txt'
        ];
а хочется вот такое:
$VAR1 = [
          '1.txt'
          '2.txt'
        ];

 ,

ving2 ()

Пользователь сайта и запросы в базу данных

Уважаемые форумчане! Требуется ваша помощь!

Подскажите, как правильно?

вариант 1)

  • Пользователь заходит на сайт.
  • Заходит на определённую страницу сайта.
  • Делаем запрос в базу данных, можно ли ему эту страницу видеть.
  • И так про каждую страницу на которую он заходит.

вариант 2)

  • Пользователь заходит на сайт.
  • Делаем запрос в базу данных, какие вообще страницы ему можно видеть, сохраняем массив в переменную сессии.
  • Пользователь заходит на определённую страницу сайта.
  • Сверяем каждый раз с массивом разрешённых страниц

В первом варианте минус - куча запросов в базу данных, во втором - теоретически огромный массив

В принципе я думаю что первый вариант лучше, но есть сомнения, поэтому решил спросить

 , ,

tonchikp ()

Как обратиться к элементу многомерного массива по ключу, который находится в другом линейном массиве?

Есть многомерный ассоциативный массив. Надо обратиться к элементу массива по ключу, который записан в другом линейном массиве.

То есть, имеется многомерный массив данных и линейный массив с ключем:

$a=[
  'animals'=> [
    'cats' => [
      'catusdomesticus' => 'home',
      'pantera' => 'wild'
    ]
  ]
];

$keys=['animals', 'cats', 'pantera'];
Нужно сделать две вещи:

1. (простое) Получить значение $a['animals']['cats']['pantera']
2. (сложное) Удалить элемент $a['animals']['cats']['pantera']

Есть ли какой-либо быстрый (встроеный) в PHP5 способ такое сделать, или нужно городить собственный код?

Хотелось бы обойтись без кодогенерации и eval().

 , , ,

Xintrea ()

Очистка памяти после создания двумерного «непрерывного в памяти» массива

«Я познаю мир», это главный тэг этой записи.

Допустим, хочется в C99 (в С++ такой способ тоже сработает) хочется создать двумерный массив в «непрерывной!» области памяти, чтобы в дальнейшем обращаться к его элементам как a[i][j]:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n = 12;

double (*a)[n] = (double (*)[n])malloc(n * n *  sizeof(double))

a[11][0] = 40.0;
printf("a[11][0] = %4.2f\n", a[11][0]);
// выход за границу массива с заползанием в следующий блок:
a[10][12] = 50.0;
printf("a[11][0] = %4.2f\n", a[11][0]);
printf("a[10][12] = %4.2f\n", a[10][12]);

return 0;
}

Подскажите, кто-нибудь, пожалуйста, как при помощи free() очистить память выделенного таким образом массива?

P.S. Казалось бы, что при создании подобного массива можно было бы описать его так:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n = 12;

// при присваивании, не выходя за границу массива, можно перезаписывать другие элементы:
double (*b)[1] = (double (*)[1])malloc (n * n * sizeof(double));
b[11][0] = 40.0;
printf("\nb[11][0] = %4.2f\n", b[11][0]);
// перезаписывает значение b[11][0]:
b[5][6] = 50.0;
printf("b[11][0] = %4.2f\n", b[11][0]);
printf("b[5][6] = %4.2f\n", b[5][6]);

return 0;
}

 , , , ,

grem ()

Массив с аргуметами, кроме последнего

Как из "$@" получить массив или список аргументов, содержащий список всех аргументов, кроме последнего?

Т.е. из 1 2 3 4 получить 1 2 3

 ,

teod0r ()

bash - syntax error invalid arithmetic operator error token is

Приветствую! Ребята подскажите где я не догоняю?

Нужно выполнить проверку значений с первого массива во втором.

state_ip=(172.20.0.3/24 192.168.168.1/24 192.168.195.1/24 192.168.199.1/24)
current_ifip=(172.20.0.3/24 192.168.168.1/24 192.168.195.1/24 192.168.199.1/24)

for arr in ${current_ifip[@]}; do
 if [[ ${state_ip[$arr]} ]]; then
  echo "$arr есть на интерфейсе"
 else
  echo "$arr нет на интерфейсе"
 fi
done
А он вываливается с такой ошибкой
syntax error: invalid arithmetic operator (error token is ".20.0.3/24")
Хочет произвести арифметику. Хотя я по-разному пробовал экранировать и брать в кавычки $arr. Подскажите как правильно выполнить сверку?

 ,

fet4 ()