PDA

Просмотр полной версии : Для тех, кто имеет достаточный опыт программирования



capzap
19.09.2013, 05:39
У меня вопрос такой, не могу собраться с мыслями из-за постоянных разъездов, а задумка следущего содержания:
Нужна функция, получающая массив строк разной размерности. Строка вида:
адрес_регистра;тип_данныхСмысл обработки: требуется получить массив структуры, где структура это начальный регистр и количество регистров. Критерий создания следущего индекса массива, это номер следующего регистра больше десяти от предыдущего

Sergey666
19.09.2013, 08:30
Массив структур в КДС2_3 запросто объявляется.
Строки разной длинны + другие типы данных запихиваются в структуру , которая запихивается в массив , только это запихивание должно соответствовать времени изменения данных.
Вроде как-то так.

capzap
19.09.2013, 08:57
Массив структур в КДС2_3 запросто объявляется.
Строки разной длинны + другие типы данных запихиваются в структуру , которая запихивается в массив , только это запихивание должно соответствовать времени изменения данных.
Вроде как-то так.

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

Sergey666
19.09.2013, 09:02
Первоначально вы указали "Строки разной размерности" , а не "количество таких строк может быть разным".
Задание какое-то размытое ... пришлете мне немножко того , что курите.:p

capzap
19.09.2013, 09:07
Там ключевое слово массив строк разной размерности, так что это завязывайте с курением. Строка будет иметь разный размер однозначно, потому что адресация регистров в диапазоне от одного до пяти знакомест может занимать

lara197a
19.09.2013, 09:10
Не очень понял. Структуры в КДС очень хорошо описаны у уважаемого И. Петрова.
Объявляете в разделе "типы данных".
Инициализация- обычная, как любого массива.
Обработка стандартным циклом FOR по условию, с выходом из цикла через Return.

capzap
19.09.2013, 09:19
Ребята, ну Вы чего, почему решили что у меня проблемы с созданием массивов? И простое решение сортировкой и перебором через цикл конечно я держу на заметке, мне хотелось услышать оригинальную идею или оптимизацию решения

lara197a
19.09.2013, 09:22
Не, тогда извините.
Это уже вопрос к математикам

Sergey666
19.09.2013, 09:47
Там ключевое слово массив строк разной размерности, так что это завязывайте с курением. Строка будет иметь разный размер однозначно, потому что адресация регистров в диапазоне от одного до пяти знакомест может занимать

А такое объявление на заметке держите?
Var
Len1 :word;
Len2 :word;
How_math1 :word;
Min_math :word;
Max_math :word;
Array_str :ARRAY(Min_math..MAX_math)of String;
Str1 :STRING(Len1);
Str2 :STRING(Len2);
end_var

Валенок
19.09.2013, 10:06
Список можно организовать.
Кол-во элементов - динамическое. Длина каждого - динамическая. Куча рулит ?

capzap
19.09.2013, 10:29
Ааааа, да я хочу услышать кто как бы поступил, если бы пользователь захотел посмотреть значения с нескольких регистров, например он задал бы 51 ворд, а потом ему захотелось 8 реал и 10 реал, вот появилось три строки, есть несколько путей, по одиночке прочитать требуемые значения, второй вариант прочитать группу из 43 регисров из которых только пять полезных и третий вариант прочитать двумя запросами чеыре регистра и один регистр. Возвращаемся к массиву строк, нужно ПОУ которое преобразует эти строки в массив структур, в каждой из которых будет отражено начальный адрес регистра и количество регистров

Валенок
19.09.2013, 10:45
Так понял что нужно что-то откуда-то как-то извлечь и некоторым образом придать необходимый вид ?
Есть подозрение что нужно типа мастера который динамический на уровне оператора

Валенок
19.09.2013, 11:20
если бы пользователь захотел посмотреть значения с нескольких регистров, например он задал бы 51 ворд, а потом ему захотелось 8 реал и 10 реал, вот появилось три строки

Вот такой кусочек поможет решить часть проблем ?


enum шо_вообще_есть{енто_инт, энто_реал, энто_стринг}
struct незнамо_что {шо_это: шо_вообще_есть; размер:word; указатель: dword}

function анукадайка(оно : незнамо_что):string
var
Pинт : pointer to int;
Pреал: pointer to real;
Pстринг : pointer to string;
begin
Pинт:=Pреал:=Рстринг:=оно.указатель;
case оно.шо_это of
енто_инт: анукадайка := int_to_string(Ринт^);
енто_реал: анукадайка := real_to_string(Рреал^);
енто_стринг: анукадайка := Pстринг^;
еlse
анукадайка := concat('фигня какая-то в ', word_to_string(оно.размер));
анукадайка := concat(анукадайка, ' байт');
end_case
end

Валенок
19.09.2013, 11:30
нужно ПОУ которое преобразует эти строки в массив структур, в каждой из которых будет отражено начальный адрес регистра и количество регистров
Синтаксический разбор строки для вытягивания значений для полей данной структуры ?
А строка вида 'имя1=значение1;имя2=значение2;...' ?

capzap
19.09.2013, 12:18
Создал тему в спк, поэтому не партесь как сформировать строки для отправки в требуемое поу, все будет вводиться с экрана, хотя идея очень даже ни чего

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

Валенок
19.09.2013, 12:30
Один из ключей определяет "шо_это". Кол-во регистров вытекает автоматом.

capzap
19.09.2013, 14:14
так это пример на компьютерных языках, на прямую его в ST не переведешь, тупое решение можно написать, но хотелось бы свежие идеи как еще автоматом разбирать сколько запросов нужно послать на слейв

ЗЫ возможно предложенное решение, если будет конечно, можно будет применить и на ПК, вдруг оно окажется оптимальнее

Валенок
19.09.2013, 14:22
на прямую его в ST не переведешь
Сделал список структур и запустил его и занимаешься своими делами.

lara197a
19.09.2013, 16:44
У меня есть готовая программа, где с панели вводится день месяц год, и обрабатывается структура, выдающая большое количество значений на дисплей,в ответ на запрос.
Там наработка, количество выпущенных изделий, по сменно и на группе оборудования и на каждой машине.
Если нужно, то могу сбросить в личку. Алгоритм примерно такой-же.
Писал где-то года 1-2 назад.
Работает.

capzap
19.09.2013, 18:43
вот мой код на яве
private void toProcess(ArrayList<String> stuff) {
arr = new TreeMap<>();
for (String line : stuff) {
StringTokenizer st = new StringTokenizer(line,";");
int uno = Integer.parseInt(st.nextToken());
String duo = st.nextToken();
TrendUnit tre = new TrendUnit();
tre.setRegis(uno);
StringBuilder sb = new StringBuilder();
sb.append(uno/10000).append(uno/1000).append(uno/100).append(uno/10).append(uno%10);
switch(duo) {
case "Word" :
tre.setType(1);
break;
case "DWord" :
case "Real" :
tre.setType(2);
break;
default:tre.setType(0);
}
sb.append(tre.getType());
if (!arr.containsKey(sb.toString())) {
arr.put(sb.toString(), tre);
}
}
int iter = 0;
int oldRegis = -1;
rrr = new TreeMap<>();
RequestUnit unit = null;
for (Map.Entry<String,TrendUnit> entry : arr.entrySet()) {
if (oldRegis==-1 || (entry.getValue().getRegis()-oldRegis)>10) {
unit = new RequestUnit();
unit.setRef(entry.getValue().getRegis());
rrr.put(iter, unit);
iter++;
}
int buf = (entry.getValue().getRegis()+(entry.getValue().get Type()))-unit.getRef();
unit.setCount(buf);
oldRegis = entry.getValue().getRegis();
}
}
где
TreeMap < String,TrendUnit > arr; и
TreeMap < Integer,RequestUnit > rrrсоответственно
public class TrendUnit {
private int regis,type;
private float value;

public int getRegis() {
return regis;
}

public void setRegis(int regis) {
this.regis = regis;
}

public float getValue() {
return value;
}

public void setValue(float value) {
this.value = value;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return regis+" "+type+" "+value;
}
} и
public class RequestUnit {
private int ref;
private int count;

public int getRef() {
return ref;
}

public void setRef(int ref) {
this.ref = ref;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}
}как бы не знаю, стоит вообще это на ST переводить или вообще от этой идеии отказаться, тут где то промелькнуло от разработчиков, что каким то образом КДС v3 стала поддерживать яву

Дмитрий Артюховский
19.09.2013, 21:09
Не очень понял цель подобного изыска, но исходную задачу покрывает двухмерный массив указателей. Первый индекс - номер регистра, второй индекс - код типа.

lara197a
19.09.2013, 21:29
мой код на ST, в общем должен Вас устроить.
Только поменять переменные.
Ну или как знаете.....

capzap
19.09.2013, 23:14
мой код на ST, в общем должен Вас устроить.
Только поменять переменные.
Ну или как знаете.....

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