Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.08.2014, 00:07
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
Восклицание Помогите, прошу

Ребят, прошу помощи
Был код, решил немного его подкорректировать (заменил стринг грид на обычный двумерный массив и что-то еще) и забить все в функцию


БЫЛО (РАБОТАЛО)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
VS, US, i, j, k, n, id : integer;
MTX_XY : arr;
sr_kv_otkl : real;
 
begin
 
    n:=StringGrid1.RowCount;
 
//объявляем размер матрицы (всегда один и тот же для любой ОФ от 3 переменных)
 
    SetLength(MTX_XY, 8, n);
 
//Считываем данные из таблицы (столбцы X1,X2,Y)
    for i := 0 to 2 do
        for j := 0 to (n-1) do
            MTX_XY[i,j]:=StrtoFloat(StringGrid1.Cells[i, j]);
 
//добавляем остальные необхиодимые данные в матрицу
// 0 столбец - x1, 1 столбец - x2, 2 столбец - y,3 столбец - x1x1, 4 столбец - x1x2, 5 столбец - x2x2,
// 6 столбец - yx1, 7 столбец - yx2
 
//переписать в более красивом виде
    for i := 3 to 7 do
        for j := 0 to n-1 do
        begin
            if i=3 then
                MTX_XY[i,j]:=MTX_XY[0,j]*MTX_XY[0,j];
            if i=4 then
                MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[0,j];
            if i=5 then
                MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[1,j];
            if i=6 then
                MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[0,j];
            if i=7 then
                MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[1,j];
        end;
 
//Из имеющихся данных составляем новую таблицу для решения СЛАУ
 
        StringGrid2.Cells[0, 0]:=FloatToStr(n);
        StringGrid2.Cells[1, 0]:=FloatToStr(Sum_stolb(MTX_XY,0,n));
        StringGrid2.Cells[2, 0]:=FloatToStr(Sum_stolb(MTX_XY,1,n));
        StringGrid2.Cells[3, 0]:=FloatToStr(Sum_stolb(MTX_XY,2,n));
        StringGrid2.Cells[0, 1]:=StringGrid2.Cells[1, 0];
        StringGrid2.Cells[1, 1]:=FloatToStr(Sum_stolb(MTX_XY,3,n));
        StringGrid2.Cells[2, 1]:=FloatToStr(Sum_stolb(MTX_XY,4,n));
        StringGrid2.Cells[3, 1]:=FloatToStr(Sum_stolb(MTX_XY,6,n));
        StringGrid2.Cells[0, 2]:=StringGrid2.Cells[2, 0];
        StringGrid2.Cells[1, 2]:=StringGrid2.Cells[2, 1];
        StringGrid2.Cells[2, 2]:=FloatToStr(Sum_stolb(MTX_XY,5,n));
        StringGrid2.Cells[3, 2]:=FloatToStr(Sum_stolb(MTX_XY,7,n));
 
//Решаем СЛАУ (3строки, 3 неизвестных)
//переписать
 
VS:= 0; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
US:= 1; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
// цикл который выберает следующую вычетаемую строку и повторяет расчет
    for i := 0 to 1 do
     begin
         VS := i; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
// приводим строку которую вычетаем к подходящему виду (должна начинаться с 1)
            for Id := 3 downto 0 do
             begin
                if StrToFloat(StringGrid2.Cells[VS,VS]) = 0 then Break;
                StringGrid2.Cells[Id, VS] :=FloatToStr(StrToFloat(StringGrid2.Cells[Id, VS]) /StrToFloat(StringGrid2.Cells[VS, VS]));
             end;
// цикл который переходит от строки к строке для вычитания начиная снизу
            for j := 2 downto VS + 1 do
             begin
// цикл который вычитает из строки строку по ячейкам справа налево
                US := j; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
                    for k := 3 downto 0 do
                     begin
                        StringGrid2.Cells[k, US] := FloatToStr(StrToFloat(StringGrid2.Cells[k, US]) - (StrToFloat(StringGrid2.Cells[k, VS]) * StrToFloat(StringGrid2.Cells[VS, US])));
                     end;
             end;
     end;
// приводим последнюю строку к подходящему виду (должна начинаеться с 1)
    VS := 2; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    for id := 3 downto 2 do
     begin
        if StrToFloat(StringGrid2.Cells[VS, VS]) = 0 then Break;
        StringGrid2.Cells[Id, VS] :=FloatToStr(StrToFloat(StringGrid2.Cells[Id, VS]) /StrToFloat(StringGrid2.Cells[VS, VS]));
     end;
 
// находим a2 и выводим на форму
Edit3.Text := StringGrid2.Cells[3, 2];
// находим a1 и выводим на форму
Edit2.Text := FloatToStr(StrToFloat(StringGrid2.Cells[3, 1]) -
(StrToFloat(Edit3.Text) * StrToFloat(StringGrid2.Cells[2, 1])));
// находим a0 и выводим на форму
Edit1.Text := FloatToStr(StrToFloat(StringGrid2.Cells[3, 0]) -
(StrToFloat(Edit3.Text) * StrToFloat(StringGrid2.Cells[2, 0])) -
(StrToFloat(Edit2.Text) * StrToFloat(StringGrid2.Cells[1, 0])));
 
/////////////////////////////////////////////////////////////////////
 
//выведем в таблицу полученные значения с помощью ОФ
 
for j := 0 to n-1 do
StringGrid1.Cells[3,j]:=FloatToStr(StrToFloat(Edit1.Text)
+ StrToFloat(Edit2.Text)* StrToFloat(StringGrid1.Cells[0,j])
+ StrToFloat(Edit3.Text)* StrToFloat(StringGrid1.Cells[1,j]));
 
//Подсчитаем и выведем среднеквадратическое отклонение
sr_kv_otkl:=0;
for j := 0 to n-1 do
sr_kv_otkl:=sqr(StrToFloat(StringGrid1.Cells[2,j])-StrToFloat(StringGrid1.Cells[3,j]))+sr_kv_otkl;
 
Edit4.Text:=FloatToStr(sr_kv_otkl);
//
СТАЛО (КОМПИЛИРУЕТСЯ, НО НЕ РАБОТАЕТ (ОШИБКА is not valid floating point value
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
procedure TForm1.Button1Click(Sender: TObject);
 
 
//2 типа для функций
   type array5 = array[0..5] of real;
   type arr = array of array of real;
 
 
//Функция, считающая сумму эллементов в заданном столбце
function Sum_stolb(mas : arr; stolbez, n_kon_mas : integer):real;
   var
     sum:real;
     i:integer;
   begin
     sum:=0;
     for i := 0 to n_kon_mas-1 do
       Sum:=sum+mas[stolbez,i];
     sum_stolb:=sum;
   end;//  Sum_stolb
 
 
 
//МЕТОД НАИМЕНЬШИХ КВАДРАТОВ ДЛЯ ФУНКЦИИ а0+а1*х_i+а2*х_j
function MNK(stolb1,stolb2:integer):array5;
  var
      VS, US, i, j, k, n, id : integer;
      MTX_XY, SLAU : arr;
      a0, a1, a2, sr_kv_otkl : real;
 begin
 
    n:=StringGrid1.RowCount;
 
//объявляем размер матрицы (всегда один и тот же для любой ОФ от 3 переменных)
//столбец - x_i, 1 столбец - x_j, 2 столбец - y, 3 столбец - x_i*x_i, 4 столбец - x_i*x_j
// 5 столбец - x_j*x_j, 6 столбец - y*x_i, 7 столбец - y*x_j, 8 столбец - Y по модели
 
    SetLength(MTX_XY, 9, n);
 
//объявляем размер матрицы для получения коэф а0,а1,а2
    SetLength(SLAU, 4, 3);
 
 
//Считываем данные из таблицы (столбцы STOLB1,STOLB2,Y)
 
  for j := 0 to n-1 do
    begin
      {stolb1}MTX_XY[0,j]:=StrtoFloat(StringGrid1.Cells[Stolb1, j]);
      {stolb2}MTX_XY[1,j]:=StrtoFloat(StringGrid1.Cells[Stolb2, j]);
           {y}MTX_XY[2,j]:=StrtoFloat(StringGrid1.Cells[n-2, j]);
    end;
 
//добавляем остальные необхиодимые данные в матрицу
 
  for i := 3 to 7 do
    for j := 0 to n-1 do
      begin
        if i=3 then
          MTX_XY[i,j]:=MTX_XY[0,j]*MTX_XY[0,j];
        if i=4 then
          MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[0,j];
        if i=5 then
          MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[1,j];
        if i=6 then
          MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[0,j];
        if i=7 then
          MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[1,j];
      end;
 
//Из имеющихся данных составляем новую таблицу для решения СЛАУ
    SLAU[0, 0]:=n;
    SLAU[1, 0]:=Sum_stolb(MTX_XY,0,n);
    SLAU[2, 0]:=Sum_stolb(MTX_XY,1,n);
    SLAU[3, 0]:=Sum_stolb(MTX_XY,2,n);
    SLAU[0, 1]:=SLAU[1, 0];
    SLAU[1, 1]:=Sum_stolb(MTX_XY,3,n);
    SLAU[2, 1]:=Sum_stolb(MTX_XY,4,n);
    SLAU[3, 1]:=Sum_stolb(MTX_XY,6,n);
    SLAU[0, 2]:=SLAU[2, 0];
    SLAU[1, 2]:=SLAU[2, 1];
    SLAU[2, 2]:=Sum_stolb(MTX_XY,5,n);
    SLAU[3, 2]:=Sum_stolb(MTX_XY,7,n);
 
 
 
 
//Решаем СЛАУ (3строки, 3 неизвестных)
//переписать
 
  VS:= 0; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
  US:= 1; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
// цикл который выберает следующую вычетаемую строку и повторяет расчет
  for i := 0 to 1 do
  begin
    VS := i; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    // приводим строку которую вычетаем к подходящему виду (должна начинаться с 1)
    for Id := 3 downto 0 do
    begin
      if SLAU[VS, VS] = 0 then Break;
        SLAU[Id, VS] := (SLAU[Id, VS] / SLAU[VS, VS]);
    end;
// цикл который переходит от строки к строке для вычитания начиная снизу
    for j := 2 downto VS + 1 do
      begin
// цикл который вычитает из строки строку по ячейкам справа налево
      US := j; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
        for k := 3 downto 0 do
          begin
            SLAU[k, US] := (SLAU[k, US] - (SLAU[k, VS] * SLAU[VS, US]));
          end;
      end;
  end;
// приводим последнюю строку к подходящему виду (должна начинаеться с 1)
  VS := 2; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    for id := 3 downto 2 do
      begin
        if SLAU[VS, VS] = 0 then Break;
          SLAU[Id, VS] := (SLAU[Id, VS] / SLAU[VS, VS]);
      end;
 
//СИСТЕМА ПРИВЕДЕНА К ТРЕУГОЛЬНОМУ ВИДУ
//ИЩЕМ И ЗАПОМИНАЕМ РЕШЕНИЕ а0,а1,а2
 
        a1 := SLAU[3, 2];
        a2 := SLAU[3, 1] - (a2 * SLAU[2, 1]);
        a0 := SLAU[3, 0] - (a2 * SLAU[2, 0]) - (a1 * SLAU[1, 0]);
 
 
 
//Заполняем 8 столбец (у по модели) в матрице МТХ_ХУ для поиска значения ошибки
 
 
    for j := 0 to n-1 do
      MTX_XY[8,j]:=a0+a1*MTX_XY[0,j]+a2*MTX_XY[1,j];
 
 
//Считаем среднеквадратическое отклонение
 
 
   sr_kv_otkl:=0;
   for j := 0 to n-1 do
     sr_kv_otkl:=sqr({y}MTX_XY[2,j]-{y по модели}MTX_XY[8,j])+sr_kv_otkl;
 
 
//Записываем все полученные данные в массив MNK
//a0,a1,a2,stolb1,stolb2,sr_kv_otkl
 
    MNK[0]:=a0;
    MNK[1]:=a1;
    MNK[2]:=a2;
    MNK[3]:=stolb1;
    MNK[4]:=stolb2;
    MNK[5]:=sr_kv_otkl;
 end;
 
 
 
var
 i,j:integer;
 itog:array5;
begin
 
    itog:=MNK(0,1);
    Edit1.Text:=FloatToStr(itog[0]);
    Edit2.Text:=FloatToStr(itog[1]);
    Edit3.Text:=FloatToStr(itog[2]);
    Edit4.Text:=FloatToStr(itog[5]);
Ответить с цитированием
  #2  
Старый 11.08.2014, 00:45
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Клавишу F7 не отменили, прошагай и узнаешь где ошибка. И привыкай к Дельфи. Результирующие результаты удобнее писать Result := "что-то-там", а не, к примеру, sum_stolb := sum. В итоге, первая функция перепишется так:
Код:
1
2
3
4
5
6
7
8
9
//  Функция, считающая сумму эллементов в заданном столбце
function Sum_stolb(mas : arr; stolbez, n_kon_mas : Integer) : Real;
var
  I : Integer;   
begin
  Result := 0;     
  for I := 0 to n_kon_mas - 1 do 
     Result := Result + mas[stolbez, I];
end; //  Sum_stolb
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 11.08.2014 в 00:47.
Ответить с цитированием
  #3  
Старый 11.08.2014, 01:03
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

просто я не могу видеть текущие значения переменных, тк использую функцию, не знаю почему
Ответить с цитированием
  #4  
Старый 11.08.2014, 01:13
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от painjkee
тк использую функцию, не знаю почему
Мда проблема.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 11.08.2014, 01:15
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

ну я совсем новичек, что поделать
Ответить с цитированием
  #6  
Старый 11.08.2014, 01:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот и учись. Прочитай про использование клавиш F4, F7, F8 и воспользуйся ими для отладки функции.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 25.08.2014, 15:57
demonpit demonpit вне форума
Прохожий
 
Регистрация: 25.08.2014
Сообщения: 3
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию В продолжении темы

На сайте http://radiokot.ru/forum/viewtopic.php?f=58&t=101045 нашел рабочий USB вольтметр. Рабочий в том смысле, что работает не только в Протеусе, но и со спаянной схемой. Сама спаянная схема (прошивка) опознается компом без ошибок. Опознается как HID устройство. Но проблема в том, что исходник самой программы написан на VB. Как переделать этот исходник в Delphi - без понятия. Конверторы VB2Delphi ни к чему не привели. На выше указанном сайте полный мертвяк - ни одного ответа. VB код программы в архиве http://yadi.sk/d/gjirEuvQaNoyY. Сама программа работает либо с готовой спаянной схемой, либо с PROTEUSом совместно. Из всей программы меня интересует только вывод вольтов в текстовом окне, остальные навороты в этой программе мне не к чему. Помогите пожалуйста перевести VB в Delphi.

P.S. Советами типа "Вот и учись..." пожалуйста не обременяйтесь. Я не крутой программист. Мне хватает Delphi 5 вполне. А с какой стороны подходить к VB я уже забыл напрочь.
Ответить с цитированием
  #8  
Старый 25.08.2014, 23:43
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от demonpit
А с какой стороны подходить к VB я уже забыл напрочь.
Я тоже не силен в VB, но в представленной программе вижу вызовы API. Устройство открывается как файл, данные читаются асинхронно. Сам исходник написан сплошняком, без бутылки в нем не разобраться.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #9  
Старый 26.08.2014, 07:10
demonpit demonpit вне форума
Прохожий
 
Регистрация: 25.08.2014
Сообщения: 3
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Пришлось поставить VB. Исходник рабочий, как и сама экзешка. Проверил. Скачал VBto, шараварную, конвертер. Сохранить коды в файлы для Delphi нельзя, т.к. конвертер без патча. Но переписать текст можно. Ввел текст переписанного кодов на Delphi - при запуске Delphi начинает плеваться ошибками. Если конвертер сконвертировал правильно, то такого быть не должно. Есть исходник аналогичной программы на Delphi, но с ранее выложенным устройством (прошивкой в архиве) она не работает. Работает только со своим, а оно (устройство) не опознается компом, работать можно только в PROTEUSе. Вот и мучаюсь - как перетащить нужные коды в дельфийскую программу не знаю.

Вот код на Delphi для второй аналогичной проги http://yadi.sk/d/Nfow-zdcaRGXi.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:55.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025