typedef fixed length array

Muszę zdefiniować 24-bitowy typ danych.Używam char[3] do reprezentowania typu. Czy mogę wpisać char[3] do type24? Próbowałem w próbce kodu. Umieszczam typedef char[3] type24; w moim pliku nagłówkowym. Kompilator nie narzekał na to. Ale kiedy zdefiniowałem funkcję void foo(type24 val) {} w moim pliku C, to narzekało. Chciałbym móc definiować funkcje typu type24_to_int32(type24 val) zamiast type24_to_int32(char value[3]).

Author: 341008, 2010-12-24

7 answers

Typedef będzie

typedef char type24[3];

Jest to jednak prawdopodobnie bardzo zły pomysł, ponieważ wynikowy typ jest typem tablicy, ale użytkownicy nie zobaczą, że jest to typ tablicy. Jeśli zostanie użyty jako argument funkcji, będzie przekazywany przez odniesienie, a nie przez wartość, a sizeof będzie wtedy błędny.

Lepszym rozwiązaniem byłoby

typedef struct type24 { char x[3]; } type24;

Prawdopodobnie chcesz również używać unsigned char zamiast char, ponieważ ten ostatni ma zdefiniowany w implementacji znak.

 339
Author: R.. GitHub STOP HELPING ICE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-24 00:44:03

Chcesz

typedef char type24[3];

Deklaracje Typu C są w ten sposób dziwne. Wpisujesz Typ dokładnie tam, gdzie nazwa zmiennej miałaby się znajdować, jeśli deklarujesz zmienną tego typu.

 53
Author: ysth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-18 15:12:41

Od R.."odpowiedź :

Jest to jednak prawdopodobnie bardzo zły pomysł, ponieważ powstały Typ jest typem tablicy, ale użytkownicy nie będą widzieć, że jest to typ tablicy. Jeśli zostanie użyty jako argument funkcji, będzie przekazywany przez referencję, a nie przez wartość, a jej wielkość będzie wtedy błędna.

Użytkownicy, którzy nie widzą, że jest to tablica, najprawdopodobniej napiszą coś takiego (co nie powiedzie się):

#include <stdio.h>

typedef int twoInts[2];

void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);

int main () {
    twoInts a;
    a[0] = 0;
    a[1] = 1;
    print(&a);
    intermediate(a);
    return 0;
}
void intermediate(twoInts b) {
    print(&b);
}

void print(twoInts *c){
    printf("%d\n%d\n", (*c)[0], (*c)[1]);
}

Skompiluje się z następującym Ostrzeżenia:

In function ‘intermediate’:
warning: passing argument 1 of ‘print’ from incompatible pointer type [enabled by default]
    print(&b);
     ^
note: expected ‘int (*)[2]’ but argument is of type ‘int **’
    void print(twoInts *twoIntsPtr);
         ^

I generuje następujące wyjście:

0
1
-453308976
32767
 35
Author: Gerhard Burger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:30

Tablice nie mogą być przekazywane jako parametry funkcji przez wartość w C.

Możesz umieścić tablicę w strukturze:

typedef struct type24 {
    char byte[3];
} type24;

A następnie przekaż to przez wartość, ale oczywiście jest to mniej wygodne w użyciu: x.byte[0] zamiast x[0].

Twoja funkcja type24_to_int32(char value[3]) faktycznie przechodzi przez wskaźnik, a nie przez wartość. Jest dokładnie równoważne type24_to_int32(char *value), a 3 jest ignorowane.

Jeśli jesteś szczęśliwy przechodząc przez wskaźnik, Może trzymać się tablicy i zrobić:

type24_to_int32(const type24 *value);

To będzie przekaż wskaźnik do tablicy, a nie wskaźnik do pierwszego elementu, więc używaj go jako:

(*value)[0]

Nie jestem pewien, czy to naprawdę zysk, ponieważ jeśli przypadkowo napiszesz {[8] } wtedy stanie się coś głupiego.

 15
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-24 00:50:42

Aby poprawnie użyć typu array jako argumentu funkcji lub parametru szablonu, Utwórz strukturę zamiast typedef, a następnie dodaj {[1] } do struktury, aby można było zachować funkcję tablicy jak w następujący sposób:

typedef struct type24 {
  char& operator[](int i) { return byte[i]; }
  char byte[3];
} type24;

type24 x;
x[2] = 'r';
char c = x[2];
 9
Author: Geronimo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 22:04:07

Oto krótki przykład, dlaczego tablica typedef może być myląco niespójna. Pozostałe odpowiedzi zapewniają obejście.

#include <stdio.h>
typedef char type24[3];

int func(type24 a) {
        type24 b;
        printf("sizeof(a) is %zu\n",sizeof(a));
        printf("sizeof(b) is %zu\n",sizeof(b));
        return 0;
}

int main(void) {
        type24 a;
        return func(a);
}

To tworzy Wyjście

sizeof(a) is 8
sizeof(b) is 3

Ponieważ typ24 jako parametr jest wskaźnikiem. (W C tablice są zawsze przekazywane jako wskaźniki.) Kompilator gcc8 domyślnie wyda ostrzeżenie, na szczęście.

 3
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-05 01:13:22

Budowanie na podstawie zaakceptowanej odpowiedzi , wielowymiarowego typu tablicy, który jest tablicą o stałej długości, nie może być zadeklarowany za pomocą

typedef char[M] T[N];  // wrong!

Zamiast tego, pośredni typ tablicy 1D może być zadeklarowany i użyty tak jak w zaakceptowanej odpowiedzi:

typedef char T_t[M];
typedef T_t T[N];

Lub, T Można zadeklarować pojedynczym (prawdopodobnie mylącym) stwierdzeniem:

typedef char T[N][M];

Który definiuje typ N tablic z M znaków (uważaj na kolejność, tutaj).

 0
Author: PiCTo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-03 10:19:05