logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c#] Konwersja int na char w C# - problem z tablicą char w RS232

misiek1994 04 Lis 2011 15:11 1765 7
REKLAMA
  • #1 10100198
    misiek1994
    Poziom 17  
    Posty: 350
    Pomógł: 12
    Ocena: 7
    Witam! Od niedawna zacząłem programować w c#. Korzystam z visual studio.
    Chciałem zrobić proste sterowanie po rs232, jednak mam drobne problemy z konwersją między typami danych.
    Mam tablice char 8 elementową. Jeżeli zrobię coś takiego:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    wszystko jest ok. Natomiast, jeżeli spróbuję ze zmiennej int zrobić coś takiego
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    wszystko się psuje.
    Prosiłbym o pomoc i wyrozumiałość :D
  • REKLAMA
  • #2 10100258
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    misiek1994 napisał:
    ...wszystko się pieprzy...D

    A używając bardziej fachowej terminologi??

    Poza tym, czemu ma służyć
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    ?
    int jest słowem kluczowym więc nie mogłeś nazwać tak zmiennej, kompilator zabrania, więc jeżeli nie jest to pseudo-kod, to co autor miał na myśli??
  • REKLAMA
  • #3 10105150
    misiek1994
    Poziom 17  
    Posty: 350
    Pomógł: 12
    Ocena: 7
    Przepraszam, wyraziłem się dosyć niejasno:
    1. int -> zmienna int
    2. zmienna_int%10 - do chara mogę wpisać tylko cyfrę, a nie całą liczbę 2, lub więcej cyfrową, więc stąd to mod 10.
    3. psuje się = nie działa jak powinno
    4. problem rozwiązany ("ominięty" jest w sumie lepszym słowem) poprzez rzutowanie w sposób:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Dziękuje za pomoc i pozdrawiam
    misiek1994
  • Pomocny post
    #4 10105751
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Nie chcę Cię martwić (bo jeżeli Twój kod działa jak powinien to OK), ale to co robisz w pierwszym poście 1 i 3 nie jest sobie tożsame.

    Kod w #1 jest jak najbardziej prawidłowy. Typ char to dla platformy .NET tak naprawdę 16-to bitowa liczba z zakresu 0...65535

    Więc taki kod:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    zapisze Ci do tablica[5] liczbę 4.

    Natomiast kod #3:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    tak naprawdę do liczby 4 dodaje liczbę 48 (reprezentacja liczbowa ASCII znaku '0'), a do tablica[5] zapisuje wartość 52 (rzutowaną jako char).


    Prawdopodobnie sądzisz, że kod #1 "nie działa jak powinno", bo polecenie w stylu:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    nie wyświetla Ci 4? Tak, bowiem wyświetla Ci znak o kodzie ASCII = 4. Do tego w zasadzie typ char został stworzony.

    Jeżeli chcesz to zrobić poprawniej, to po "przesłaniu" tablicy char musisz "odzyskać" jej właściwy typ, tzn.
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    albo, żeby nie bawić się w to rzutowanie przy wyświetlaniu, tak:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Wtedy do tablicy nie zapisujesz liczby 4, a jej reprezentację ASCII (czyli właśnie liczbę 52).
  • #5 10106154
    misiek1994
    Poziom 17  
    Posty: 350
    Pomógł: 12
    Ocena: 7
    Przyznam, że jestem trochę zaskoczony. W c++ wygląda to ciut inaczej.
    Mógłbyś mi w takim razie powiedzieć czym się różni to rzutowanie "(char)", od "Convert.ToChar"?
  • REKLAMA
  • #6 10106259
    kuba1im
    Poziom 19  
    Posty: 284
    Pomógł: 23
    Ocena: 31
    A jak według kolegi wygląda to w C++? rzutowanie to rzutowanie, ważniejsza jest idea. Char to też liczba. Rzutując int na char rzutujesz liczbę na liczbę. Zamieniasz tylko jej wartość. Czy podczas tego tematu kolega zajrzał może jak wygląda tablica ascii? Chyba nie, bo wtedy kolega lepiej zrozumiałby idee swojego działania.
  • REKLAMA
  • Pomocny post
    #7 10106366
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Zasadniczo, rzutowanie (char) i inne, podobne rzutowania, nie konwertują niczego, a jedynie mówią kompilatorowi, żeby traktował zmienną jako zmienną jakiegoś określonego typu. Tak jakby dać mu zamknięte pudełko i powiedzieć: nie widzisz co jest w pudełku, ale ja Ci mówię że jest tam dynamit, więc traktuj to pudełko jak pudełko z dynamitem. :)

    Konwersja z użyciem Convert() z kolei działa w ten sposób, że próbuje zmienić jeden typ w drugi. Tak jakby dać kompilatorowi kłębek wełny i powiedzieć: masz kłębek wełny, spróbuj mi zrobić z tego szalik. A on albo zrobi i powie OK, albo nie zrobi i powie: nie da się, za mało wełny :)

    Wracając do technicznej części, przyjrzyj się temu przykładowi:
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Inny przykład to traktowanie wartości null:
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Tyle jeżeli chodzi o różnice w rzutowaniu i konwersji, natomiast Twój problem polega na czy innym. Chodzi o to, jaką liczbę tak naprawdę do tablicy zapisujesz.
    Skoro, jak piszesz, wynikiem działania zmienna_int % 10 jest liczba 4, to powinieneś przesyłać w tablicy liczbę 4, a tymczasem dodając + '0' przesyłasz 52.

    Uruchom i przeanalizuj przykład, może coś rozjaśni:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Podejrzyj też tablicę ASCII (pierwszy link z googla) i zobacz jaką wartość DEC ma znak '0'.
  • #8 10106422
    misiek1994
    Poziom 17  
    Posty: 350
    Pomógł: 12
    Ocena: 7
    kuba1im napisał:
    A jak według kolegi wygląda to w C++? rzutowanie to rzutowanie, ważniejsza jest idea. Char to też liczba. Rzutując int na char rzutujesz liczbę na liczbę. Zamieniasz tylko jej wartość. Czy podczas tego tematu kolega zajrzał może jak wygląda tablica ascii? Chyba nie, bo wtedy kolega lepiej zrozumiałby idee swojego działania.

    Może kolega zajrzał skoro napisał to samo w C i o dziwo działało.
    Problem nie leżał w tym, że nie rozumiałem jak znakowi może być przyporządkowana liczba(jeżeli chodzi o char), lecz w konwersji między zmienną int, która była używana do ustalanie pewnego położenia, a zmienną char, która to była przesyłana UART'em. Generalnie dzięki koledze marcinj12 dużo rzeczy się wyjaśniło, za co dziękuje.

Podsumowanie tematu

✨ Użytkownik napotkał problem z konwersją typu int na char w C# podczas pracy z tablicą char w kontekście komunikacji RS232. Początkowo próbował przypisać wartość z zmiennej int do tablicy char, co prowadziło do nieoczekiwanych rezultatów. Po wyjaśnieniach dotyczących rzutowania i konwersji, użytkownik znalazł rozwiązanie, stosując rzutowanie z dodaniem wartości ASCII znaku '0', co pozwoliło na poprawne przypisanie cyfry do tablicy. Dyskusja obejmowała różnice między rzutowaniem a konwersją oraz zrozumienie reprezentacji znaków w systemie ASCII.
Wygenerowane przez model językowy.
REKLAMA