Probléme avec les tableaux de byte de taille fixe
Fermé
chesterC2518
Messages postés
7
Date d'inscription
jeudi 25 juin 2015
Statut
Membre
Dernière intervention
26 juin 2015
-
Modifié par KX le 25/06/2015 à 19:37
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 26 juin 2015 à 22:44
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 26 juin 2015 à 22:44
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
- Tableaux croisés dynamiques - Guide
- Reduire taille photo - Guide
- Repondeur free fixe ✓ - Forum Free mobile
2 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
25 juin 2015 à 19:46
25 juin 2015 à 19:46
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.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
26 juin 2015 à 22:44
26 juin 2015 à 22:44
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)); }
25 juin 2015 à 21:12
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.
25 juin 2015 à 21:18
25 juin 2015 à 21:22
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...
26 juin 2015 à 05:10
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.
26 juin 2015 à 05:30