如何在C中初始化结构

时间:2015-11-05 08:22:13

标签: c

从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] = The problem;
    char direction [] = {'N', 'S', 'E', 'W'};

    int position [2][2] = enter image description here; 
    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); 
}

但是当我执行时我有这个:

enter image description here

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行,这就是为什么我给你一个样本

2 个答案:

答案 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]错误,因为ij都超出了数组限制(位置仅为[2][2])。我想你的地图是43x90,那是你的困惑所在。如果是这种情况,你甚至不应该有一个位置变量(pos_ipos_j)因为数组索引已经标记了位置(比如说arr[i][j]是汽车,那么汽车在i, j)。