chars subtrahieren?



  • Hallo,

    ich habe ein kleines Problem das so trivial ist, dass ich es selbst nicht glauben kann. Scheinbar stehe ich heute auf dem Schluch drum brauch ich eure Hilfe.

    Ich will lediglich zwei characters von einender subtrahieren und anschließend einen int zu dem subtrahierten Wert hinzu zählen.

    So in etwa:

    char const a, b;
    int        ret, c, d;
    
    ret = (a - b) + (c - d) * 12;
    

    leider kann ich nicht die ganzzahligen Werte der charakters subtrahieren, da kommt nur mißt raus.

    Weis einer ein Vorschlag, oder hat meinen Fehler erkannt. 🙂

    Danke schonmal fürs überlegen 😉

    codeman



  • Klar kannst du die char's normal verrechnen, das ist unter C ein ganz normaler Ganzzahltyp (mit mindestens 8 Bit Größe). Allerdings mußt du dabei unterscheiden zwischen dem dargestellten Zeichen und dem zugehörigen ASCII-Wert.



  • Hi CStoll,

    denk ich mir doch auch. Also stehe ich doch nicht auf dem Schlauch.

    Prob ist:

    Ich übergebe aus einer HTML -> FORM daten an ein CGI Script. Dieses Script liest einen Wert von 1 bis 12 in einen u_char ein. Sobald ich über 9 komme, z.B 12, kann nur noch 1 dargestellt werden. Was mein Subtraktion natürlich verfälscht.

    Verstehe aber nicht ganz wieso das so ist, heist wie man es vermeiden kann, da ich eine Struktur vorgegeben habe wo der Monat ein u_char ist. Der muss doch über 9 gehen 😕

    Schon viel zu lang kein reines C mehr gemacht, und total versaut von C++ 😉

    Thx schonmal

    codeman



  • Du bekommst da vermutlich kein char (das kann nur ein einzelnes Zeichen aufnehmen), sondern ein char* (Zeiger auf char-Array) - und den mußt du erst einmal in einen int konvertieren (z.B. per sscanf() oder atoi()).

    (in der C++ FAQ gibt es einen Beitrag zur Konvertierung Zahl nach String und zurück)



  • Hi, sag mal welchen Wert deine Variablen in diesem Fall haben. So auf anhieb würde ich auch kein Problem erkennen.



  • Ist richtig,

    ich bekomme einen char const * von der CGI-Get funktion zurück.
    Würde aber doch dann heißen ich müsste diesen mit atoi(basis 10) in einen int wandeln, und anschließend diesen wieder mit itoa() in einen charakter um die Subtraktion realisieren zu können, wenn ich dich richtig versanden habe. 😞

    Edit zu Herrmann: Ich denke CStoll hat schon recht, da der Wert 12 in zwei char's gespeichert werden muss und somit einen char * braucht, nur ist das ja ganz schön rechenintensiv wie ich das so sehe.

    codeman



  • Fast: Du wandelst deinen String per atoi() um, rechnest mit dem zurückgegebenen int-Wert - und ganz am Ende kannst du bei Bedarf das Endergebnis zurückwandeln in char*.



  • Leider kann ich das nicht 🙄 ,
    wär mir lieb so, aber ich muss den wert auf den der char * verweist in die u_char Strukturkomponente drücken, da mit dieser Struktur (ähnlich wie CDate in der MFC) andere Funktionen rechnen müssen. Ich für meinen Teil würde es gerne über den gewandelten char * machen, nur brauche ich diese Funktionen für Differenzberechnung von mehreren Datums, etc.

    Gibt es den keine Möglchkeit einen Wert der 2 charakter braucht so zu wandeln das man Ihn subtrahieren kann. Sei es auch als Ascii-Wert eines chars.



  • Bist Du Dir darüber im Klaren was in der u_char Struktur drinstehen soll? Die Zahl als Textinterpretation (Aneinanderreihung der Zeichen '0' bis '9') oder die Zahl binär (pro char 0-255 Werte)? 😕

    Ersteres beispielhaft:

    const char *zahlS = "125";
    u_char feld[4];
    
    memcpy(feld, zahlS, strlen(zahlS));
    

    Sowie zweiteres beispielhaft:

    const char *zahlS = "125";
    int zahlI = atoi(zahlS);
    u_char feld[sizeof(int)];
    memcpy(feld, zahlI, sizeof(int));
    

    EDIT: Die Reihenfolge der Wertigkeiten bekommt man durch Bitoperationen oder einzelkopieren/reinterpretieren verrückt usw, will erstmal nur feststellen was Du da brauchst 😉



  • Problem ist, ich muss den Monat 12 in einem u_char speichern.

    Jetzt hat man zwei monate z.B. 10 und 12, beide sind u_chars. Diese sollen nun von einander subtrahiert werden z.B 12 - 10 und ein int aufaddiert werden. Alles zusammen in einem int speichern, fertig.

    die Monate kommen über einen char * rein:

    monat1 vereist auf char[3] mit 12 enthalten und endenull
    monat2 vereist auf char[3] mit 10 enthalten und endenull
    
    funk(char *pmonat1, char *pmonat2)
    {
     u_char m1, m2;
     int diff;
    
     m1 = *pmonat1  --------> hier ist das prolem !!!!
     m2 = *pmonat2  --------> hier ist das prolem !!!!
    
     diff = m1 - m2 * 12         -> z.B
    

    Edit: Wieso das ein problem ist, ist mir klar, nur weis ich nicht wie ich das mit den u_char sonst machen kann.



  • Also möchtest Du die Zahlen die als String gespeichert sind als 8-Bit interpretieren?

    const char *monat1 = "12";
    int zahl1 = atoi(monat1); // zahl == 12
    u_char zahl1_als_byte = (u_char)zahl; // wird abgeschnitten, sollte zahl größer als 255 sein
    
    const char *monat2 = "10";
    int zahl2 = atoi(monat2);
    u_char zahl2_als_byte = (u_char)zahl2;
    
    int ergebnis = (zahl2_als_byte - zahl1_als_byte) + aufaddier_int;
    


  • LordJaxom schrieb:

    Also möchtest Du die Zahlen die als String gespeichert sind als 8-Bit interpretieren?

    const char *monat1 = "12";
    int zahl1 = atoi(monat1); // zahl == 12
    u_char zahl1_als_byte = (u_char)zahl; // wird abgeschnitten, sollte zahl größer als 255 sein
    
    const char *monat2 = "10";
    int zahl2 = atoi(monat2);
    u_char zahl2_als_byte = (u_char)zahl2;
    
    int ergebnis = (zahl2_als_byte - zahl1_als_byte) + aufaddier_int;
    

    Ja so haut das hin 😃 ,

    danke für den Tip. Da die Werte nur Datumswerte(Tag und Monat) ist sichergestellt, dass sie nicht über 255 kommen und dann kann ich das so machen.
    Das Jahr ist ein short und somit nicht in dieser konvertierung zu berücksichtigen. Klasse und vielen Dank auch. 🙂

    Greetings codeman


Anmelden zum Antworten