Re: how to make it work

Liste des GroupesRevenir à l c 
Sujet : Re: how to make it work
De : fir (at) *nospam* grunge.pl (fir)
Groupes : comp.lang.c
Date : 29. Aug 2024, 18:14:02
Autres entêtes
Organisation : i2pn2 (i2pn.org)
Message-ID : <6bf43388709343a5e6ab0079b0e5c75b93436913@i2pn2.org>
References : 1 2
User-Agent : Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0 SeaMonkey/2.24
Ben Bacarisse wrote:
fir <fir@grunge.pl> writes:
>
Ben Bacarisse wrote:
fir <fir@grunge.pl> writes:
>
see such code
>
>
long long unsigned tag ;
>
void foo(long long unsigned tag)
{
   if(tag=='warsaw') printf("\nwarsaw");
   if(tag=='paris')  printf("\nparis");
   if(tag=='new york') printf("\nnew york");
   if(tag=='old york') printf("\nold york");
   if(tag=='very old york') printf("\nvery old york");
>
>
}
>
int main(void)
{
   foo('warsaw');
   foo('paris');
   foo('new york');
   foo('old york');
   foo('very old york');
>
   return 'bye';
}
>
and maybe guess the result (or how it should be)
(later i may tell you)
>
the problem is how to make it work i want to use that kind of
'tags' and would like to use it assuming at least 8 characters
work okay i mean the code above would "catch" only on proper tag and
each one would be printed one time
>
right now it dont - is thsi a way to make it work
(maybe except the last one as i understand
   if(tag=='old york') printf("\nold york");
   if(tag=='very old york') printf("\nvery old york");
may be treated as the same
>
(i need it to work on 32 bit old mingw/gcc)
>
That's unfortunate because this can be done in a portable and relatively
convenient way in modern C:
>
#include <stdint.h>
#include <stdio.h>
>
typedef union {
       unsigned char bytes[sizeof (uint64_t)];
       uint64_t tag;
} Tag;
>
void foo(Tag t)
{
       if (t.tag == (Tag){"warsaw"}.tag)
            printf("warsaw\n");
}
>
int main(void)
{
       foo((Tag){"warsaw"});
}
>
With a little bit more work, you can get this to work in older C without
compound literals.
>
But depending on what your ultimate goal is, you might want to look at
how Lisp implementations "intern" their symbols.  That can avoid the
obvious length limitations while making for very efficient equality
comparisons.
>
i want it in classic c
>
Why?  Compound literals are a quarter of a century old.
>
- my example work on up to 4 lellets/digits/signs
but i dont know how to make it work for 8
>
"Classic" C's character constants are of type int and classic C's ints
are 16 or 32 bits wide.  There is no getting round that.
>
A macro like this (with your own choice of old type in the casts)
>
#define TAG(s) ((uint64_t)(s[0])                       | \
                 (uint64_t)(s"\0"[1])             <<  8 | \
                 (uint64_t)(s"\0\0"[2])           << 16 | \
                 (uint64_t)(s"\0\0\0"[3])         << 24 | \
                 (uint64_t)(s"\0\0\0\0"[4])       << 32 | \
                 (uint64_t)(s"\0\0\0\0\0"[5])     << 40 | \
                 (uint64_t)(s"\0\0\0\0\0\0"[6])   << 48 | \
                 (uint64_t)(s"\0\0\0\0\0\0\0"[7]) << 56)
>
might just about do, but you can't get 64-bit integers using '...'
character constants.
>
as even old c has 64 bit unsigned i guess it should work, but dont know how
to make it work
>
Some (but not all) old C compilers support 64 bit integer types, but
'...' constants are always of type int.
>
bad news sorta hard to belive (as it could work in 64 bit version imo
- is this for sure not working? maybe some gcc extension at least?

Date Sujet#  Auteur
29 Aug 24 * how to make it work12fir
29 Aug 24 +* Re: how to make it work6Ben Bacarisse
29 Aug 24 i`* Re: how to make it work5fir
29 Aug 24 i +* Re: how to make it work2Ben Bacarisse
29 Aug 24 i i`- Re: how to make it work1fir
29 Aug 24 i `* Re: how to make it work2James Kuyper
29 Aug 24 i  `- Re: how to make it work1fir
29 Aug 24 +* Re: how to make it work2Kaz Kylheku
29 Aug 24 i`- Re: how to make it work1fir
29 Aug 24 `* Re: how to make it work3Bonita Montero
29 Aug 24  `* Re: how to make it work2fir
31 Aug 24   `- Re: how to make it work1Bonita Montero

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal