#!/usr/bin/env python3 """ Narzędzie do tworzenia plików .mar """ import struct import sys class MultiArrayWriter: def __init__(self, dimensions): """ dimensions: list of ints, np. [3, 4, 2] dla tablicy [3][4][2] """ self.dimensions = dimensions self.total_elements = 1 for dim in dimensions: self.total_elements *= dim self.data = {} # sparse: flat_index -> (type, value) def write_int(self, f, value): f.write(struct.pack('= self.dimensions[i]: raise ValueError(f"Index {i} out of bounds: {idx} (max: {self.dimensions[i]-1})") flat_index = self.indices_to_flat(indices) self.data[flat_index] = (var_type, value) def set_int(self, indices, value): self.set(indices, 1, value) def set_string(self, indices, value): self.set(indices, 2, value) def set_bool(self, indices, value): self.set(indices, 3, value) def set_double(self, indices, value): self.set(indices, 4, value) def save(self, filepath): """Zapisuje do pliku .mar""" with open(filepath, 'wb') as f: # Liczba wymiarów self.write_int(f, len(self.dimensions)) # Rozmiary wymiarów for dim in self.dimensions: self.write_int(f, dim) # Zapisz elementy (posortowane po indeksie) for flat_index in sorted(self.data.keys()): var_type, value = self.data[flat_index] self.write_int(f, flat_index) self.write_variable(f, var_type, value) print(f"Saved to {filepath}") print(f" Dimensions: {self.dimensions}") print(f" Total slots: {self.total_elements}") print(f" Filled slots: {len(self.data)}") print(f" Fill rate: {100*len(self.data)/self.total_elements:.1f}%") def example_usage(): """Przykład użycia""" # Stwórz tablicę 2D [5][3] mar = MultiArrayWriter([5, 3]) # Wypełnij danymi mar.set_string([0, 0], "Reksio") mar.set_int([0, 1], 123) mar.set_double([1, 2], 3.14159) mar.set_bool([2, 0], True) mar.set_string([4, 2], "Koniec!") # Zapisz mar.save('/tmp/example.mar') if __name__ == '__main__': if len(sys.argv) > 1 and sys.argv[1] == '--example': example_usage() else: print("MultiArray Writer - narzędzie do tworzenia plików .mar") print() print("Użycie w kodzie:") print() print(" from mar_writer import MultiArrayWriter") print() print(" # Stwórz tablicę [3][4][2]") print(" mar = MultiArrayWriter([3, 4, 2])") print() print(" # Ustaw wartości") print(" mar.set_string([0, 0, 0], 'Hello')") print(" mar.set_int([1, 2, 1], 42)") print(" mar.set_double([2, 3, 0], 3.14)") print(" mar.set_bool([0, 1, 1], True)") print() print(" # Zapisz") print(" mar.save('output.mar')") print() print("Uruchom z --example aby stworzyć przykładowy plik")