Hi, Diogo! Some unscientific answers..
P1.  Yes, it generate




*struct rbuf { uint32_t cap; uint32_t head; uint32_t tail; crunch_u8vector
buf;};*
sizeof(struct rbuf) = 24  on Intel x86_64

But You can define in scm 'byte' type
(define-type Byte (typename uint8_t))






*(define-struct   rbufv1   (cap Byte)   (head Byte)   (tail Byte)   (buf
bytevector))*

sizeof (struct rbufv1) = 16

also if set on packing struct, for example for serialization of data







*(c-declare "#pragma pack(1)")(define-struct  rbufv2  (cap Byte)  (head
Byte)  (tail Byte)  (buf bytevector))(c-declare "#pragma pack()")*

*sizeof (struct rbufv2) = 11 again on Intel x86_64*

P3. As I understand identifier naming in Crunch is similar to C:
underscores,leadchars+[digits]

сб, 13 сент. 2025 г. в 16:08, Diogo via Chicken-users <
chicken-users@nongnu.org>:

> Dear CRUNCHers, I am trying to create a simple ring buffer and here are a
> few
> issues I encountered.
>
> The ring buffer is supposed to be very small and only contain bytes. It is
> sufficient to have 4 fields: capacity, head, tail, and byte array.
>
> So I thought this would work:
>
>     (define-struct rbuf
>         (cap char)
>         (head char)
>         (tail char)
>         (buf bytevector))
>
> Problem 1: That generates fields with 32 bits, not chars. I am programming
> a
> microcontroller with CRUNCH and I want to have full control over such
> types.
> The following worked, however:
>
>     (define-struct rbuf
>         (cap (typename uint8_t))
>         (head (typename uint8_t))
>         (tail (typename uint8_t))
>         (buf bytevector))
>
> Problem 2: Besides char not enforcing 8 bit fields, I also had the issue
> that
> I forgot to include (crunch aggregate-types) and `chicken-crunch` gives no
> reasonable error (no string) and simply returns an error code != 0.
>
> Problem 3: Next, I want to define accessors. This is probably my fault,
> but the
> following code
>
>     (define-compound-accessors (struct rbuf)
>         (mk-rbuf cap head tail buf)
>         (cap rbuf-cap)
>         (head rbuf-head rbuf-head!)
>         (tail rbuf-tail rbuf-tail!)
>         (buf rbuf-buf))
>
> generates incorrect/unexpected modifier methods, eg, `rbuf-head!` becomes:
>
>     void rbuf_X2dhead_X21(struct rbuf _s, uint8_t _x) { _s.head = _x; }
>
> Only the copy of the struct in the scope of the function gets modified. I
> was
> expecting to see this:
>
>     void rbuf_X2dhead_X21(struct rbuf *_s, uint8_t _x) { _s->head = _x; }
>
>
> Any feedback is appreciated. Thank you in advance!
>
> Best,
> - Diogo
>
>
(import (crunch)
        (crunch c)
        (crunch declarations)
        (crunch aggregate-types))

(define-struct
  rbuf
  (cap char)
  (head char)
  (tail char)
  (buf bytevector))


(define-type Byte (typename uint8_t))
(define-struct
  rbufv1
  (cap Byte)
  (head Byte)
  (tail Byte)
  (buf bytevector))

(c-declare "#pragma pack(1)")
(define-struct
  rbufv2
  (cap Byte)
  (head Byte)
  (tail Byte)
  (buf bytevector))
(c-declare "#pragma pack()")

(c-include <stdio.h>)
(define f (c-lambda () void "printf(\"sizeof rbuf %zu vs rbufv1 %zu vs rbufv2 %zu\\n\",
                                             sizeof(struct rbuf),
                                             sizeof(struct rbufv1),
                                             sizeof(struct rbufv2));"))

(define (main)
  (f))
/* GENERATED BY CRUNCH */

#define CRUNCH_IMPORT_CRUNCH_AGGREGATE_TYPES
#define CRUNCH_IMPORT_CRUNCH_C
#define CRUNCH_IMPORT_CRUNCH
#define CRUNCH_IMPORT_CRUNCH_DECLARATIONS
#define CRUNCH_IMPORT_CRUNCH_COMPILER_TYPE
#define CRUNCH_IMPORT_MATCHABLE
#define CRUNCH_IMPORT_CHICKEN_MEMORY_REPRESENTATION
#define CRUNCH_IMPORT_CHICKEN_PLIST
#define CRUNCH_IMPORT_CHICKEN_TYPE
#define CRUNCH_IMPORT_CHICKEN_FOREIGN
#define CRUNCH_IMPORT_SCHEME_BASE
#define CRUNCH_IMPORT_CHICKEN_SYNTAX
#define CRUNCH_IMPORT_CHICKEN_BASE
#define CRUNCH_IMPORT_SCHEME_R5RS

#ifndef CRUNCH_H
#include "crunch.h"
#endif

struct rbuf {
uint32_t cap;
uint32_t head;
uint32_t tail;
crunch_u8vector buf;
};
struct rbufv1 {
uint8_t cap;
uint8_t head;
uint8_t tail;
crunch_u8vector buf;
};
#pragma pack(1)
struct rbufv2 {
uint8_t cap;
uint8_t head;
uint8_t tail;
crunch_u8vector buf;
};
#pragma pack()
#include <stdio.h>

void f() {
printf("sizeof rbuf %zu vs rbufv1 %zu vs rbufv2 %zu\n",
                                             sizeof(struct rbuf),
                                             sizeof(struct rbufv1),
                                             sizeof(struct rbufv2));
}

int main(int argc91, char **argv92, char **env93);

crunch_function f___ = (crunch_function)f;
crunch_function main___ = (crunch_function)main;

int main(int argc91, char **argv92, char **env93) {
crunch_main(argc91, argv92, env93);
long r;
// cdiogo.scm:38
// cdiogo.scm:38
f();
r = 0;
goto rl;
rl:
crunch_cleanup();
return r;
}
/* END OF GENERATED CODE */

Reply via email to