473,395 Members | 1,856 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Some issue with pointers


Hello,

I need some help to understand what I'm doing :)

I'm writing code for an embedded system and I need to create a navigable
menu system. I'm going to use these structures:

typedef struct {
char *name[2];
int type;
int num_param;
void *ptr;
} menuitem_t;

typedef struct {
char *name[2];
int num_items;
menuitem_t *items;
} menu_t;
The latter defines each menu or submenu with a name, a number of items
and a pointer to the items structure.

The former defines each menu item with a name, a type (see below) the
number of parameters - if any - and finally a generic pointer (see below
again).

In this way I can generate menus of any complexity and very flexible.
The void pointer should point to another menu_t struct if the item leads
to a submenu, to an array if it leads to a parameter list. But it could
also leads to a function if the selection of this item needs an action
to be executed.

Actually I have two questions:

1) I can't cast correctly the void *ptr. Let's say I want to access to:

char *par[] = {"First", "Second"};

ot invoke:

void myfunc();

Please, may you help me to understand how to cast and then to use that
pointer in these cases?

2) It would be nice if I can know the path the user is following. For
example:

mainmenu -seconditem -firstitem

where each of these entities are menu_t structs.
How would you implement such a dynamic path?

Thank you and I apologize for my poor English
Marco / iw2nzm
Jun 30 '08 #1
19 1270
Marco Trapanese <ma******************@gmail.comwrites:
I'm writing code for an embedded system and I need to create a
navigable menu system. I'm going to use these structures:

typedef struct {
char *name[2];
int type;
int num_param;
void *ptr;
} menuitem_t;

typedef struct {
char *name[2];
int num_items;
menuitem_t *items;
} menu_t;
The latter defines each menu or submenu with a name, a number of items
and a pointer to the items structure.

The former defines each menu item with a name, a type (see below) the
number of parameters - if any - and finally a generic pointer (see
below again).
I can't see why you'd have two. I'd merge them like this:

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
struct menu *items;
} ptr;
} menu_t;

It must be simpler to have only one type (in the C sense) for menu
items, surely?
In this way I can generate menus of any complexity and very
flexible. The void pointer should point to another menu_t struct if
the item leads to a submenu, to an array if it leads to a parameter
list. But it could also leads to a function if the selection of this
item needs an action to be executed.
Function pointers are "special" in that there is no guarantee in C
that you can convert a void * to function pointer (nor vice versa).
Your implementation may offer this as an extension, but if you use a
union, you can add a function pointer type and not have any
portability worries.
Actually I have two questions:

1) I can't cast correctly the void *ptr. Let's say I want to access to:

char *par[] = {"First", "Second"};
Let's say that ptr got set like this: 'ptr = par;'. ptr is then a
char ** in disguise so simply writing:

char **strings = ptr;

would let you access strings[0] and strings[1].
ot invoke:

void myfunc();

Please, may you help me to understand how to cast and then to use that
pointer in these cases?
It is easiest not to use a cast. Just assign ptr to a variable of the
right type and off you go.

However, since this requires an extension to standard C, you might
want to consider using a union containing an element for each pointer
type you need. This means you don't have to reply on converting a
void * to a function pointer and it keeps the code very clean (at the
expense of a messy union).
2) It would be nice if I can know the path the user is following. For
example:

mainmenu -seconditem -firstitem

where each of these entities are menu_t structs.
How would you implement such a dynamic path?
I'd use a stack, probably implemented as a linked list.

--
Ben.
Jun 30 '08 #2
Ben Bacarisse ha scritto:
I can't see why you'd have two. I'd merge them like this:

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
struct menu *items;
} ptr;
} menu_t;

It must be simpler to have only one type (in the C sense) for menu
items, surely?
You're right, it's my fault. I'm not so experienced (yet) in this kind
of thing!

Function pointers are "special" in that there is no guarantee in C
that you can convert a void * to function pointer (nor vice versa).
What a pity! :)

Your implementation may offer this as an extension, but if you use a
union, you can add a function pointer type and not have any
portability worries.
So, are you suggesting to add in the union a pointer for each type I
need, aren't you? Or at least, the function pointer because is treated
differently.

>char *par[] = {"First", "Second"};

Let's say that ptr got set like this: 'ptr = par;'. ptr is then a
char ** in disguise so simply writing:

char **strings = ptr;

would let you access strings[0] and strings[1].
Ok, I was trying to access directly from ptr with a cast. But it's more
readable you solution.

It is easiest not to use a cast. Just assign ptr to a variable of the
right type and off you go.

However, since this requires an extension to standard C, you might
want to consider using a union containing an element for each pointer
type you need. This means you don't have to reply on converting a
void * to a function pointer and it keeps the code very clean (at the
expense of a messy union).

Ok, this answer my first question above. I read the 'type' value and use
the correct union entry. The others will be ignored.

I'd use a stack, probably implemented as a linked list.
I got it.

Thank you a lot for the time you spent!

Marco / iw2nzm
Jul 1 '08 #3
Ben Bacarisse ha scritto:
I can't see why you'd have two. I'd merge them like this:

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
struct menu *items;
} ptr;
} menu_t;

Please, consider this short code:
char mypar[3];
void myfunc();

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
void (*fp)();
struct menu *items;
} ptr;
} menu_t;
Ok, now I want to initialize this struct:

const menu_t mn_mnu = {
{"Main Menu", "Menu"},
MIT_FUNCTION,
0,
{mypar}
};
It successfully compiles. Please note that the function pointer
declaration in Dynamic C is slightly different from standard-C. The
syntax is the same: returntype (*name)(); also for functions with
parameters.

Now I want to initialize the second (and eventually the third) element
of the union. How should I do?

{, myfunc}
{0, myfunc}
{NULL, myfunc}

None of these works. The compiler screams loud a lot of errors.
I'm googled on this but I didn't find an example.

Bye
Marco / iw2nzm
Jul 1 '08 #4

I'll keep my replies to this thread. In the other reply you asked a
question. Imagine that I relied to it "yes".

Marco Trapanese <ma******************@gmail.comwrites:
Ben Bacarisse ha scritto:
>I can't see why you'd have two. I'd merge them like this:

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
struct menu *items;
} ptr;
} menu_t;


Please, consider this short code:

char mypar[3];
void myfunc();

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
void (*fp)();
struct menu *items;
} ptr;
} menu_t;
Ok, now I want to initialize this struct:

const menu_t mn_mnu = {
{"Main Menu", "Menu"},
MIT_FUNCTION,
0,
{mypar}
};
It successfully compiles. Please note that the function pointer
declaration in Dynamic C is slightly different from standard-C. The
syntax is the same: returntype (*name)(); also for functions with
parameters.

Now I want to initialize the second (and eventually the third) element
of the union. How should I do?

{, myfunc}
{0, myfunc}
{NULL, myfunc}
You need to either

(1) Use C99 designated initialiser syntax:

{ .fp = myfunc }

(2) Let the compiler complain about the type-mismatch (if it works):

{ myfunc }

(3) Convert to void * (again, if that is permitted):

{ (void *)myfunc }

You don't loose anything this way. In your method, you were still
going to have to initialise a void * with a function pointer which is
what the above does (with C99 you can only initialise the first
element of a union).

Of course, you can do it at runtime (mn_mnu.ptr.fp = myfunc;) but then
you can have the menu as const.

--
Ben.
Jul 1 '08 #5
Ben Bacarisse ha scritto:
(1) Use C99 designated initialiser syntax:

{ .fp = myfunc }

This one doesn't work. I bet Dynamic C is not C99 compliant.

(2) Let the compiler complain about the type-mismatch (if it works):

{ myfunc }

(3) Convert to void * (again, if that is permitted):

{ (void *)myfunc }
These works, or at least the compiler says nothing about.

Now I have to verify that myfunc is actually assigned to fp and not to vp.

You don't loose anything this way. In your method, you were still
going to have to initialise a void * with a function pointer which is
what the above does (with C99 you can only initialise the first
element of a union).

Of course, you can do it at runtime (mn_mnu.ptr.fp = myfunc;) but then
you can have the menu as const.

Yeah, I want to declare them as constants to save code space.

Thanks again
Marco / iw2nzm

Jul 1 '08 #6
Marco Trapanese ha scritto:
Now I have to verify that myfunc is actually assigned to fp and not to vp.

Verified. Great! It works like a charm.

Marco / iw2nzm
Jul 1 '08 #7
Marco Trapanese <ma******************@gmail.comwrites:
Ben Bacarisse ha scritto:
>(1) Use C99 designated initialiser syntax:

{ .fp = myfunc }

This one doesn't work. I bet Dynamic C is not C99 compliant.
Shame. This is one of the nice part of C99.
>(2) Let the compiler complain about the type-mismatch (if it works):

{ myfunc }

(3) Convert to void * (again, if that is permitted):

{ (void *)myfunc }

These works, or at least the compiler says nothing about.

Now I have to verify that myfunc is actually assigned to fp and not
to vp.
You do realise that they are, in effect, one and the same? You can't
have both fp and vp assigned different values at the same time. That
is what the union is for.

--
Ben.
Jul 1 '08 #8
Ben Bacarisse ha scritto:
You do realise that they are, in effect, one and the same? You can't
have both fp and vp assigned different values at the same time. That
is what the union is for.

You're right again. I didn't realized that. But now I should have
understood: all union items share the same address so they are "the
same" thing.

Ok, I learned something new today :)

Marco / iw2nzm

Jul 1 '08 #9
Marco Trapanese <ma******************@gmail.comwrites:
Ben Bacarisse ha scritto:
You do realise that they are, in effect, one and the same? You can't
have both fp and vp assigned different values at the same time. That
is what the union is for.

You're right again. I didn't realized that. But now I should have
understood: all union items share the same address so they are "the
same" thing.
[...]

Well, sort of. They're not really "the same" thing; they're different
things that happen to share the same space.

Imagine that you work the day shift, and you share an office with
someone who works the night shift. You're never in the office at the
same time. You both have the same address, but you're two different
people. And somebody who wants to visit one of you need to know what
time it is to know which one of you to expect.

As for initialization, an ordinary C90-style initializer for a union
simply initializes the first declared member. For example:

int main(void)
{
union foo {
int x;
char *s;
};

union foo obj1 = { 42 }; /* ok, sets obj1.x to 42 */
union foo obj2 = { "hello" }; /* wrong, tries to set x to "hello" */

return 0;
}

C99 lets you choose which member you want to initialize, but since you
apparently want to initialize the first one anyway, you don't need
that feature.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Jul 1 '08 #10
Keith Thompson ha scritto:
Imagine that you work the day shift, and you share an office with
someone who works the night shift. You're never in the office at the
same time. You both have the same address, but you're two different
people. And somebody who wants to visit one of you need to know what
time it is to know which one of you to expect.
Got it.

C99 lets you choose which member you want to initialize, but since you
apparently want to initialize the first one anyway, you don't need
that feature.
mmm, I guess I can't have two items in a union of the same type, can I?
The compiler will know what is the item I'm going to initialize if they
are different. In effect, it doesn't make any sense to use a union with
two fields of the same type.

Marco / iw2nzm

Jul 1 '08 #11
Marco Trapanese <ma******************@gmail.comwrites:
Keith Thompson ha scritto:
>Imagine that you work the day shift, and you share an office with
someone who works the night shift. You're never in the office at the
same time. You both have the same address, but you're two different
people. And somebody who wants to visit one of you need to know what
time it is to know which one of you to expect.

Got it.

>C99 lets you choose which member you want to initialize, but since you
apparently want to initialize the first one anyway, you don't need
that feature.

mmm, I guess I can't have two items in a union of the same type, can I?
The compiler will know what is the item I'm going to initialize if
they are different. In effect, it doesn't make any sense to use a
union with two fields of the same type.
It doesn't work like that -- the type of the expression used to
initialise a union has no effect in choosing which member is
initialised. When a union is initialised, it is the first
member that is chosen unless (in C99 code) a designator is given:

union eg1 {
double d;
int i;
} example1 = { 1.2 };

This initialises the double, and this:

union eg2 {
int i;
double d;
} example2 = { 1.2 };

initialises the int (converting the 1.2 in the process). You can have
several members of the same type but although that would be pointless
it has no effect on the compiler initialises the union.

--
Ben.
Jul 1 '08 #12
Ben Bacarisse ha scritto:
union eg1 {
double d;
int i;
} example1 = { 1.2 };

This initialises the double, and this:

union eg2 {
int i;
double d;
} example2 = { 1.2 };

initialises the int (converting the 1.2 in the process). You can have
several members of the same type but although that would be pointless
it has no effect on the compiler initialises the union.

I'm feeling a bit stupid but I don't understand the whole thing.
Why in my code I can initialize the function pointer that is the second
element?

Is it related to C90/C99 stuff?

Marco / iw2nzm
Jul 1 '08 #13
Ben Bacarisse ha scritto:
typedef struct {
char *name[2];
int type;
union {
void *vp;
void (*fp)();
struct menu_t *items;
} ptr;
} menu_t;

Hello again, this time I'm trying to initialize the union with the third
entry, that is another menu_t struct.

const menu_t mn_menu = {
{"Main Menu", "Menu"},
MIT_SUBMENU,
{{mn_setup, mn_about}}
};

Where mn_setup and mn_about are other two const structs previously
defined. The compilers complains about type mismatch. I thought I was
able to initialize this damn unions but I was wrong.

It works with an array, it works with a function pointer why doesn't
work with a struct?

Marco / iw2nzm
Jul 1 '08 #14
Marco Trapanese <ma******************@gmail.comwrites:
Ben Bacarisse ha scritto:
union eg1 {
double d;
int i;
} example1 = { 1.2 };
This initialises the double, and this:
union eg2 {
int i;
double d;
} example2 = { 1.2 };
initialises the int (converting the 1.2 in the process). You can
have
several members of the same type but although that would be pointless
it has no effect on the compiler initialises the union.


I'm feeling a bit stupid but I don't understand the whole thing.
Why in my code I can initialize the function pointer that is the
second element?

Is it related to C90/C99 stuff?
I had to go back up the thread to see what you're talking about:

union {
void *vp;
void (*fp)();
struct menu *items;
} ptr;

This was part of a larger structure. You initialized ptr to {mypar},
where mypar is the name of an array of char.

The result of evaluating ``mypar'', of type char*, was implicitly
converted to void* and used to initialize ptr.vp. (This indirectly
assigns a value to the space occupied by ptr.fp and ptr.items, but
accessing those members is unsafe.)

Any initialization of this union, unless you use a C99 designated
initializer, is going to initialize ptr.vp.

If this doesn't match your understanding, can you post a small example
that illustrates the issue?

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Jul 1 '08 #15
Marco Trapanese <ma******************@gmail.comwrites:
Ben Bacarisse ha scritto:
>typedef struct {
char *name[2];
int type;
union {
void *vp;
void (*fp)();
struct menu_t *items;
} ptr;
} menu_t;


Hello again, this time I'm trying to initialize the union with the
third entry,
You can't. You don't have a C99 compiler so any initialiser you use
will be used to initialise the first union member. Always the first.
OK?

In fact, given that you can't use the union in the way it is intended
(C99 designated initialisers) I advice you don't use a union. It
would be fine if you set the union at runtime, but bending the type
rules by initialising always the first element is probably more
problematic than converting everything to and from a void *. There
are machines on which this breaks:

int i;

union {
void *vp;
int *ip;
} u = { &i };

followed by an access of, say, u.ip[0]. It may be best just to force
the conversion to and from a single void * all the time.
that is another menu_t struct.

const menu_t mn_menu = {
{"Main Menu", "Menu"},
MIT_SUBMENU,
{{mn_setup, mn_about}}
};

Where mn_setup and mn_about are other two const structs previously
defined. The compilers complains about type mismatch. I thought I was
able to initialize this damn unions but I was wrong.
You can, but you need a pointer, not another set of {}s. You really
need to go over this in a C textbook -- you can't learn this by trial
and error. For the record, you do it like this:

struct menu_t submenuitem = {mn_setup, mn_about};

const menu_t mn_menu = {
{"Main Menu", "Menu"},
MIT_SUBMENU,
&submenuitem
};

You'll be thrilled that C99 can do this directly with a compound
literal like this:

const menu_t mn_menu = {
{"Main Menu", "Menu"},
MIT_SUBMENU,
&(struct menu_t){mn_setup, mn_about};
};

Ask you compiler vendor to support C99!
It works with an array, it works with a function pointer why doesn't
work with a struct?
Because you need a pointer and both arrays and functions get converted
to pointers in this context -- structs don't.

--
Ben.
Jul 1 '08 #16
On Tue, 01 Jul 2008 17:52:15 +0200, Marco Trapanese
<ma******************@gmail.comwrote:
>Ben Bacarisse ha scritto:
>(1) Use C99 designated initialiser syntax:

{ .fp = myfunc }


This one doesn't work. I bet Dynamic C is not C99 compliant.

>(2) Let the compiler complain about the type-mismatch (if it works):

{ myfunc }

(3) Convert to void * (again, if that is permitted):

{ (void *)myfunc }

These works, or at least the compiler says nothing about.

Now I have to verify that myfunc is actually assigned to fp and not to vp.
Since fp and vp overlap (occupy the same memory), how do propose to
accomplish this?
Remove del for email
Jul 2 '08 #17
On Tue, 01 Jul 2008 19:56:49 +0200, Marco Trapanese
<ma******************@gmail.comwrote:
>Ben Bacarisse ha scritto:
>union eg1 {
double d;
int i;
} example1 = { 1.2 };

This initialises the double, and this:

union eg2 {
int i;
double d;
} example2 = { 1.2 };

initialises the int (converting the 1.2 in the process). You can have
several members of the same type but although that would be pointless
it has no effect on the compiler initialises the union.


I'm feeling a bit stupid but I don't understand the whole thing.
Why in my code I can initialize the function pointer that is the second
element?
You can't. You are initializing the void* that occupies the same
space as your function pointer. You also don't know if the void*
representation is acceptable as a function pointer.
>
Is it related to C90/C99 stuff?
No. The only difference between C90 and C99 is that in C99 you can
specify which member of the union you want to initialize.
Remove del for email
Jul 2 '08 #18
Ben Bacarisse ha scritto:
You can't. You don't have a C99 compiler so any initialiser you use
will be used to initialise the first union member. Always the first.
OK?

Ok.
I was confused because in your first post on this thread you wrote:

I can't see why you'd have two. I'd merge them like this:

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
struct menu *items;
} ptr;
} menu_t;

So I assumed I can use (and initialize) both the void pointer and the
menu_t struct.

So I must return to use two different structs.

In fact, given that you can't use the union in the way it is intended
(C99 designated initialisers) I advice you don't use a union. It
would be fine if you set the union at runtime,
Yeah, but this is code space consuming. It could be done for few
entries, but it isn't so elegant ;-)

but bending the type
rules by initialising always the first element is probably more
problematic than converting everything to and from a void *. There
are machines on which this breaks:

int i;

union {
void *vp;
int *ip;
} u = { &i };

followed by an access of, say, u.ip[0]. It may be best just to force
the conversion to and from a single void * all the time.

Ok, but given that I need three different types of pointers (generic
void, function, struct) I'll set them at runtime or it will be better to
separate each one - at the cost of more memory of course.

You can, but you need a pointer, not another set of {}s. You really
need to go over this in a C textbook -- you can't learn this by trial
and error.
I'll do that.

Ask you compiler vendor to support C99!
Perhaps the pay version of the compiler does, but it costs several
thousand dollars...

Because you need a pointer and both arrays and functions get converted
to pointers in this context -- structs don't.
Ok, these limitations are beyond my knowledge. I search another way to
build my menu system.

I thank you very much for your patience
Marco / iw2nzm

Jul 2 '08 #19
Marco Trapanese <ma******************@gmail.comwrites:
Ben Bacarisse ha scritto:
>You can't. You don't have a C99 compiler so any initialiser you use
will be used to initialise the first union member. Always the first.
OK?


Ok.
I was confused because in your first post on this thread you wrote:
>I can't see why you'd have two. I'd merge them like this:

typedef struct menu {
char *name[2];
int type;
int num_param;
union {
void *vp;
struct menu *items;
} ptr;
} menu_t;

So I assumed I can use (and initialize) both the void pointer and the
menu_t struct.

So I must return to use two different structs.
Oh dear. We've gone off the rails here! Your code will get very
messy if you have two menu structs just because at some point you
need one of two types of pointer in it. It will get worse if you have
three types, and so on.

If you had C99, a union is the simplest way to build your menus using
static initialisers -- that is why I suggested it. You don't have C99
so your options are:

(a) One menu struct with a data pointer of type void *. The only down
side of this if that you keep having to convert between the pointer
types. This is not hard and has the advantage of being about as
portable you can get. You can continue to use static initialisation.

(b) Use a union to avoid some of the type conversions. This can have
portability problems because some type conversion are essential (on
some systems). Had I know that you wanted to use static
initialisation for all the menus and that you did not have C99, I
would not have suggested a union. Just ditch that idea.

I *still* would have suggested having only one menu struct -- with a
void * data member.

<snip>
Ok, but given that I need three different types of pointers (generic
void, function, struct) I'll set them at runtime or it will be better
to separate each one - at the cost of more memory of course.
Your choice. You can use a struct with just a void * and use static
initialisation, or a struct with union and use some run-time member
setting.

<snip>
Ok, these limitations are beyond my knowledge. I search another way to
build my menu system.
Just forget I suggested a union! Keep the idea of simplifying it to
one structure; keep the static initialisation. You can get the best
of all worlds that way. Some people use macros to wrap up the casts:

typedef struct menu {
char *name[2];
int type;
int num_param;
void *data;
} menu_t;

#define SUBMENU_PTR(m_ptr) ((menu_t *)(m_ptr)->data)
#define STRINGS_PTR(m_ptr) ((char **)(m_ptr)->data)
#define ACTION_PTR(m_ptr) ((menu_function *)(m_ptr)->data)

--
Ben.
Jul 2 '08 #20

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

Similar topics

12
by: Ken | last post by:
I am familiar with C and Java, I would like to use a style that I have become accustomed to in Java with C++ but each time I do this I have name conflict. In the past I have just worked around it...
193
by: Michael B. | last post by:
I was just thinking about this, specifically wondering if there's any features that the C specification currently lacks, and which may be included in some future standardization. Of course, I...
16
by: junky_fellow | last post by:
According to Section A6.6 Pointers and Integers (k & R) " A pointer to one type may be converted to a pointer to another type. The resulting pointer may cause addressing exceptions if the...
48
by: yezi | last post by:
Hi, all: I want to record some memory pointer returned from malloc, is possible the code like below? int memo_index; int i,j; char *tmp; for (i=0;i<10;i++){
4
by: mathieu | last post by:
Hello, I would like implement a nice way to work around the array of references issue in C++. What do usually people do ? Do you maintain a separate factory/pool of elements as part of the API ?...
1
by: Ted | last post by:
I managed to get it installed OK, along side MS Visual Studio 2005 (with which I received it). During the install, I made sure I installed everything. I have developed a number of applications...
25
by: al pacino | last post by:
hi , whats the issue with the following declaration, is it correct and what exactly is happening here. int main() { //..... int* ptr=10; // i suppose ptr is pointing to the memory location...
2
by: mabond | last post by:
Hi I want to begin researching methods for a particular problem I have and would welcome some pointers, or info if anyone has had the same issue. At my place of work we have a display of data...
8
by: John Nagle | last post by:
The Python documentation for "str" says "str() : Return a string containing a nicely printable representation of an object." However, there's no mention of the fact that "str" of a Unicode...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
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...
0
Oralloy
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,...
0
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,...

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.