Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana liczby na znak ASCII

Ostatnio zmodyfikowano 2013-08-04 14:24
Autor Wiadomość
unimator
» 2013-08-03 15:40:47
No autor tematu chyba domyśli się skąd ta 4 i co oznacza. Pisałem to na szybko, na tyle poprawnie aby można było zrozumieć o co chodzi a nie skopiować, wkleić i używać ;p.
P-89396
Berux
» 2013-08-03 15:57:26
Można po prostu zrobić to tak:
C/C++
int main()
{
    int var = 0;
    unsigned i;
    for( i = 0; i < sizeof( int ); ++i )
    {
        *(( char * ) & var + i ) = 'a' + i;
    }
   
    for( i = 0; i < sizeof( int ); ++i )
    {
        printf( "%c", *(( char * ) & var + i ) );
    }
    printf( "\n" );
   
    return 0;
}
Wtedy będzie to uniwersalne ;).
P-89397
Brezniew
» 2013-08-03 23:35:29
Zadeklaruj se
#define __char__( x, i )    ((( char * )&( x ))[ i ])
 do x podajesz wskaźnik do zmiennej dowolnego typu danych, a do i licząc od zera odczytujesz kolejne znaki. np.
C/C++
#include <cstdio>

#define __char__( x, i )    ((( char * )&( x ))[ i ])

int main()
{
    long zmienna = 1633973089;
    for( int i = 0; i < 4; i++ )
         printf( "%c", __char__( zmienna, i );
   
    return 0;
}

Lepiej nierób z tego żadnej funkcji bo to tylko spowolni twój kod.
P-89413
Mrovqa
» 2013-08-04 09:47:41
Lepiej nierób z tego żadnej funkcji bo to tylko spowolni twój kod.
Słyszałeś o inline? Nie wiem jak z constexpr, ale tu już raczej się nie załapie - nie testowałem :)

/edit:
Jednak też działa - tak jak myślałem :) W końcu adres zmiennej jest znany podczas kompilacji.
http://ideone.com/gxyshE
P-89418
Monika90
» 2013-08-04 11:41:48
@up
error: the value of 'a' is not usable in a constant expression
note: 'int a' is not const

A po zmianie typu a na const int
  in constexpr expansion of 'char_(1633837924, 1)'
error: '(char*)(&1633837924)' is not a constant expression
P-89429
Brezniew
» 2013-08-04 12:18:29
Z żebyś nie robił z tego funkcji to miałem na myśli z tej jednej linijki ale możesz zrobić tak:

C/C++
#include <iostream>

#define __char__( x, i ) ((( char * )( x ))[ i ])

void funkcja( void * ptr, size_t size )
{
    int i;
    for( i = 0; i < size; i++ )
         std::cout << __char__( ptr, i );
   
}

int main()
{
    long zmienna;
    std::cin >> zmienna;
    funkcja( & zmienna, sizeof( long ) );
    return 0;
}

I wtedy nie musisz na sztywno ustalać zmiennej przy kompilacji oraz ilości znaków.
P-89433
pekfos
» 2013-08-04 12:21:28
Nazwy zawierające podwójne podkreślenie są zarezerwowane.

W końcu adres zmiennej jest znany podczas kompilacji.
Nie jest znany.
P-89434
Mrovqa
» 2013-08-04 12:43:31
Nie jest znany.
No właśnie zastanawiałem się co z ALSR, bo to się kompilowało...
P-89442
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona