473,796 Members | 2,583 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Intrinsic Array as a Container


Inspired by page 219 of Nicolai M. Josuttis's book, I set out to write a
class for an intrinsic array which would behave, to as far an extent as
possible, like a container. Also though, I wanted no overhead whatsoever.

The code I'm about to show below is not finished, it may contain the odd
oversight, bug or error (but at a quick glance it seems OK).

First of all though, I want to show you some macros I've written. The
purpose of the macros is to:

(1) Reduce repetitive typing.
(2) Reduce the possibility for error.

Before you use these macros though, you must a typedef to your class, e.g.:

class SmartPointerOrW hatever {
typedef SmartPointerOrW hatever ThisClass;
};

The first macro, "POST_IN_TERMS_ OF", expands to a definition of a post-
operator which invokes the corresponding pre-operator. Here it is:

#define POST_IN_TERMS_O F(op) \
ThisClass operator op(int) \
{ \
ThisClass const temp(*this); \
op *this; \
return temp; \
}

The second macro, "OP_IN_TERMS_OF ", expands to a definition of an operator
such as +, which works off +=. Here it is:

#define OP_IN_TERMS_OF( op,param_dec,ob j) \
ThisClass operator op(param_dec) const \
{ \
ThisClass temp(*this); \
temp op##= obj; \
return temp; \
}

(I realise that this won't work if "param_dec" were to contain a comma.)

The third macro, "NON_CONST_IN_T ERMS_OF", expands to a definition of a non-
const member function (or member function operator) which calls the const
version. Here it is:

#define NON_CONST_IN_TE RMS_OF(ret,func _dec,call) \
ret func_dec \
{ \
return \
const_cast<ret> ( \
const_cast<This Class const*>(this)-call \
); \
}

(I realise that this won't work if "func_dec" were to contain a comma.)

First of all I'd like to ask, what do you think of these macros? Has anyone
ever done something similar? You can see them in action now below as I
implement "IntrinsicArray ". Before that though, I'm going to implement a
reverse pointer for use as a reverse iterator:

#include <cstddef>

template<class T>
struct ReversePtr {

typedef ReversePtr ThisClass;
typedef std::size_t size_t;

T *p;

ReversePtr(T *const arg) : p(arg) {}

operator T*() { return p; }
operator T const *() const { return p; }

ReversePtr &operator++( ) { --p; return *this; }
ReversePtr &operator--() { ++p; return *this; }

POST_IN_TERMS_O F(++)
POST_IN_TERMS_O F(--)

ReversePtr &operator+=(siz e_t const i) { p -= i; return *this; }
ReversePtr &operator-=(size_t const i) { p += i; return *this; }

OP_IN_TERMS_OF( +,size_t const i,i)
OP_IN_TERMS_OF(-,size_t const i,i)

T const &operator[](size_t const i) const { return *(p-i); }
NON_CONST_IN_TE RMS_OF(T&,opera tor[](size_t const i),operator[](i))
};

What do you think of ReversePtr? I appreciate any suggestions.

Now here's IntrinsicArray:

#include <cstddef>
#include <stdexcept>

template<class T,std::size_t len>
struct IntrinsicArray {

typedef IntrinsicArray ThisClass;

T arr[len];

typedef T value_type;
typedef T *iterator;
typedef T const *const_iterator ;
typedef T &reference;
typedef T const &const_referenc e;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type ;

T const *begin() const { return arr; }
NON_CONST_IN_TE RMS_OF(T*,begin (),begin())

T const *end() const { return arr+len; }
NON_CONST_IN_TE RMS_OF(T*,end() ,end())

ReversePtr<T constrbegin() const { return arr+(len-1); }
NON_CONST_IN_TE RMS_OF(ReverseP tr<T>,rbegin(), rbegin())

ReversePtr<T constrend() const { return arr-1; }
NON_CONST_IN_TE RMS_OF(ReverseP tr<T>,rend(),re nd())

T const &operator[](size_type const i) const {return arr[i];}
NON_CONST_IN_TE RMS_OF(T&,opera tor[](size_type const i),operator[](i))

T const &at(size_typ e const i) const
{
if (i >= len) throw std::range_erro r();
return arr[i];
}
NON_CONST_IN_TE RMS_OF(T&,at(si ze_type const i),at(i))

T const &front() const { return *arr; }
NON_CONST_IN_TE RMS_OF(T&,front (),front())

T const &back() const { return arr[len-1]; }
NON_CONST_IN_TE RMS_OF(T&,back( ),back())

size_type size() const { return len; }
bool empty() const { return false; }
size_type capacity() const { return len; }
size_type max_size() const { return len; }
};

Of course, the code isn't finished yet, but I welcome any comments,
questions, or suggestions.

--

Frederick Gotham
Nov 22 '06 #1
16 1860
Frederick Gotham wrote:
Inspired by page 219 of Nicolai M. Josuttis's book, I set out to write a
class for an intrinsic array which would behave, to as far an extent as
possible, like a container. Also though, I wanted no overhead whatsoever.
Sounds suspiciously like std::tr1::array .

--

-- Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com)
Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." (www.petebecker.com/tr1book)
Nov 22 '06 #2
On Wed, 22 Nov 2006 14:44:47 GMT, Frederick Gotham wrote:
>Inspired by page 219 of Nicolai M. Josuttis's book, I set out to write a
class for an intrinsic array which would behave, to as far an extent as
possible, like a container. Also though, I wanted no overhead whatsoever.
You mean this?
http://www.josuttis.com/libbook/cont/carray.hpp.html
>First of all though, I want to show you some macros I've written.
[...]
>First of all I'd like to ask, what do you think of these macros?
C++ is powerful enough to avoid that kind of macros.
>Before that though, I'm going to implement a
reverse pointer for use as a reverse iterator:

#include <cstddef>

template<cla ss T>
struct ReversePtr {
What about std::reverse_it erator?
>Now here's IntrinsicArray:

#include <cstddef>
#include <stdexcept>

template<cla ss T,std::size_t len>
struct IntrinsicArray {

typedef IntrinsicArray ThisClass;

T arr[len];
public?
typedef T value_type;
typedef T *iterator;
typedef T const *const_iterator ;
typedef T &reference;
typedef T const &const_referenc e;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type ;

T const *begin() const { return arr; }
begin(), end() return (const_)iterato rs
>Of course, the code isn't finished yet, but I welcome any comments,
questions, or suggestions.
Hmm, well ...

Best wishes,
Roland Pibinger
Nov 22 '06 #3
Frederick Gotham wrote:
>
Inspired by page 219 of Nicolai M. Josuttis's book, I set out to write a
class for an intrinsic array which would behave, to as far an extent as
possible, like a container. Also though, I wanted no overhead whatsoever.

The code I'm about to show below is not finished, it may contain the odd
oversight, bug or error (but at a quick glance it seems OK).

First of all though, I want to show you some macros I've written. The
purpose of the macros is to:

(1) Reduce repetitive typing.
(2) Reduce the possibility for error.

Before you use these macros though, you must a typedef to your class,
e.g.:

class SmartPointerOrW hatever {
typedef SmartPointerOrW hatever ThisClass;
};

The first macro, "POST_IN_TERMS_ OF", expands to a definition of a post-
operator which invokes the corresponding pre-operator. Here it is:

#define POST_IN_TERMS_O F(op) \
ThisClass operator op(int) \
{ \
ThisClass const temp(*this); \
op *this; \
return temp; \
}

The second macro, "OP_IN_TERMS_OF ", expands to a definition of an operator
such as +, which works off +=. Here it is:

#define OP_IN_TERMS_OF( op,param_dec,ob j) \
ThisClass operator op(param_dec) const \
{ \
ThisClass temp(*this); \
temp op##= obj; \
return temp; \
}

(I realise that this won't work if "param_dec" were to contain a comma.)

The third macro, "NON_CONST_IN_T ERMS_OF", expands to a definition of a
non- const member function (or member function operator) which calls the
const version. Here it is:

#define NON_CONST_IN_TE RMS_OF(ret,func _dec,call) \
ret func_dec \
{ \
return \
const_cast<ret> ( \
const_cast<This Class const*>(this)-call \
); \
}

(I realise that this won't work if "func_dec" were to contain a comma.)

First of all I'd like to ask, what do you think of these macros? Has
anyone ever done something similar? You can see them in action now below
as I implement "IntrinsicArray ". Before that though, I'm going to
implement a reverse pointer for use as a reverse iterator:

#include <cstddef>

template<class T>
struct ReversePtr {

typedef ReversePtr ThisClass;
typedef std::size_t size_t;

T *p;

ReversePtr(T *const arg) : p(arg) {}

operator T*() { return p; }
operator T const *() const { return p; }

ReversePtr &operator++( ) { --p; return *this; }
ReversePtr &operator--() { ++p; return *this; }

POST_IN_TERMS_O F(++)
POST_IN_TERMS_O F(--)

ReversePtr &operator+=(siz e_t const i) { p -= i; return *this; }
ReversePtr &operator-=(size_t const i) { p += i; return *this; }

OP_IN_TERMS_OF( +,size_t const i,i)
OP_IN_TERMS_OF(-,size_t const i,i)

T const &operator[](size_t const i) const { return *(p-i); }
NON_CONST_IN_TE RMS_OF(T&,opera tor[](size_t const i),operator[](i))
};

What do you think of ReversePtr? I appreciate any suggestions.
Use std::reverse_it erator<T*instea d. It has the advantage of not requiring
UB in implementing rend(). (See below)
>
Now here's IntrinsicArray:

#include <cstddef>
#include <stdexcept>

template<class T,std::size_t len>
struct IntrinsicArray {

typedef IntrinsicArray ThisClass;

T arr[len];

typedef T value_type;
typedef T *iterator;
typedef T const *const_iterator ;
typedef T &reference;
typedef T const &const_referenc e;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type ;

T const *begin() const { return arr; }
NON_CONST_IN_TE RMS_OF(T*,begin (),begin())

T const *end() const { return arr+len; }
NON_CONST_IN_TE RMS_OF(T*,end() ,end())

ReversePtr<T constrbegin() const { return arr+(len-1); }
NON_CONST_IN_TE RMS_OF(ReverseP tr<T>,rbegin(), rbegin())

ReversePtr<T constrend() const { return arr-1; }
UB: there is no "before-begin" pointer. (I know, it's a shame.)

You could just use std::reverse_it erator<T*>.
NON_CONST_IN_TE RMS_OF(ReverseP tr<T>,rend(),re nd())

T const &operator[](size_type const i) const {return arr[i];}
NON_CONST_IN_TE RMS_OF(T&,opera tor[](size_type const i),operator[](i))

T const &at(size_typ e const i) const
{
if (i >= len) throw std::range_erro r();
return arr[i];
}
NON_CONST_IN_TE RMS_OF(T&,at(si ze_type const i),at(i))

T const &front() const { return *arr; }
NON_CONST_IN_TE RMS_OF(T&,front (),front())

T const &back() const { return arr[len-1]; }
NON_CONST_IN_TE RMS_OF(T&,back( ),back())

size_type size() const { return len; }
bool empty() const { return false; }
size_type capacity() const { return len; }
size_type max_size() const { return len; }
};

Of course, the code isn't finished yet, but I welcome any comments,
questions, or suggestions.
Reminds me of std::tr1::array . It also reminds me of my own try (posted just
for inspiration):

template < typename T, std::size_t the_size >
class array {
private:

typedef T T_array [the_size];
typedef T_array & T_array_ref;
typedef T_array const & T_array_const_r ef;

T_array a_ptr;

public:

// Typedefs
// ========

typedef T value_type;
typedef value_type * pointer;
typedef value_type const * const_pointer;
typedef value_type & reference;
typedef value_type const &
const_reference ;
typedef pointer_iterato r< value_type,
pointer,
reference iterator;
typedef pointer_iterato r< const value_type,
const_pointer,
const_reference const_iterator;
typedef typename std::reverse_it erator< iterator >
reverse_iterato r;
typedef typename std::reverse_it erator< const_iterator >
const_reverse_i terator;
typedef std::size_t size_type;
typedef std::ptrdiff_t
difference_type ;
// Construction / Destruction
// =============== ===========

array ( void ) {}

array ( const_reference t ) {
for ( std::size_t i = 0; i < the_size; ++ i ) {
a_ptr[i] = t;
}
}

array ( T_array_const_r ef c_ref )
: a_ptr ( c_ref )
{}

array ( array const & other ) {
for ( size_type index = 0; index < the_size; ++index ) {
a_ptr[index] = other.a_ptr[index];
}
}

template < typename ConstIterType >
array ( ConstIterType from, ConstIterType to ) {
std::size_t i = 0;
for ( ConstIterType iter = from; iter != to; ++ iter ) {
if ( i < the_size ) {
a_ptr[i] = *iter;
++ i;
} else {
// flag_range_erro r( __FILE__, __LINE__, "argument list too long" );
return;
}
}
while ( i < the_size ) {
// flag_range_erro r( __FILE__, __LINE__, "argument list too short" );
// return;
a_ptr[i] = value_type();
++i;
}
}

// Conversion
// ==========

operator T_array_ref () {
return( a_ptr );
}
// Assignment
// ==========

array const & operator= ( array const & other ) {
for ( size_type index = 0; index < the_size; ++index ) {
a_ptr[index] = other.a_ptr[index];
}
return( *this );
}

void swap ( array & other ) {
std::swap_range s( this->begin(), this->end(), other.begin() );
}
// Access
// ======

reference at ( std::size_t pos ) {
if ( the_size <= pos ) {
flag_range_erro r( __FILE__, __LINE__, "index out of range" );
}
return( a_ptr[pos] );
}
const_reference at ( std::size_t pos ) const {
if ( the_size <= pos ) {
flag_range_erro r( __FILE__, __LINE__, "index out of range" );
}
return( a_ptr[pos] );
}

reference operator[] ( std::size_t pos ) {
return( a_ptr[pos] );
}

const_reference operator[] ( std::size_t pos ) const {
return( a_ptr[pos] );
}

reference front ( void ) {
return( a_ptr[0] );
}
const_reference front ( void ) const {
raturn( a_ptr[0] );
}
reference back ( void ) {
return( a_ptr[the_size-1] );
}
const_reference back ( void ) const {
return( a_ptr[the_size-1] );
}

// About
// =====

size_type size ( void ) const {
return( the_size );
}
bool empty ( void ) const {
return( the_size == 0 );
}
// Iterators
// =========

iterator begin ( void ) {
return( a_ptr );
}
const_iterator begin ( void ) const {
return( a_ptr );
}
iterator end ( void ) {
return( a_ptr + the_size );
}
const_iterator end ( void ) const {
return( a_ptr + the_size );
}

reverse_iterato r rbegin ( void ) {
return( reverse_iterato r( this->end() ) );
}

const_reverse_i terator rbegin ( void ) const {
return( reverse_iterato r( this->end() ) );
}

reverse_iterato r rend ( void ) {
return( reverse_iterato r( this->begin() ) );
}

const_reverse_i terator rend ( void ) const {
return( reverse_iterato r( this->begin() ) );
}

}; // array< T, the_size >

template < typename T, std::size_t N >
void swap ( array< T, N & a, array< T, N & b ) {
a.swap(b);
}


Best

Kai-Uwe Bux

Nov 22 '06 #4
Roland Pibinger:
C++ is powerful enough to avoid that kind of macros.

Can you please show me how?

> T const *begin() const { return arr; }

begin(), end() return (const_)iterato rs

Yes, which is why I have the functions return "T const*".

--

Frederick Gotham
Nov 23 '06 #5
On Thu, 23 Nov 2006 19:21:43 GMT, Frederick Gotham wrote:
>Roland Pibinger:
> begin(), end() return (const_)iterato rs

Yes, which is why I have the functions return "T const*".
But you should return iterator and const_iterator.
Nov 23 '06 #6
Roland Pibinger wrote:
On Thu, 23 Nov 2006 19:21:43 GMT, Frederick Gotham wrote:
>>Roland Pibinger:
>> begin(), end() return (const_)iterato rs

Yes, which is why I have the functions return "T const*".

But you should return iterator and const_iterator.
They do. From the original post:

typedef T *iterator;
typedef T const *const_iterator ;

...

T const *begin() const { return arr; }
NON_CONST_IN_TE RMS_OF(T*,begin (),begin())

T const *end() const { return arr+len; }
NON_CONST_IN_TE RMS_OF(T*,end() ,end())

Best

Kai-Uwe Bux
Nov 23 '06 #7
On Thu, 23 Nov 2006 17:52:41 -0500, Kai-Uwe Bux wrote:
>Roland Pibinger wrote:
>On Thu, 23 Nov 2006 19:21:43 GMT, Frederick Gotham wrote:
>>>Roland Pibinger:
begin(), end() return (const_)iterato rs
Yes, which is why I have the functions return "T const*".
But you should return iterator and const_iterator.

They do. From the original post:

typedef T *iterator;
typedef T const *const_iterator ;
But where are those typedefs used?

IMO, there are two possibilities:
1. Apply STL compliant style and use iterators which may be pointers
but may also be templates, e.g. in a (debug-)checked implementation.
2. Write an 'array template' that mimics a C++ array. In that case
avoid the STL related (typedef) stuff and use only pointers.

BTW, the implementation would be more useful if it were a 'maximum
size' instead of an 'always full' container.

Best wishes,
Roland Pibinger
Nov 24 '06 #8
Roland Pibinger wrote:
On Thu, 23 Nov 2006 17:52:41 -0500, Kai-Uwe Bux wrote:
>>Roland Pibinger wrote:
>>On Thu, 23 Nov 2006 19:21:43 GMT, Frederick Gotham wrote:
Roland Pibinger:
begin(), end() return (const_)iterato rs
Yes, which is why I have the functions return "T const*".
But you should return iterator and const_iterator.

They do. From the original post:

typedef T *iterator;
typedef T const *const_iterator ;

But where are those typedefs used?
In client code, of course. As with the STL containers, the point of the
typedefs is just that clients do not need to know how iterators are
implemented. However, in implementing the array class, the programmer has
no reason to pretend that he did not know how he decided to implement
iterators.

IMO, there are two possibilities:
1. Apply STL compliant style and use iterators which may be pointers
but may also be templates, e.g. in a (debug-)checked implementation.
That is exactly what the code is doing. A different implementation is
perfectly free to say

class iterator { ... };
iterator begin() { ... };

instead; and client code written generically will not see the difference.

You seem to think that there is a difference between:

typedef T* iterator;
T* begin() { ... }

and:

typedef T* iterator;
iterator begin() { ... }

But there is none.

STL-style written client code will always use the
IntrinsicArray< T>::iterator typedef. Relying on iterator = T* is a bug in
client code [the classical one of relying on an implementation detail] but
not a bug in the implementation. Of course, I am assuming here that the
documentation of IntrinsicArray, which has not been posted, does not
guarantee that iterator = T*.

2. Write an 'array template' that mimics a C++ array. In that case
avoid the STL related (typedef) stuff and use only pointers.
The OP decided for the other option.

BTW, the implementation would be more useful if it were a 'maximum
size' instead of an 'always full' container.
Maybe, but that would introduce the need for a size variable which, in the
eyes of the OP, is likely to qualify as overhead.

Best

Kai-Uwe Bux
Nov 24 '06 #9
On Fri, 24 Nov 2006 05:57:07 -0500, Kai-Uwe Bux wrote:
>You seem to think that there is a difference between:

typedef T* iterator;
T* begin() { ... }

and:

typedef T* iterator;
iterator begin() { ... }

But there is none.
Of course there is a difference! When a function returns T* one uses a
T* variable to capture the return value, when a function returns an
iterator an iterator variable is used.
>STL-style written client code will always use the
IntrinsicArray <T>::iterator typedef.
Nope. C/C++ clients can rely on the type of the return value because
that type is part of the function contract.

Best wishes,
Roland Pibinger
Nov 24 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
3925
by: Jeremy Cowles | last post by:
I have been reading a book that focuses on understanding the intrinsic types of C++ in depth. The author's mentality is this: "Understand the intrinsic types, then learn the std types as needed later", but I have been reading the stroustrup (spelling?) book and he says that it is much better to learn the standard library first as a beginner, and then worry about the intrinsic types afterwards. So there is no doubt that you need to have a...
9
4813
by: justanotherguy63 | last post by:
Hi, I am designing an application where to preserve the hierachy and for code substitability, I need to pass an array of derived class object in place of an array of base class object. Since I am using vector class(STL), the compiler does not allow me to do this. I do realize there is a pitfall in this approach(size of arrays not matching etc), but I wonder how to get around this problem. I have a class hierachy with abstract base...
29
5486
by: shmartonak | last post by:
For maximum portability what should the type of an array index be? Can any integer type be used safely? Or should I only use an unsigned type? Or what? If I'm using pointers to access array elements as *(mptr+k) where I've declared MYTYPE *mptr; what should be the type of 'k'? Should it be ptrdiff_t?
13
3289
by: Alek Davis | last post by:
Hi, Is it possible to access intrinsic ASP objects, such as Request, from a .NET class. Say, I have a .NET library exposed via a COM or COM+ wrapper. Can this library retrieve the request info (basically, server variables exposed via the Request object), when it is invoked from a traditional ASP (not ASP.NET) application? Any ideas? Thanks in advance. Alek
4
2224
by: bienwell | last post by:
Hi all, Data displayed on the datalist control is bound by the column name of the dataset like this : <%# DataBinder.Eval(Container.DataItem, "title")%> Could I use an element of the array (i.e. index=0) which has the name "title" in place of it ? For example:
6
458
by: Paminu | last post by:
If I have this struct: #include <stdlib.h> #include <stdio.h> #define KIDS 4 typedef struct test { int x; int y; } container;
18
4216
by: toton | last post by:
Hi, In C++ when I initialize an array it, also initializes the class that it contains, which calls the default constructor. However, I want to initialize the array only (i.e reserve the space) and use my specific constructor to initialize the class. How to do it without using malloc? Something like Point* pt = new Point; I want it to reserve the space for N points only, and not to call default constructor. I dont have a default...
4
3443
by: De_Kabal | last post by:
I'm trying to bind a 12x16 array to a repeater to display the information in a table to have certain format. Right now all it does is display all the array elements on individual rows. Does anyone know how to display the data on just the 12 row? thanks; Here is my code: Binding:
7
2106
by: Unite | last post by:
I have a ArrayList which I add a Array to. How will I access the array from the ArrayList? Example : /*Storing the array*/ String Container = new String; ArrayList arr =new ArrayList(); ResultSet rec1 = st.executeQuery("SELECT * FROM HistoryHeader WHERE DocumentDate BETWEEN '"+startDate+"' AND '"+endDate+"'"); while(rec1.next()) { Container = rec1.getString("DocumentType");
0
9680
marktang
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...
0
9528
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10228
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10173
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,...
0
9052
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
7547
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6788
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();...
1
4116
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
3
2925
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.