从2-3天开始,我对项目有一个小问题,实际上我的项目是用汽车做一个环形交叉路口。我是C的初学者所以我试着自己初始化一个结构。
我的结构是:
typedef struct Car Car;
struct Car
{
char vehicule; /* N, S, E, W */
int speed; /* 1 => slow ou 2 => fast */
int pos_i; /* Position courante 'i' du véhicule sur la route */
int pos_j; /* Position courante 'j' du véhicule sur la route */
char alig; /* 'l' for left and 'r' for right */
};
然后我创建一个名为initCar的函数,以便将两个随机汽车放在(23,1)红色圆圈,(21,1)橙色,如下:
我的initCar功能:
Car initCar () {
Car car [43][90] = ;
char direction [] = {'N', 'S', 'E', 'W'};
int position [2][2] = ;
position [0][0] = 23;
position [0][1] = 1;
position [1][0] = 21;
position [1][1] = 1;
int i = 0, j = 0;
srand (time (NULL));
for (i = 0; i < 43; i++) {
for (j = 0; j < 90; j++) {
car [i][j].vehicule = direction [rand () % 4];
car [i][j].speed = 1;
car [i][j].pos_i = position [i][j];
car [i][j].pos_j = position [i][j];
car [i][j].alignement = 'r';
}
printf("\n");
}
roadMap(car);
}
但是当我执行时我有这个:
roadMap是我的环形功能,
else if (j < 33) {
do {
printf("%c", matrice[i][j].vehicule);
j++;
} while (j < 33);
}
基于:{{0}}
(我的mcve)
function.h:
#ifndef FONCTIONS_H_INCLUDED
#define FONCTIONS_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NB_LIN 43
#define NB_COL 90
#define clrscr() printf("\033[H\033[2J")
#define couleur(param) printf("\033[%sm",param)
typedef struct Car Car;
struct Car
{
char vehicule; /* N, S, E, W */
int speed; /* 1 => slow ou 2 => fast */
int pos_i; /* Position courante 'i' du véhicule sur la route */
int pos_j; /* Position courante 'j' du véhicule sur la route */
char alig; /* 'l' for left and 'r' for right */
};
void roadMap (char matrice [NB_LIN][NB_COL]);
void initCarFromEst ();
main.c:
#include "function.h"
int main () {
initCarFromEst ();
return 0;
}
和function.c:
void myDelay (float i) { // Fais une pause de l'app durant i secondes
clock_t start, end;
start = clock ();
while (((end = clock ()) - start) <= i * CLOCKS_PER_SEC);
}
void roadMap (Car matrice [NB_LIN][NB_COL]) {
int i = 0, j = 0;
//NB_LIN de NB_COL
for (i = 0; i < NB_LIN; i++) {
for (j = 0; j < NB_COL; j++) {
switch (i) {
case 20: {
if (j < 19) {
do {
printf("■");
j++;
} while (j < 19);
}
else if (j < 33) {
do {
printf("%c", matrice[i][j].vehicule);
j++;
} while (j < 33);
}
else if (j < 53) {
do {
printf("╬");
j++;
} while (j < 53);
}
else if (j < 67) {
do {
printf("%c", matrice[i][j].vehicule);
j++;
} while (j < 67);
}
else if (j < 87) {
do {
printf("■");
j++;
} while (j < 87);
}
}
break;
case 18:
case 22: {
if (j < 10) {
do {
printf("─ ");
j++;
} while (j < 10);
}
else if (j < 23) {
do {
printf("%c", matrice[i][j].vehicule);
j++;
} while (j < 23);
}
else if (j < 43) {
do {
printf("╬");
j++;
} while (j < 43);
}
else if (j < 57) {
do {
printf("%c", matrice[i][j].vehicule);
j++;
} while (j < 57);
}
else if (j < 68) {
do {
printf("─ ");
j++;
} while (j < 68);
}
}
break;
} printf("\n");
}
}
Car initCarFromWest () {
Car car [43][90] = {{0}};
char direction [] = {'N', 'S', 'E', 'W'};
int position [2][2] = {{0}};
position [0][0] = 23;
position [0][1] = 1;
position [1][0] = 21;
position [1][1] = 1;
int i = 0, j = 0;
srand (time (NULL));
for (i = 0; i < 43; i++) {
for (j = 0; j < 90; j++) {
car [i][j].vehicule = direction [rand () % 4];
car [i][j].speed = 1;
car [i][j].pos_i = position [i][j];
car [i][j].pos_j = position [i][j];
car [i][j].alignement = 'r';
}
printf("\n");
}
roadMap(car);
}
Voiture initCarFromEst () {
}
Voiture initCarFromSouth () {
}
Voiture initCarFromNorth () {
}
我的功能roadMap接近400行,这就是为什么我给你一个样本
答案 0 :(得分:0)
嗯,首先你没有创造2辆汽车,你创造了43 * 90 = 3870辆汽车。你宣布一辆43x90的汽车,共计3870辆汽车。然后迭代遍历阵列中的所有汽车,初始化所有3870个汽车。但是您的索引超出了position
数组的范围。 position
是一个2x2数组,因此两个索引必须在[0,1]范围内。但是你正在使用你的循环索引来索引它,所以你将超越数组的边界,并且你得到了调用堆栈上的任何值。
这听起来像你想做的只有2辆车。这应该会好很多。
答案 1 :(得分:0)
你刚刚宣布Car car[43][90]
,你有43 * 90辆汽车。
即使你宣称它们是空的&#39; (含0)。
我建议你修改你的代码如下:Car* car[43][90] = {{0}};
并且基本上每个指针都设置为NULL
而非空指针设置为动态分配的汽车(移动它也会更有效,除此之外从显而易见的内存消耗最小化。当然,你需要相应地修改地图绘制功能。
您的position[i][j]
错误,因为i
和j
都超出了数组限制(位置仅为[2][2]
)。我想你的地图是43x90,那是你的困惑所在。如果是这种情况,你甚至不应该有一个位置变量(pos_i
和pos_j
)因为数组索引已经标记了位置(比如说arr[i][j]
是汽车,那么汽车在i, j
)。