Получение данных сокета C для размещения 2D-массива

Хранилища не настроены

Ваши репозитории Ubuntu настроены неправильно.

Добавьте некоторое хранилище, выполнив следующую команду:
sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted"
Теперь попробуйте обновить:
sudo apt-get update
Обновление:
sudo apt-get upgrade
1
задан 13 August 2018 в 15:18

2 ответа

int **matrix; 

matrix = (int **)calloc(N, sizeof(int *));
...

Код не работает, поскольку выше это не 2D-массив, а скорее сегментированная, ориентированная на указатель таблица. Таким образом, это не маловажно совместимо с массивами.

Нет причин, по которым вам нужно иметь такую ​​таблицу поиска. Проблема, вероятно, возникает в путанице в том, как правильно распределять многомерные массивы.

1
ответ дан 15 August 2018 в 17:01
  • 1
    Проблема, которая приводит меня к этому решению (которое должно быть с uint16_t s, как указано выше), состояло в том, что у меня есть приложение, которое отправляет данные в ведрах 2048, и мне нужно хранить эти данные некоторым удобным способом с ранее отправленным данных, чтобы я мог fprintf( ) все содержимое в файл .dat для gnu-plot. Я прочитаю вашу ссылку, чтобы узнать, могу ли я найти лучший подход! Спасибо за ответ – David Montgomery 14 August 2018 в 01:10

В комментариях и других ответах были указаны некоторые потенциальные проблемы, связанные с type согласованностью (предложения использовать либо int, либо uint16_t, но не смешивать) и выделение памяти.

Предложение о создании памяти. Для простоты и удобочитаемости, особенно если вы хотите эмулировать несколько измерений массива, рассмотрите возможность инкапсуляции памяти в функцию. Например:

uint16_t ** Create2D(int c, int r)
{   
    uint16_t **arr;
    int    y;

    arr   = calloc(c, sizeof(uint16_t *));
    for(y=0;y<c;y++)
    {
        arr[y] = calloc(r, sizeof(uint16_t));   
    }
    return arr;
}

Вызвать функцию следующим образом:

uint16_t ** matrix = Create2D(N, M);
if(matrix)//always good to check return of [c][m]alloc before using
{
    // Use allocated memory
    ...

Примечания:

В этом примере не создается 2D-матрица, а скорее эмуляция одного. (как подробно описано здесь ЗДЕСЬ) Это на самом деле просто указатель на набор указателей, каждый из которых указывает на выделенную память, так что их содержимое может быть доступно с помощью нотации столбцов столбцов, как если бы оно было создано как:

uint16_t array[N][M];

В этом примере не создается 2D-матрица, а скорее эмуляция одного. (как подробно описано здесь ЗДЕСЬ) Это на самом деле просто указатель на набор указателей, каждый из которых указывает на выделенную память, так что их содержимое может быть доступно с помощью нотации столбцов столбцов, как если бы оно было создано как: Для каждого вызванного [m][c]alloc(), должен быть соответствующий вызов free().

Освобождение этой памяти также может быть реализовано в инкапсулированной форме. Например:

void free2D(uint16_t **arr, int c)
{
    int i;
    for(i=0;i<c;i++)
    {
        free(arr[i]);
    }
    free(arr);
}  
2
ответ дан 15 August 2018 в 17:01
  • 1
    Спасибо за ответ, я попытаюсь структурировать свой код в такие функции. Однако сложной частью, которую я нахожу, является использование функции iscv () здесь – David Montgomery 13 August 2018 в 15:30
  • 2
    Зачем им в первую очередь использовать эту справочную таблицу? Инкапсулируя его, он просто скрывает дерьмо под ковром. Сделайте это правильно, как описано здесь . – Lundin 13 August 2018 в 15:35
  • 3
    если вы после unsigned int используете unsigned int. Печать signed int через %u вызывает неопределенное поведение. – alk 13 August 2018 в 15:50
  • 4
    Даже если matrix[x][y] будет unsigned short передавать его функции (variadic) printf(), она будет повышена до int. – alk 13 August 2018 в 15:52
  • 5
    @Lunden - я признаю вашу озабоченность. Но когда вам приходится несколько раз выполнять такие фрагменты кода в приложении, я считаю его более читаемым для инкапсуляции один раз, а не дублировать беспорядочный код, необходимый много раз. В любом случае, никаких аргументов с тем, что, по моему мнению, не является вашим настроем, и процитировал ваш связанный ответ на мой вопрос для его очень подробного объяснения. спасибо – ryyker 13 August 2018 в 17:45

Другие вопросы по тегам:

Похожие вопросы: