Originariamente inviato da Macgiglio
Mi aiutate a tradurre in java questo codice visto che non so come sostituire alcune funzioni?
Potrei anche tradurtelo ma dovrei sapere meglio una cosa sul formato dei dati. Va bene lo stesso se te lo spiego a parole??

Innanzitutto la funzione che hai postato è parecchio misera .... nel senso che non fa nemmeno alcun controllo degli errori. Ma a parte questo, si capisce che cosa fa.

Gestisce la lettura di un file binario che ha la seguente struttura: un int per il numero di colonne, poi un int per il numero di righe e quindi NxM valori float. La matrice bidimensionale la crea come "array di puntatori ad array". Concettualmente la stessa cosa che succede in Java. Alla fine restituisce il puntatore all'array principale. E inoltre, visto che in C/C++ è possibile, restituisce il numero di righe e colonne attraverso i puntatori passati come parametri.

Vediamo la traduzione in Java: innanzitutto devi istanziare un FileInputStream. Esso ti permette però solo di leggere byte "crudi" e quindi risulta molto utile, nel tuo caso, metterlo dentro un DataInputStream, che ha metodi es. readInt(), readFloat() ecc...

A quel punto leggi numeri di colonne e di righe ed istanzi un array. In Java è molto più facile, perché puoi fare new float[righe][colonne] e sei a posto!!!
Quindi fai un doppio ciclo for annidato per leggere NxM float. Nota una cosa: nel codice che hai postato fa 1 solo ciclo for e invece del for annidato fa una cosa resa possibile dalla fread, ovvero legge un blocco di N byte lungo dimensione_float*numero_colonne. In Java no, devi proprio fare il doppio ciclo annidato.

Alla fine fai ritornare il reference di tipo float[][] dell'array. Dato un reference di quel tipo, è possibile ottenere tranquillamente il numero di righe e pure il numero di colonne (prendendo per buono che la matrice sia rettangolare!). Quindi non sarebbe necessario restituire numero di righe/colonne. Se vuoi puoi farlo, ma non come in C/C++. O crei una classe apposita e restituisci questo oggetto oppure ti fai passare un oggetto e su quello invochi dei setQualcosa per assegnare i valori.

Nota finale, quello che dicevo all'inizio sul formato dei dati: l' "endian" dei dati quale è?? Perché in C/C++ dipende dalla piattaforma. Un valore 0x12345678 (int 32 bit) si può scrivere in memoria (ma anche su un file) come sequenza di byte 0x12 0x34 0x56 0x78 (Big Endian) oppure 0x78 0x56 0x34 0x12 (Little Endian).
La classe DataInputStream legge i dati in Big Endian, indipendentemente dalla piattaforma.