Как выборочно передать столбцы или строки 2D-массива в функцию? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть массив MAC-адресов (char [6]), и я хочу выбрать, какой из них я передаю функции, но меня немного смущает, как различать столбцы и строки.Я придумал это для примера программы:

#include <stdio.h>

typedef unsigned char mac_t[6];

void mac_print(mac_t mac);

int main(void) {

    mac_t macs[3]={0};
    //mac1
    macs[0][0]=0x00;
    macs[1][0]=0x00;
    macs[2][0]=0x00;
    macs[3][0]=0x00;
    macs[4][0]=0x00;
    macs[5][0]=0x00;

    //mac2
    macs[0][1]=0x01;
    macs[1][1]=0x01;
    macs[2][1]=0x01;
    macs[3][1]=0x01;
    macs[4][1]=0x01;
    macs[5][1]=0x01;

    //mac3
    macs[0][2]=0x02;
    macs[1][2]=0x02;
    macs[2][2]=0x02;
    macs[3][2]=0x02;
    macs[4][2]=0x02;
    macs[5][2]=0x02;

    mac_print(*(macs));
    mac_print(*(macs+1));
    mac_print(*(macs+2));

}


void mac_print(mac_t mac) {
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}

Как мне распечатать mac1, mac2 & mac3 в функции mac-print, предполагая, что тип mac_t требуется?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Фактическое определение вашей переменной "macs" на английском языке:

An array with three slots of arrays with six slots.

Ваше текущее использование предполагает определение:

An array with six slots of arrays with three slots.

Следовательно, размеры вашего массива действительно3 на 6, а не 6 на 3 (как используется в настоящее время).

Этот инициализатор может помочь построить более твердую мысленную модель:

mac_t macs[3] = 
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
    { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
};

Наконец, оператор printf требует немного больше работы, так как вы в настоящее время ссылаетесь на слоты массивов (указан только 1 индекс), а не на отдельные байты в массиве массивов.

0 голосов
/ 02 октября 2018

Вы только что обнаружили, почему это:

typedef unsigned char mac_t[6];

плохо.Зачем?Потому что mac_t это массив.Посмотрите на это:

void mac_print(mac_t mac);

Как вы думаете, что это значит?Это функция, которая принимает тип mac_t?Не совсем, это означает, что указатель берется.

// all forms mean the same
void mac_print(mac_t mac);
void mac_print(unsigned char mac[6]);
void mac_print(unsigned char mac[]);
void mac_print(unsigned char *mac);

, потому что объявление массивов внутри списка параметров функции настроено на тип указателя, см. здесь и здесь ,

Лучший способ исправить ваш код - это структура:

typedef struct {
    unsigned char v[6];
} mac_t;

Теперь вы знаете, что такое mac_t.И вы также будете знать, как его индексировать.Вы также можете легко выполнить задание mac_t a; mac_t b; a = b; и сравнение !memcmp(&a, &b, sizeof(a)) (memcmp нужно немного потренироваться, но к нему можно привыкнуть).

Попробуйте это:

typedef struct {
    unsigned char v[6];
} mac_t;

void mac_print(mac_t mac);

int main(void) {

    mac_t macs[3]={0};
    //mac1
    macs[0].v[0]=0x00;
    macs[0].v[1]=0x00;
    macs[0].v[2]=0x00;
    macs[0].v[3]=0x00;
    macs[0].v[4]=0x00;
    macs[0].v[5]=0x00;

    //mac2
    macs[1].v[0]=0x01;
    macs[1].v[1]=0x01;
    macs[1].v[2]=0x01;
    macs[1].v[3]=0x01;
    macs[1].v[4]=0x01;
    macs[1].v[5]=0x01;

    //mac3
    macs[2].v[0]=0x02;
    macs[2].v[1]=0x02;
    macs[2].v[2]=0x02;
    macs[2].v[3]=0x02;
    macs[2].v[4]=0x02;
    macs[2].v[5]=0x02;

    // we pass by value here, but it would be better to pass a pointer
    // ie. `void mac_print(mac_t *mac);` and `mac_print(&macs[0]);`
    mac_print(macs[0]);
    mac_print(macs[1]);
    mac_print(macs[2]);

}


void mac_print(mac_t mac) {
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac.v[0],mac.v[1],mac.v[2],mac.v[3],mac.v[4],mac.v[5]);
}
0 голосов
/ 02 октября 2018

Должно было быть:

#include <stdio.h>

typedef unsigned char mac_t[6];

void mac_print(mac_t mac);

int main(void) {

    mac_t macs[3]={0};
    //mac1
    macs[0][0]=0x00;
    macs[0][1]=0x00;
    macs[0][2]=0x00;
    macs[0][3]=0x00;
    macs[0][4]=0x00;
    macs[0][5]=0x00;

    //mac2
    macs[1][0]=0x01;
    macs[1][1]=0x01;
    macs[1][2]=0x01;
    macs[1][3]=0x01;
    macs[1][4]=0x01;
    macs[1][5]=0x01;

    //mac3
    macs[2][0]=0x02;
    macs[2][1]=0x02;
    macs[2][2]=0x02;
    macs[2][3]=0x02;
    macs[2][4]=0x02;
    macs[2][5]=0x02;

    mac_print(macs[0]);
    mac_print(macs[1]);
    mac_print(macs[2]);

}


void mac_print(mac_t mac) {
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
...