powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по vfp, c++ и FLL
11 сообщений из 11, страница 1 из 1
Вопрос по vfp, c++ и FLL
    #33417423
newnew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
winapims.lib и Pro_ext.h от VFP6, компилятор VC++6.0 sp6

Простой код:
#include <Pro_ext.h>
void masi(ParamBlk *parm) // the function definition
{
int i=1;
int j=1;
long *ddd=0;
int fff;
Value val;

j=_Load(&parm->p[0].loc,&val);
i=_Store(&parm->p[0].loc,&val);

if (parm->p[0].loc.l_type == 'R')
{
_PutStr("\nСсылка\n");
}
if (i != 0)
{
_PutStr("\n_Store is false\n");
}
else
{
_PutStr("\n_Store is true\n");
}

if (j != 0)
{
_PutStr("\nLoad is false\n");
}
else
{
_PutStr("\nLoad is true\n");
}

// _RetInt(_ALen(parm->p[0].loc.l_NTI, AL_ELEMENTS), 10);

ddd=&val.ev_long;
fff=*ddd;
_RetInt(fff,10);
}
// the FoxInfo structure registers the function
FoxInfo myFoxInfo[] = {
{"MASS",(FPFI) masi, 1, "R"},
};

extern "C" {
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
}

но если я коментирую строку _Load, то "_Store is false", если не коментирую - "_Store is true" при выполнении простой проги:

set library to proba2.fll
Private kdd as integer, i as integer
clear
kdd=5
Dimension dd(kdd) as string
For i=1 to kdd
dd(i)=i*2
endfor
? mass(@dd)
set library to
return

В доке про _Store сказано, если локатор определяет массив и l_subs=0, то "If loc specifies an array and l_subs is 0, _Store( ) stores the value in val to all elements in the array."

_RetInt(_ALen(parm->p[0].loc.l_NTI, AL_ELEMENTS), 10); возращает 5

строки
ddd=&val.ev_long;
fff=*ddd;
_RetInt(fff,10);

возвращают 1-ый элемент массива = 2,

строки
ddd=&val.ev_long+4; (следующий элемент)
fff=*ddd;
_RetInt(fff,10);
фиг знает что.

Почему _Store не работает и как обратиться к элементам массива целых чисел.
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33417610
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучьше по русски скажи , что нужно сделать ?
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33417652
newnew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:)
Поработать с массивом целых чисел, переданным по ссылке внутрь функции на С++.
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33417684
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ктож тебе не дает ? Лень в коде капаться, напиши по человечески.
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33418267
newnew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to luser
Блин, вот и спрашиваю, в что я не доделываю, почему функция _Store не отрабатывает и как обратиться к элементам массива(массив целых чисел) переданным по ссылке!!!
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33418365
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и отвечаю, завтра напишу пример. Сейчас не могу, извини.
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33419024
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример обнуления одномерного массива целых чисел по ссылке.

Код: plaintext
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.
#include <string.h>
#include <Pro_ext.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h>
#include <comutil.h>

#pragma once
#define p(i) parm->p[(i)].val

void f_GetArray(ParamBlk FAR *parm)
{
Value val={ 0 };
int i_CntArray =  0 ;
i_CntArray = _ALen(parm->p[ 0 ].loc.l_NTI, AL_ELEMENTS); // Количество элементов массива
for(int i= 1 ;i<=i_CntArray;i++)
{
   parm->p[ 0 ].loc.l_sub1 = i;
   _Load(&parm->p[ 0 ].loc, &val); 
   val.ev_type ='I';
   val.ev_long  =  0 ;
   _Store(&parm->p[ 0 ].loc,&val);
}
}

FoxInfo myFoxInfo[] = {
	{"FGETARRAY"         ,(FPFI)  f_GetArray  ,       1 ,"R"          }, 
};
extern "C"  FoxTable _FoxTable = {(FoxTable  *)  0 , sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo};
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33419127
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SET LIBRARY TO f_array.fll ADDITIVE 
DIMENSION a_Test( 10 )
DISPLAY MEMORY LIKE a_Test
? FGETARRAY(@a_Test)
DISPLAY MEMORY LIKE a_Test
SET LIBRARY TO
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33419781
newnew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но:

код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set library to proba2.fll
Private kdd as integer, i as integer
clear
kdd= 5 
Dimension dd(kdd) as string
For i= 1  to kdd
   dd(i)=i
endfor
? mass(@dd)
?
For i= 1  to kdd
   ? dd(i)
endfor
set library to
return

выдает:
6
6
6
6
6

если:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	for(int i= 1 ;i<=i_CntArray;i++)
	{
	   parm->p[ 0 ].loc.l_sub1 =  1 ;
	   _Load(&parm->p[ 0 ].loc, &val); 
	   val.ev_type ='I';
	   val.ev_long  = val.ev_long+ 1 ;
	   _Store(&parm->p[ 0 ].loc,&val);
	}

или

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	   parm->p[ 0 ].loc.l_sub1 =  1 ;
или
	   parm->p[ 0 ].loc.l_sub1 =  2 ;
или
	   parm->p[ 0 ].loc.l_sub1 =  3 ;
или
	   parm->p[ 0 ].loc.l_sub1 =  4 ;
или
	   parm->p[ 0 ].loc.l_sub1 =  5 ;

	   _Load(&parm->p[ 0 ].loc, &val); 
	   val.ev_type ='I';
	   val.ev_long  =  6 ;
	   _Store(&parm->p[ 0 ].loc,&val);

то выводит
6
6
6
6
6

Весь массив "ошестеряет" :) и цикл не нужен.

Вот и спрашиваю как обратиться к элементам массива(массив целых чисел) переданным по ссылке!!!
Например 1-ый увеличить на 1, 2-ой на 2, 3-ий на 3, 4-ый на 4, 5-ый на пять
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33419817
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О как :) Я тебе о направлении мысли, а ты хочешь , чтобы я сделал за тебя твою реализацию :) Ну подумай же, в конце концов-то :)
...
Рейтинг: 0 / 0
Вопрос по vfp, c++ и FLL
    #33420032
newnew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дбавил перед циклом:

parm->p[0].loc.l_sub2 = 0;
parm->p[0].loc.l_subs = 1;

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

Ладно, все понятно, спасибо luser!!!

P.S.
Но почему же до этого работало ..., блин хреного, так и не выяснил по чему такие же мои пробы не работали ... :( и выяснить уже не смогу, те пробы уже удалил(код, который я привел в начале - эксперименты от "не удач" ... ).
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по vfp, c++ и FLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]