LoginSignup
1
0

Zig print関数の表記法(オプション設定)について

Last updated at Posted at 2024-05-29

既にドキュメントがあった。

フォーマット形式の資料が以下にあった。

zig.guideのAdvanced Formatting

調べた時はなかったので仕方がなくソースを見て理解したけど、無駄に終わっちゃった。

はじめに

Zig言語の動作を確認するためにprintを使用し、各データを確認している。
そのprintの表示について、調査したのでここに記述します。

version: 0.12.0
動作環境: MacOs
対象コード: std/fmt.zig

print関数の定義

print関数には以下の二つの定義がある。

  1. std.debug.printの定義
const std = @import("std");
const print = std.debug.print;
// --> io.getStdErr().writer().print

標準エラー出力を使っている。そして、エラーの戻りがない。
io.getStdErr().writer()を呼び出す前にthread間の排他制御(mutex)が入っているので、より安全になっているが、他のthread
と競合する場合があり注意が必要となる。

  1. std.io.getStdOut().writer()からの定義
const std = @import("std");
const stdout = std.io.getStdOut().writer();
const print = stdout.print;

標準出力を使用で、エラー戻りがある。
従って、try print(....)とエラー処理が必要となる。

通常は*2.*の標準出力stdoutを使用すべきだろうが、1. stderrを使用しているのが一般的となっている様だ。

オプション設定

const message: [] const u8 = "print";
const data: u8 = 6;
print("{s} -> {d}: {b}\n", .{message, data, data});		// print -> 6: 110;

""の中の{s}など設定によりデータを表示する方法を変更する。

{}の内容は

	{[argument][specifier]:[fill][alignment][width].[precision]}

となっている。

  1. argument - データのインデックス番号またはデータのフィールドで使われる引数の名前を指定する。
const message: [] const u8 = "print";
const data: u8 = 0x42;
print("{s} -> {d}: {1b}\n", .{message, data});		// print -> 66: 1000010 

{1b}の1が{message, data}のindex0,1の1を指し、dataを意味する。
引数の名前についてはまだわからない。

  1. specifier - 表記方法を指定する。 例、{b}-バイナリー
    {x} - Hex(16進)表示で小文字 例1ffe
    {X} - Hex表示で大文字 例1FFE
    {s} - string表示 例 Hello world
    {e} - 浮動小数点の表示 例 1.234e3
    {d} - デシマル(10進)表示 例 1234
    {b} - バイナリー(2進)表示 例10001010
    {o} - octal(8進)表示 例 2322
    {c} - キャラクタ(Ascii) 1文字表示 例 H
    {u} - UTF-8表示 ???
    {?} - null を含むデータを表示する
    {!} - Error コード表示
    {*} - アドレス表示
    {any} - 配列、構造体などのフォーマットとして定義された表示

  2. fill - widthで指定された文字幅内の空きにセットする文字

  3. alignment - <:左寄せ、^:センター、>:右寄せで文字を詰める方向を指定

print("{b:0>8}", .{6});		// 00000110

{b:0>8}の0:fill,>:alignment、8:widthとなっている。つまり、文字幅を8桁で右詰、空きに0を満たす事となる

  1. width - 表示する文字幅を指定する。

  2. precision - 小数点以下の有効数字

print("dat: {e:.3}\n", .{12.3456});		// 1.235e1

使用例

const std = @import("std");
const print = std.debug.print;

test "sample print function" {
    const deci: u16 = 0x1234;
    const flo: f32 = 12.345;
    const stri: []const u8 = "printing";
    
	print("{1s:<10} : d:{0d:5}\n", .{ deci, stri });	//  printing   : d: 4660
    print(" b:0b{0b:0>16} x:0x{0x:0>4}\n", .{deci});	//  b:0b0001001000110100 x:0x1234
    print(" e:{0e:<8} {0e:<8.3} {0e:<8.1}\n", .{flo});//  e:1.2345e1 1.235e1  1.2e1
}

最後に

現状、Zig言語はprint関数然り、どう使うかのドキュメントがない。そのため、ソースを確認したり実験により調査しました。
参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0