Это рабочий фрагмент кода проблемы с транспортировкой (Удалена реальная функция. Здесь присутствуют только функции ввода и вывода. И кстати, это неправильно)
# include <stdio.h>
# include <stdlib.h>
typedef struct transport
{
int cost;
int alloc;
}TRAN;
void problem_input (TRAN **, int *, int *, int, int);
void problem_display (TRAN **, int *, int *, int, int);
int main()
{
int n_dest;
int n_org;
int i;
int j;
printf("\n\n\tEnter Number Of Destinations : ");
scanf("%d", &n_dest);
printf("\n\n\tEnter Number Of Origins(Sub-stations) : ");
scanf("%d", &n_org);
TRAN ** array = (TRAN **)calloc(n_org, sizeof(TRAN *));
int * dest = (int *)calloc(n_dest, sizeof(int));
int * origins = (int *)calloc(n_org, sizeof(int));
for(i = 0; i < n_org; i++)
{
array[i] = (TRAN *)calloc(n_dest, sizeof(TRAN *));
}
problem_input (array, dest, origins, n_dest, n_org);
problem_display (array, dest, origins, n_dest, n_org);
printf("\n\n");
return 0;
}
void problem_input (TRAN ** array, int * dest, int * origins, int n_dest, int n_org)
{
int i;
int j;
printf("\n\n\tEnter The Amount Of Supplies Required At The Destinations : ");
for(i = 0; i < n_dest; i++)
{
printf("\n\n\t\tDestination %d : ", (i+1));
scanf("%d", &dest[i]);
}
printf("\n\n\tEnter The Amount Of Supplies Available At The Origins : ");
for(i = 0; i < n_org; i++)
{
printf("\n\n\t\tOrigin %d : ", (i+1));
scanf("%d", &origins[i]);
}
printf("\n\n\tEnter The Cost Matrix : ");
for(i = 0; i < n_org; i++)
{
printf("\n\n\t\tOrigin %d", (i+1));
for(j = 0; j < n_dest; j++)
{
printf("\n\n\t\t\tDestination %d : ", (j+1));
scanf("%d", &array[i][j].cost);
}
}
}
void problem_display (TRAN ** array, int * dest, int * origins, int n_dest, int n_org)
{
int i;
int j;
printf("\n\n\tThe Given Transportation Problem : ");
for(i = 0; i < n_org; i++)
{
printf("\n\n\t");
for(j = 0; j < n_dest; j++)
{
printf("\t%d", array[i][j].cost);
}
printf("\t[%d]", origins[i]);
}
printf("\n\n\t");
for(i = 0; i < n_dest; i++)
{
printf("\t[%d]", dest[i]);
}
}
В Windows это работало нормально, ноотображается неверный вывод в Linux.(Я использую Windows дома, но Linux в колледже. Представьте, что я чувствовал, когда получал неправильный вывод перед моим профессором. Но она не была мудрее.)
Например, мой вклад в «стоимость»'в TRAN ** array
было
1 2 3
4 5 6
7 8 9
, но вывод был похож на
1 2 4
4 5 7
7 8 9
Моя ошибка была при создании структуры.Я создаю двумерные массивы, подобные этой (очень стандартный)
TRAN ** array = (TRAN **)calloc(n_org, sizeof(TRAN *));
for(i = 0; i < n_org; i++)
{
array[i] = (TRAN *)calloc(n_dest, sizeof(TRAN));
}
Но по ошибке я сделал это в цикле for
for(i = 0; i < n_org; i++)
{
array[i] = (TRAN *)calloc(n_dest, sizeof(TRAN *));
}
То есть sizeof(TRAN *)
вместо sizeof(TRAN)
Итак, мой вопрос: почему эта явная ошибка не появилась в Windows?