I've read the FAQ and I still can't see how to get what I want. Here's
what I'd like to do:
I have a list of register numbers that the CPU's instruction set
requires be literal constants, e.g.
#define DMA_CR0 0x100
#define DMA_CR1 0x108
#define DMA_CR2 0x110
#define DMA_CR3 0x118
I'd like to call another function with a one of these but make it
indexed like
dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */
and, logically, dmaRdCr() is implemented like this:
dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel);
I've got DMA_MAKE_REG_NU M defined as:
#define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \
ch == DMA_CHAN_1 ? reg##1 : \
ch == DMA_CHAN_2 ? reg##2 : \
ch == DMA_CHAN_3 ? reg##3 : -1)
But the compiler is unhappy with this. Is there a simpler way? Do I
simply have a substitution error?
Thanks,
--
- Mark 8 1626
Mark Odell wrote: I've read the FAQ and I still can't see how to get what I want. Here's what I'd like to do:
I have a list of register numbers that the CPU's instruction set requires be literal constants, e.g.
#define DMA_CR0 0x100 #define DMA_CR1 0x108 #define DMA_CR2 0x110 #define DMA_CR3 0x118
I'd like to call another function with a one of these but make it indexed like
dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */
and, logically, dmaRdCr() is implemented like this:
dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel);
I've got DMA_MAKE_REG_NU M defined as: #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ ch == DMA_CHAN_1 ? reg##1 : \ ch == DMA_CHAN_2 ? reg##2 : \ ch == DMA_CHAN_3 ? reg##3 : -1)
But the compiler is unhappy with this. Is there a simpler way? Do I simply have a substitution error?
Thanks, -- - Mark
This is a poor approach for embedded programming.
Use Memory Mapped I/O. I shall assume that these are 32bit registers
and and int is 32 bits on your processor.
#define IOBASE 0x100
typedef struct {
int dmacr0;
int pad0;
int dmacr1;
int pad1;
int dmacr2;
int pad2;
int dmacr3;
int pad3;
} my_iomap_t;
my_iomap_t *my_ioptr = IOBASE;
now ya dont need dmaRdCr() , ya just do
int reg2;
reg2 = my_ioptr->dmacr2;
--------------------------------------------
if you are not happy with this reccomendation, and really want to use
your literals,
int dmaRdCr(int chan)
{
return( *(int *) (DMA_CR0 + (8*chan))
}
Ivanna Pee wrote: Mark Odell wrote: I've read the FAQ and I still can't see how to get what I want. Here's what I'd like to do:
I have a list of register numbers that the CPU's instruction set requires be literal constants, e.g.
#define DMA_CR0 0x100 #define DMA_CR1 0x108 #define DMA_CR2 0x110 #define DMA_CR3 0x118
I'd like to call another function with a one of these but make it indexed like
dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */
and, logically, dmaRdCr() is implemented like this:
dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel);
I've got DMA_MAKE_REG_NU M defined as: #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ ch == DMA_CHAN_1 ? reg##1 : \ ch == DMA_CHAN_2 ? reg##2 : \ ch == DMA_CHAN_3 ? reg##3 : -1)
But the compiler is unhappy with this. Is there a simpler way? Do I simply have a substitution error?
Thanks, -- - Mark
This is a poor approach for embedded programming.
[snip]
You'd be right if the registers were memory mapped. They are accessed
via special CPU instructions only, e.g. mtdcr and mfdcr. That is, they
are Device Control Registers accessed over a custom DCR bus, thus the
Move To and Move From instructions. What's worse, is that these two
instructions *require* constant values, not values passed in registers
for the DCR, e.g.
mfdcr r3,0x108 ## Leagal
li r11,0x108
mfrdcr r3,r11 ## Illegal
So, since I can't do it the way you and I would like to do it I'd like
to reduce my maintenance overhead by using the C pre-proc. to generate
the literal constants on the flie.
And, yes, all the registers are 32-bits wide.
Thanks,
- Mark
Mark Odell wrote: Ivanna Pee wrote: Mark Odell wrote: I've read the FAQ and I still can't see how to get what I want. Here's what I'd like to do:
I have a list of register numbers that the CPU's instruction set requires be literal constants, e.g.
#define DMA_CR0 0x100 #define DMA_CR1 0x108 #define DMA_CR2 0x110 #define DMA_CR3 0x118
I'd like to call another function with a one of these but make it indexed like
dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */
and, logically, dmaRdCr() is implemented like this:
dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel);
I've got DMA_MAKE_REG_NU M defined as: #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ ch == DMA_CHAN_1 ? reg##1 : \ ch == DMA_CHAN_2 ? reg##2 : \ ch == DMA_CHAN_3 ? reg##3 : -1)
But the compiler is unhappy with this. Is there a simpler way? Do I simply have a substitution error?
Thanks, -- - Mark
This is a poor approach for embedded programming.
[snip]
You'd be right if the registers were memory mapped. They are accessed via special CPU instructions only, e.g. mtdcr and mfdcr. That is, they are Device Control Registers accessed over a custom DCR bus, thus the Move To and Move From instructions. What's worse, is that these two instructions *require* constant values, not values passed in registers for the DCR, e.g.
mfdcr r3,0x108 ## Leagal
li r11,0x108 mfrdcr r3,r11 ## Illegal
So, since I can't do it the way you and I would like to do it I'd like to reduce my maintenance overhead by using the C pre-proc. to generate the literal constants on the flie.
And, yes, all the registers are 32-bits wide.
Thanks,
- Mark
You gonna hafta write an assembly function to read each register.
Mark Odell wrote: I've read the FAQ and I still can't see how to get what I want. Here's what I'd like to do:
I have a list of register numbers that the CPU's instruction set requires be literal constants, e.g.
#define DMA_CR0 0x100 #define DMA_CR1 0x108 #define DMA_CR2 0x110 #define DMA_CR3 0x118
I'd like to call another function with a one of these but make it indexed like
dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */
Vwl shrtg, n fn.
and, logically, dmaRdCr() is implemented like this:
dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel);
We encourage people to post actual code, not retyped code, for just this
sort of occurrence. This is not an implementation. And how are we supposed
to know your problem is not a missing parenthesis?
I've got DMA_MAKE_REG_NU M defined as: #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ ch == DMA_CHAN_1 ? reg##1 : \ ch == DMA_CHAN_2 ? reg##2 : \ ch == DMA_CHAN_3 ? reg##3 : -1)
But the compiler is unhappy with this. Is there a simpler way? Do I simply have a substitution error?
Again: post actual code and the error you get, not what you think
exemplifies the problem. The following compiles fine on my machine:
#define DMA_CHAN_0 0
#define DMA_CHAN_1 1
#define DMA_CHAN_2 2
#define DMA_CHAN_3 3
#define DMA_CR0 0x100
#define DMA_CR1 0x108
#define DMA_CR2 0x110
#define DMA_CR3 0x118
#define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \
ch == DMA_CHAN_1 ? reg##1 : \
ch == DMA_CHAN_2 ? reg##2 : \
ch == DMA_CHAN_3 ? reg##3 : -1)
#define dmaRdCr(channel ) DMA_MAKE_REG_NU M(DMA_CR, channel)
void f(int channel) {
int dmaCr = dmaRdCr(channel );
}
This preprocesses to:
void f(int channel) {
int dmaCr = (channel == 0 ? 0x100 : channel == 1 ? 0x108 : channel == 2
? 0x110 : channel == 3 ? 0x118 : -1);
}
This in turn can be replaced with simple arithmetic, which may or may not be
desirable (a line of comment to explain it wouldn't hurt, but that line
saves you half a dozen lines of preprocessor magic).
Note that the expression above is not a literal, and never will be, even if
"channel" is. The preprocessor does not evaluate expressions. If for some
reason you need a literal there (and not just a constant expression), then
you have to skip a level and write out all the DMA_MAKE_REG_NU Ms for every
value of "reg". That probably is more trouble than it's worth.
S.
Ivanna Pee wrote: Mark Odell wrote: Ivanna Pee wrote: Mark Odell wrote: > I've read the FAQ and I still can't see how to get what I want. Here's > what I'd like to do: > > I have a list of register numbers that the CPU's instruction set > requires be literal constants, e.g. > > #define DMA_CR0 0x100 > #define DMA_CR1 0x108 > #define DMA_CR2 0x110 > #define DMA_CR3 0x118 > > I'd like to call another function with a one of these but make it > indexed like > > dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */ > > and, logically, dmaRdCr() is implemented like this: > > dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel); > > I've got DMA_MAKE_REG_NU M defined as: > #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ > ch == DMA_CHAN_1 ? reg##1 : \ > ch == DMA_CHAN_2 ? reg##2 : \ > ch == DMA_CHAN_3 ? reg##3 : -1) > > But the compiler is unhappy with this. Is there a simpler way? Do I > simply have a substitution error? > > Thanks, > -- > - Mark
This is a poor approach for embedded programming.
[snip]
You'd be right if the registers were memory mapped. They are accessed via special CPU instructions only, e.g. mtdcr and mfdcr. That is, they are Device Control Registers accessed over a custom DCR bus, thus the Move To and Move From instructions. What's worse, is that these two instructions *require* constant values, not values passed in registers for the DCR, e.g.
mfdcr r3,0x108 ## Leagal
li r11,0x108 mfrdcr r3,r11 ## Illegal
So, since I can't do it the way you and I would like to do it I'd like to reduce my maintenance overhead by using the C pre-proc. to generate the literal constants on the flie.
And, yes, all the registers are 32-bits wide.
Thanks,
- Mark
You gonna hafta write an assembly function to read each register.
or some self modifying code
Skarmander wrote: Mark Odell wrote: I've read the FAQ and I still can't see how to get what I want. Here's what I'd like to do:
I have a list of register numbers that the CPU's instruction set requires be literal constants, e.g.
#define DMA_CR0 0x100 #define DMA_CR1 0x108 #define DMA_CR2 0x110 #define DMA_CR3 0x118
I'd like to call another function with a one of these but make it indexed like
dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */ Vwl shrtg, n fn.
and, logically, dmaRdCr() is implemented like this:
dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel); We encourage people to post actual code, not retyped code, for just this sort of occurrence. This is not an implementation. And how are we supposed to know your problem is not a missing parenthesis?
This is pasted actual code: I've got DMA_MAKE_REG_NU M defined as: #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ ch == DMA_CHAN_1 ? reg##1 : \ ch == DMA_CHAN_2 ? reg##2 : \ ch == DMA_CHAN_3 ? reg##3 : -1)
But the compiler is unhappy with this. Is there a simpler way? Do I simply have a substitution error? Again: post actual code and the error you get, not what you think exemplifies the problem. The following compiles fine on my machine:
#define DMA_CHAN_0 0 #define DMA_CHAN_1 1 #define DMA_CHAN_2 2 #define DMA_CHAN_3 3 #define DMA_CR0 0x100 #define DMA_CR1 0x108 #define DMA_CR2 0x110 #define DMA_CR3 0x118
#define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ ch == DMA_CHAN_1 ? reg##1 : \ ch == DMA_CHAN_2 ? reg##2 : \ ch == DMA_CHAN_3 ? reg##3 : -1)
#define dmaRdCr(channel ) DMA_MAKE_REG_NU M(DMA_CR, channel)
void f(int channel) { int dmaCr = dmaRdCr(channel ); }
The implementation of the underlying macro is not ANSI C so I didn't
include that. I am lead to the conclusion that the assembler macro is
the source of the problem, not the run-time ?: (if-else) ladder.
This preprocesses to:
void f(int channel) { int dmaCr = (channel == 0 ? 0x100 : channel == 1 ? 0x108 : channel == 2 ? 0x110 : channel == 3 ? 0x118 : -1); }
This in turn can be replaced with simple arithmetic, which may or may not be desirable (a line of comment to explain it wouldn't hurt, but that line saves you half a dozen lines of preprocessor magic).
Note that the expression above is not a literal, and never will be, even if "channel" is. The preprocessor does not evaluate expressions. If for some reason you need a literal there (and not just a constant expression), then you have to skip a level and write out all the DMA_MAKE_REG_NU Ms for every value of "reg". That probably is more trouble than it's worth.
Ah, that's it. Since the evaluation of the ?: sequence is run-time, the
result is going to go into a register (e.g. not literal). So I cannot
do what I thought I could. Thank you for the analysis. It was trivial
to create accessors for every register using an editor macro but the
usage of those requires that I switch out on every use of them.
So, I suppose to make the usage easier for the programmer, I'll create
a switcher function that calls the correct worker function, e.g.
unsigned long dmaRdCr(DmaChan Id chanId)
{
unsigned long regVal;
switch (chanId)
{
case DMA_CHAN_0: regVal = dmaRdCr0(); break;
case DMA_CHAN_1: regVal = dmaRdCr1(); break;
case DMA_CHAN_2: regVal = dmaRdCr2(); break;
case DMA_CHAN_3: regVal = dmaRdCr3(); break;
default; regVal = -1; break;
}
return regVal;
}
I already have all the worker functions written.
Thanks again,
--
- Mark
Ivanna Pee wrote: Ivanna Pee wrote: Mark Odell wrote: Ivanna Pee wrote: > Mark Odell wrote: > > I've read the FAQ and I still can't see how to get what I want. Here's > > what I'd like to do: > > > > I have a list of register numbers that the CPU's instruction set > > requires be literal constants, e.g. > > > > #define DMA_CR0 0x100 > > #define DMA_CR1 0x108 > > #define DMA_CR2 0x110 > > #define DMA_CR3 0x118 > > > > I'd like to call another function with a one of these but make it > > indexed like > > > > dmaCr = dmaRdCr(channel ); /* where channel = [0,..,3] */ > > > > and, logically, dmaRdCr() is implemented like this: > > > > dmaRdCr(DMA_MAK E_REG_NUM(DMA_C R, channel); > > > > I've got DMA_MAKE_REG_NU M defined as: > > #define DMA_MAKE_REG_NU M(reg, ch) (ch == DMA_CHAN_0 ? reg##0 : \ > > ch == DMA_CHAN_1 ? reg##1 : \ > > ch == DMA_CHAN_2 ? reg##2 : \ > > ch == DMA_CHAN_3 ? reg##3 : -1) > > > > But the compiler is unhappy with this. Is there a simpler way? Do I > > simply have a substitution error? > > > > Thanks, > > -- > > - Mark > > This is a poor approach for embedded programming.
[snip]
You'd be right if the registers were memory mapped. They are accessed via special CPU instructions only, e.g. mtdcr and mfdcr. That is, they are Device Control Registers accessed over a custom DCR bus, thus the Move To and Move From instructions. What's worse, is that these two instructions *require* constant values, not values passed in registers for the DCR, e.g.
mfdcr r3,0x108 ## Leagal
li r11,0x108 mfrdcr r3,r11 ## Illegal
So, since I can't do it the way you and I would like to do it I'd like to reduce my maintenance overhead by using the C pre-proc. to generate the literal constants on the flie.
And, yes, all the registers are 32-bits wide.
Thanks,
- Mark You gonna hafta write an assembly function to read each register.
Done that.
or some self modifying code
Hmm... that wouldn't be very hard actually. Thanks for the replies.
--
- Mark
So, just to close this out, I came up with this implementation template
(for example I use the CR register):
typedef unsigned long uint32;
#define DMA0_CR0 0x100
#define DMA0_CR1 0x108
#define DMA0_CR2 0x110
#define DMA0_CR3 0x118
__asm uint32 DMA_RD_REG(uint 32 REG_DCR)
{
% con REG_DCR
! /* no unexpected regs altered */
mfdcr r3,REG_DCR
}
uint32 dmaRdCr0(void) { return DMA_RD_REG(DMA0 _CR0); }
uint32 dmaRdCr1(void) { return DMA_RD_REG(DMA0 _CR1); }
uint32 dmaRdCr2(void) { return DMA_RD_REG(DMA0 _CR2); }
uint32 dmaRdCr3(void) { return DMA_RD_REG(DMA0 _CR3); }
uint32 (*dmaRdCrChan[])(void) = { dmaRdCr0, dmaRdCr1, dmaRdCr2,
dmaRdCr3 };
/* For caller convenienc
*/
#define dmaRdCr(x) dmaRdCrChan[x]()
Thanks again for the help.
--
- Mark This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Andrew James |
last post by:
Gentlemen,
I'm running into a problem whilst testing the parsing of a language I've
created with TPG . It seems that for some reason, TPG balks when I try
to parse an expression whose first letter is 't' (or, in fact, at any
time when 't' is at the beginning of a token). This doesn't happen with
any other letter (as far as I know), nor if the 'T' is capitalised.
My grammar looks like this:
|
by: Peter Ammon |
last post by:
As we know, due to C++'s "longest match" rule, the >> token causes
headaches when working with nested templates, e.g.
vector<vector<int>>
will not parse correctly without inserting a space between the two >
signs. Why have a >> token at all? Why not have > be the token, and
handle >> in the grammar as two > tokens?
This would permit code like 3 > > 1, but that seems harmless to me.
|
by: Simon Morgan |
last post by:
I'm trying to write a function to parse a Reverse Polish Notation string
from stdin and return 1 token at a time. For those of you who are unaware
an RPN string looks like this:
1 2 + 4 * 3 +
With each number being read and pushed onto a stack and, when an operator
is encountered, each number on the stack is popped off and calculated
using that operator and the result pushed onto the stack.
|
by: Joel Rondeau |
last post by:
I am building a mixed-mode DLL with VS.NET 2003 and have run across
some link errors. (I have looked at the MS Help articles about LNK2020
errors with mixed-mode C++ and that has not helped)
Typically, it is relatively easy to understand why the token is
unresolved. Unfortunately, this one means nothing to me. I'm actually
getting 6 similar unresolved tokens:
LINK : error LNK2020: unresolved token (0A00083B) ??_9@$$F$BMI@AE
LINK : error...
|
by: Ian Lazarus |
last post by:
Hello.
How do "unresolved token" link errors occur. How do I fix them?
Linking...
LINK : error LNK2020: unresolved token (0A000015) ??_7type_info@@6B@
LINK : error LNK2020: unresolved token (0A000016) _CxxThrowException
LINK : error LNK2020: unresolved token (0A000018) exception.__ctor
LINK : error LNK2020: unresolved token (0A000019) exception.__ctor
LINK : error LNK2020: unresolved token (0A00001A) exception.__dtor
LINK : error...
| |
by: Jay C. |
last post by:
Jay
3 Jan. 11:38 Optionen anzeigen
Newsgroups: microsoft.public.dotnet.framework.webservices.enhancements
Von: "Jay" <p.brunm...@nusurf.at> - Nachrichten dieses Autors suchen
Datum: 3 Jan 2006 02:38:30 -0800
Lokal: Di 3 Jan. 2006 11:38
Betreff: Referenced security token could not be retrieved
Antworten | Antwort an Autor | Weiterleiten | Drucken | Einzelne Nachricht |
Original anzeigen | Entfernen | Missbrauch melden
|
by: Manuel |
last post by:
I'm trying to compile glut 3.7.6 (dowbloaded from official site)using
devc++.
So I've imported the glut32.dsp into devc++, included manually some
headers, and start to compile.
It return a very strange error. In your experience, where I should
looking to find the real error? Surely the sintax of glut is correct...
gcc.exe -c glut_bitmap.c -o glut_bitmap.o -I"C:/Dev-Cpp/include"
-I"../../include" -D__GNUWIN32__ -W -DWIN32 -DNDEBUG...
|
by: Joriveek |
last post by:
Hi,
I have a little piece of program here
Basically what it does is, it copies the strings of variable widths. The
basis is until it finds a comma ",". The input is a CSV/Comma Separated
file.
Now the problem is that it is not counting Spaces. For example to read the
following line with the below Program is OK:
|
by: Sid DeLuca |
last post by:
I'm modifying the WSE2 HOL sample to develop my web service. I'm able to get
the client application's username token encrypted on the way out
(outputTrace.webinfo), but not on receipt from the server
(inputTrace.webinfo).
The HOL manual mentions adding the wse:UsernameToken() to the
policyCache.config on the client, but not on the server. I have tried adding
this to the <confidentiality> section on the server but it still shows the...
|
by: Lan Mind |
last post by:
Hello again everybody,
My page: http://www.dockhawk.com/
I'm trying to implement some "session security" PHP script
mentioned in the "Cross-site request forgery" section of this
tutorials (pdf): http://daniel0.net/phpfreaks_tutorials/php_security/php_security.pdf
I was trying to figure out if it was functioning by putting a value in
the hidden input that won't be equal to the session token. The hidden
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
| |
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |