Как я могу создать матрицу, которая имеет только структуры, а затем создать поток для всех данных, которые хранятся в матрице? - PullRequest
0 голосов
/ 19 января 2019

Я создаю матрицу измерения [10] [10], в которой хранится структура Contentor, я не могу ни изменить значения внутри матрицы, ни сохранить их.

Я пытаюсь проверить, есть ли какие-либо данные с циклом for, но не вижу, что внутри.

Когда я сохраняю данные внутри матрицы, я пытаюсь создать поток каждого из них для обработки данных, но я не знаю, как это сделать ...

Я попытался использовать malloc и calloc, я создал матрицу в зачаточном виде, но, похоже, ничего не работает ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

struct Contentor {

    char nSerie[36];
    char porto[4];

};

void* direcionaParaDestino(void* arg) {
    struct Contentor *arg_struct = (struct Contentor*) arg;

    char destino[4] = arg_struct->porto;

    if(strcmp(destino, "ANR")) {

    } else if (strcmp(destino, "BUS")) {

    } else if (strcmp(destino, "DXB")) {

    } else if (strcmp(destino, "GUA")) {

    } else if (strcmp(destino, "HAM")) {

    } else if (strcmp(destino, "HKG")) {

    } else if (strcmp(destino, "LAX")) {

    } else if (strcmp(destino, "RTM")) {

    } else if (strcmp(destino, "SHA")) {

    } else if (strcmp(destino, "SIN")) {

    }

    pthread_exit(0);
}


int main() {
    struct Contentor parque[10][10] = malloc(100*sizeof(struct Contentor));


    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
            parque[i][j].nSerie = "";
            parque[i][j].porto = "";
        }
    }


    pthread_t tids[10][10];
    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
            if(strcmp(parque[i][j].nSerie,"")) {
                printf("Lugar [%d][%d] encontra-se Livre\n", i, j);
                //Criar Thread que espera ate 5 segundos
                                short randomNumber = rand() % 5
                pthread_attr_t attr;
                        pthread_attr_init(&attr);
                        pthread_create(&tids[i][j], &attr, direcionaParaDestino, 1 );
                                sleep(randomNumber);

            } else {
                printf("Lugar [%d][%d] encontra-se Ocupado\n", i, j);

            }
        }
    }
    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
            pthread_join(tids[i][j],NULL);
        }
    }

}

Я хочу, чтобы это была матрица этой структуры, проверьте, есть ли какие-либо данные в каждом месте, затем сохраните их и создайте поток для каждой сохраненной переменной, который будет ждать до 5 секунд перед обработкой информации.

1 Ответ

0 голосов
/ 19 января 2019

Вы не можете инициализировать массивы из других массивов или указателей. И вы также не можете назначить массивы.

Так

char destino[4] = arg_struct->porto;

недействительно.

Есть два способа решить эту проблему для вас:

  1. Положитесь на тот факт, что массивы естественным образом распадаются на указатели на их первый элемент. То есть, если ожидается указатель, то arg_struct->porto равно &arg_struct->porto[0]. Это означает, что вы можете сделать

    char *destino = arg_struct->porto;
    
  2. Не иметь вообще никакой переменной destino и передать arg_struct->porto непосредственно на ваши strcmp вызовы:

    if (strcmp(arg_struct->porto, "BUS") == 0) ...
    

Также обратите внимание, что strcmp возвращает ноль , если две строки равны. Вот причина сравнения равенства с нулем выше.


Невозможность присвоить массиву также является причиной таких операторов, как

parque[i][j].nSerie = "";

потерпит неудачу.

Если вы хотите, чтобы массивы действовали как пустые строки, все, что вам нужно сделать, это установить первый элемент в нулевой терминатор:

parque[i][j].nSerie[0] = '\0';  // Make string "empty"

Если вы хотите очистить все байты массива, вам нужно использовать функцию memset:

memset(parque[i][j].nSerie, 0, sizeof parque[i][j].nSerie);  // "Clear" array
...