Compiler-Fehler Possible loss of precision bei addition von int und char

xyxyxyxy

Mitglied
Hallo,
ich arbeite derzeit an einem Projekt zur Vigenere-Verschlüsselung und versuche gerade ein zweidimensionales Array zu erzeugen, dass ich als Vigenere-Quadrat nutzen kann. Als IDE benutze ich BlueJ, da wir das in der Schule verwenden müssen.

Mein Problem ist, dass der Compiler mir ein "Possible loss of precision required: char; found: int" auswirft und in der 7. Zeile den + 'A';-Teil markiert. Mittlerweile glaube ich der Fehler ist bestimmt simpel, und ich sehe ihn nur nicht, daher hoffe ich ihr habt eine Idee wo das Problem liegen könnte.

Java:
char buchstabe = 'A';
char buchstabe2;
int verschiebung = 0;
char[][] vigenere = new char[26][26];
for(int z1 = 0; z1 < 26; ++z1){
  for(int z2 = 0; z2 < 26; ++z2){
     buchstabe2 = (buchstabe - 'A' + verschiebung)%26 + 'A';
     vigenere[z1][z2] = buchstabe2;
     ++buchstabe;
  }
  ++verschiebung;
}

LG xyxyxyxy
 

ChristianK

Aktives Mitglied
Nunja, du rechnest folgendes:

char = ( char - char + int ) & int + char;

Ein char ist 16 bit, ein int 32 bit. Ein int ist doppelt so genau.

Wenn du die Verschiebung als short rechnest, hast du kein Problem (ausser, sie übersteigt 2^16/2).
 
Zuletzt bearbeitet:

xyxyxyxy

Mitglied
Habe dem Code in:
Java:
char buchstabe = 'A';
char buchstabe2;
short verschiebung = 0;
char[][] vigenere = new char[26][26];
for(int z1 = 0; z1 < 26; ++z1){
  for(int z2 = 0; z2 < 26; ++z2){
    buchstabe2 = (buchstabe - 'A' + verschiebung)%26 + 'A';
    vigenere[z1][z2] = buchstabe2;
    ++buchstabe;
  }
++verschiebung;
}
geändert, das machte leider keinen Unterschied. Immernoch die gleiche Fehlermeldung mit der gleichen markierten Stelle.
 

ChristianK

Aktives Mitglied
26 ist von Haus auch ein Integer. Ansonsten versuche doch, die Gleichung zu splitten und evt mit byte zu rechnen.
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Hm,

ich habe das gerade nur schnell überflogen aber ich würde mal wetten da fehlt auch noch ein buchstabe='A'; hinter der ersten For-Schleife oder?

Gruß

Claus
 

xyxyxyxy

Mitglied
So,
ich habe endlich die richtige Lösung gefunden. Zuallererst möchte ich mich aber bei ChristianK und Thallius für ihre Hilfe danken, sie gaben mir den richtigen Denkanstoß um eine Lösung zu finden. Der Code sieht jetzt folgendermaßen aus:

Java:
// Vigenere-Quadrat erstellen
        char buchstabe = 'A';
        int buchstabe2;
        char buchstabe3;
        short verschiebung = 0;
        char[][] vigenere = new char[26][26];
        for(int z1 = 0; z1 < 26; ++z1){
            for(int z2 = 0; z2 < 26; ++z2){
                buchstabe2 = buchstabe - 'A';
                buchstabe2 += verschiebung;
                buchstabe2 = buchstabe2 % 26;
                buchstabe2 += 'A';
                buchstabe3 = (char) buchstabe2; // buchstabe 2 wieder in char gecasted (buchstabe3)
                vigenere[z1][z2] = buchstabe3;
                ++buchstabe;
            }
            buchstabe = 'A';
            ++verschiebung;
        }

Wie ihr seht, habe ich den "Possible loss of precision" fehler umgangen, indem ich die rechnung immer wider in einer intgespeichert habe die ich dann in ein char gecastet habe. Das casten war glaube ich das Problem. Ich habe nämlich mit meinem Orginalcode versucht eine implizite Typkonvertierung von einem int in ein char, bzw. von einem höherwertigem in einen niedrigerwertigem Datentyp vorzunehmen, und das geht auschließlich mit einer expliziten Typkonvertierung, bzw. Typcast. Das wird mithilfe der Klammer vor der zu Konvertierenden Variabel getan, in den man den Zieldatentyp eintragen muss:
Java:
buchstabe3 = (char) buchstabe2
Außerdem fehlte noch das von Thallius erwähnte buchstabe = 'A'

LG xyxyxyxy
 

Ähnliche Java Themen

Neue Themen


Oben