Probléme avec les tableaux de byte de taille fixe
chesterC2518
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
j'ai un problème au niveau d'affectation dans un tableaux, j'essaye maintenant d'implémenter une méthode pour générer deux tableaux LogTable and AntiLogTable pour le corps fini de Galois, voila le code:
mon probléme ce se pose au niveau de cette partie:
lorsque la boucle ou l'indice c dépasse l'indexe du logTable par exemple c = 25 et je veux affecter une valeur à la case 2 du log table, cela ça ne marche pas je pense que le problème est au niveau de gestion de mémoire, alors je cherche une autre solution, j'ai essayé comme vous avez vu sur le code le ArrayList mais aussi ce dernier est un tableau dynamique alors du coup je reçois des exception: IndexOutOfBounds, c'est logique parce que l'arraylist doit étre initialiser à l'avance.
Merci de me donner quelques Idée sur comment faire, j'ai passé deja une journnée en essayant de trouver une sol.
NB: je travail sur lo mobile phone, alors j'ai ignoré les solutions couteuses en terme de mémoire ou CPU.
Grand Merci
j'ai un problème au niveau d'affectation dans un tableaux, j'essaye maintenant d'implémenter une méthode pour générer deux tableaux LogTable and AntiLogTable pour le corps fini de Galois, voila le code:
static void generate_tables() { ArrayList<Byte> antiLogTable = new ArrayList<Byte>(256); ArrayList<Byte> logTable = new ArrayList<Byte>(256); logTable.add(0,(byte)0); //antiLogTable = new byte[256]; //logTable = new byte[256]; short c; byte a = 1; byte d; for(c=0;c<256;c++) { antiLogTable.add((byte) a); //[c] = (byte) a; /* Multiply by three */ d = (byte) (a & 0x80); a <<= 1; if(d != 0) { a ^= 0x1b; } a ^= antiLogTable.get(c); /* Set the log table value */ System.out.println(antiLogTable.get(c)); logTable.add(Byte2Short(antiLogTable.get(c)),Short2Byte(c)); //logTable[Byte2Short(antiLogTable[c])]=Short2Byte(c); //ltable[atable[c]] = c; // System.out.print(Byte2Short(antiLogTable[c])+","); System.out.println(Byte2Short(antiLogTable.get(c))+":"+Short2Byte(c)+":"+Byte2Short(logTable.get(c))+","); } antiLogTable.add(antiLogTable.get(0)); logTable.add(0,(byte) 0); }
mon probléme ce se pose au niveau de cette partie:
//logTable[Byte2Short(antiLogTable[c])]=Short2Byte(c);
lorsque la boucle ou l'indice c dépasse l'indexe du logTable par exemple c = 25 et je veux affecter une valeur à la case 2 du log table, cela ça ne marche pas je pense que le problème est au niveau de gestion de mémoire, alors je cherche une autre solution, j'ai essayé comme vous avez vu sur le code le ArrayList mais aussi ce dernier est un tableau dynamique alors du coup je reçois des exception: IndexOutOfBounds, c'est logique parce que l'arraylist doit étre initialiser à l'avance.
Merci de me donner quelques Idée sur comment faire, j'ai passé deja une journnée en essayant de trouver une sol.
NB: je travail sur lo mobile phone, alors j'ai ignoré les solutions couteuses en terme de mémoire ou CPU.
Grand Merci
A voir également:
- Probléme avec les tableaux de byte de taille fixe
- Comment réduire la taille d'un fichier - Guide
- Malware byte - Télécharger - Antivirus & Antimalwares
- Reduire taille image - Guide
- Afficher taille dossier windows - Guide
- Tableaux croisés dynamiques - Guide
2 réponses
Bonjour,
"j'ai ignoré les solutions couteuses en terme de mémoire ou CPU"
ArrayList<Byte> est alors un très mauvais choix en terme de consommation mémoire, en comparaison d'un byte[] par exemple.
De plus quel intérêt d'avoir des méthodes Byte2Short et Short2Byte alors que ce sont deux types de données interchangeables (au cast près) ?
Quant à ton problème c'est que tu as l'air de penser que
Donc quand tu fais un get(3) alors que la liste n'a que 2 éléments, forcément ça plante.
"j'ai ignoré les solutions couteuses en terme de mémoire ou CPU"
ArrayList<Byte> est alors un très mauvais choix en terme de consommation mémoire, en comparaison d'un byte[] par exemple.
De plus quel intérêt d'avoir des méthodes Byte2Short et Short2Byte alors que ce sont deux types de données interchangeables (au cast près) ?
Quant à ton problème c'est que tu as l'air de penser que
new ArrayList<Byte>(256)va créer une liste de 256 éléments, alors qu'en fait la liste est vide au départ, c'est la capacité de la liste (sa taille interne) qui est réservée à 256.
Donc quand tu fais un get(3) alors que la liste n'a que 2 éléments, forcément ça plante.
Bon, je ne suis pas bien sûr d'avoir compris le but du programme, dans un premier temps j'utilise des short pour permettre de ne pas trop s'embêter avec les byte négatifs, c'est juste le temps de mettre en place les tableaux, car ce sera le plus efficace.
Quelques remarques au passage :
Si tu veux optimiser la consommation mémoire, déclares tes variables au dernier moment, au plus près du code où tu l'utilises, ça éviteras d'avoir à la mettre en mémoire à un moment où tu n'en as pas encore besoin, et de la libérer dès qu'elle n'a plus lieu d'être.
Je sais pas exactement ce que tu as voulu faire avec le code suivant, mais s'il s'agit vraiment d'une multiplication de deux bytes, je laisserai Java s'en occuper tout seul, le processeur sait gérer nativement la multiplication d'entiers, pas besoin de lui refaire programmatiquement.
Si tu fais des concaténations de String, tu vas perdre de la mémoire car les String ne sont jamais modifiés, un nouveau String est créé pour obtenir le résultat de la concaténation. Si tu fais
Et enfin, comme tu fais des ajouts add(i,x) avec ArrayList j'ai supposé que tu voulais insérer des éléments (exemple
Bref, pas mal d'incompréhension sur ton code actuel et ton objectif pour t'aider, et tes dernières explications ne m'aident pas beaucoup, c'est assez confus.
Voici une version avec des tableaux plutôt que des listes, mais le résultat est à mon avis très loin de ce que tu attends... peut-être qu'en expliquant plus clairement ton problème on pourrait repartir de zéro avec ton code et que ce serait plus proche de ce que tu souhaites.
Quelques remarques au passage :
Si tu veux optimiser la consommation mémoire, déclares tes variables au dernier moment, au plus près du code où tu l'utilises, ça éviteras d'avoir à la mettre en mémoire à un moment où tu n'en as pas encore besoin, et de la libérer dès qu'elle n'a plus lieu d'être.
Je sais pas exactement ce que tu as voulu faire avec le code suivant, mais s'il s'agit vraiment d'une multiplication de deux bytes, je laisserai Java s'en occuper tout seul, le processeur sait gérer nativement la multiplication d'entiers, pas besoin de lui refaire programmatiquement.
// Multiply by three byte d = (byte) (a & 0x80); a <<= 1; if (d != 0) { a ^= 0x1b; } a ^= antiLogTable.get(c);
Si tu fais des concaténations de String, tu vas perdre de la mémoire car les String ne sont jamais modifiés, un nouveau String est créé pour obtenir le résultat de la concaténation. Si tu fais
alt+":"+c+":"+lt+","tu auras donc des String intermédiaires pour
alt+":",
alt+":"+c,
alt+":"+c+":",
alt+":"+c+":"+ltet
alt+":"+c+":"+lt+","ça commence à faire pas mal de perte de mémoire juste pour un affichage...
Et enfin, comme tu fais des ajouts add(i,x) avec ArrayList j'ai supposé que tu voulais insérer des éléments (exemple
[1,2,3,4].add(2, 5)=[1,2,5,3,4]), mais du coup je ne comprends pas tes affichages puisqu'ils affichent l'ordre au fur et à mesure en sachant qu'il va être modifié par la suite...
Bref, pas mal d'incompréhension sur ton code actuel et ton objectif pour t'aider, et tes dernières explications ne m'aident pas beaucoup, c'est assez confus.
Voici une version avec des tableaux plutôt que des listes, mais le résultat est à mon avis très loin de ce que tu attends... peut-être qu'en expliquant plus clairement ton problème on pourrait repartir de zéro avec ton code et que ce serait plus proche de ce que tu souhaites.
static void generate_tables() { short[] antiLogTable = new short[256]; short antiLogTableSize = 0; short[] logTable = new short[256]; short logTableSize = 0; // add(0,0) logTableSize++; logTable[0] = 0; short a = 1; for (short c = 0; c < 255; c++) { // add(a) antiLogTable[antiLogTableSize++] = a; // Multiply by three ??? a = (short) ((3 * a) % 256); /* * short d = (short) (a & 0x80); a <<= 1; if (d != 0) { a ^= 0x1b; } a ^= antiLogTable[c]; */ System.out.println(antiLogTable[c]); // add(c, c) for (short s = logTableSize; s > c; s--) logTable[s] = logTable[s - 1]; logTable[c] = c; logTableSize++; System.out.print(antiLogTable[c]); System.out.print(':'); System.out.print(c); System.out.print(':'); System.out.print(logTable[c]); System.out.println(','); } // add(anti[0]) antiLogTable[antiLogTableSize++] = antiLogTable[0]; // add(0,0) for (short s = 255; s > 0; s--) logTable[s] = logTable[s - 1]; logTable[0] = 0; logTableSize++; System.out.println(Arrays.toString(logTable)); System.out.println(Arrays.toString(antiLogTable)); }
en fait est ce qu'il y'a une propositions à faire pour fixer ce probléme de gestion de mémoire, j'ai jamais eu ce problème avec d'autres langages.
D'ailleurs l'exception est parlante "IndexOutOfBoundsException: Index: 3, Size: 2"
Une liste ça a 0 élément au départ, et sa taille augmente au fur et à mesure que tu ajoutes des éléments, si tu accèdes à l'élément 3 alors que la liste n'en a que 2 ça plante, c'est ce que j'ai déjà dit tout à l'heure !
Quant à ton problème de conversion entre short et byte c'est un faux problème, quand on voit que tu utilises des Byte de 16 octets, je ne vois pas pourquoi un short de 2 octets te fait peur...
2- je ne sais qu'est ce que tu veux dire avec ça " byte c'est un faux problème, quand on voit que tu utilises des Byte de 16 octets", alors qu'un byte est = 1 octet .... un short = 2, alors que le stockage du 2eme est inutile si j'en ai besoin seulement de 8 bits.
3- mon problème est clair dans cette ligne du code (obliant les arrayList c'est juste un essai).
logTable[Byte2Short(antiLogTable[c])]=Short2Byte(c);
c'est simple on peut l'appeler une insertion aléatoire dans un tableau fixe. Alors lorsque le compteur c dépasse une certaine valeur ex 20 alors je ne peux pas revenir en arrière et affecter une valeur dans la case exemple 2.