Я написал метод, который принимает в качестве параметров две станции и массив железнодорожных путей.
typedef enum { MA1, MA2, MA3, MA4, MA5, MA6, MA7,
MA8, MA9, MA10, MA11, MA12, MA13, MA14, MA15, MA16} RailwayTrack;
typedef enum { S1, S2, S3, S4, S5, S6} RailwayStation;
typedef struct TrainData {
int currentProgress;
RailwayStation startStation;
RailwayStation endStation;
int railwayPathLength;
RailwayTrack *railwayPath;
} TrainData;
#define MAP1_TRAIN_N1 getTrainData(S1, (RailwayTrack[]){ MA1, MA2, MA3, MA8 }, S6)
TrainData getTrainData(RailwayStation startStation, RailwayTrack railwayPath[] /*ERROR HERE?*/, RailwayStation endStation) {
TrainData trainData;
trainData.startStation = startStation;
for (int i = 0; i < sizeof(railwayPath)/sizeof(RailwayTrack); i++)
{
printf("Eli: %d\n",railwayPath[i]);
}
//OUTPUT: Eli0, Eli1
RailwayTrack test[] = { MA1, MA2, MA3, MA8 }; //TEST ARRAY CAUSE ABOVE IS NOT WORKING
for (int i = 0; i < sizeof(test)/sizeof(RailwayTrack); i++)
{
printf("Eli: %d\n",test[i]);
}
//OUTPUT: Eli0, Eli1, Eli2, Eli3
trainData.railwayPath = railwayPath;
trainData.endStation = endStation;
return trainData;
}
Проблема в том, что массив, указанный в качестве параметра, не будет распечатан полностью, а только до первых двух элементов. Вы можете видеть, что в качестве параметра я передаю массив из 4 элементов, но в журналах видны только первые 2.
Благодаря некоторой помощи я наконец смог понять, что мне также нужно передать размер массива в качестве параметра. Спасибо всем за помощь.
🤔 А знаете ли вы, что...
C компилируется в нативный код, что делает его быстрым и эффективным на большинстве аппаратных платформ.
sizeof(railwayPath)
дает вам размер указателя, а не массива в C. Вы не передаете массив, а только ссылку (указатель на него).
Вам необходимо передать размер в качестве параметра:
TrainData getTrainData(RailwayStation startStation, RailwayTrack railwayPath[],
size_t railwayPathSize, RailwayStation endStation) {