0

所以我有这个问题。我初始化了我的结构数组的一个参数,然后我想在另一个函数中检查它。我检查了,地址与 main() 中的地址相同,但 vaule 只是随机的。不知道为什么,求助!

int i;
STOL s[STOLY];
char choice[MAXSTRING] = "jupiiiii", ***p;
/*if ((p = (char ***) malloc(MAXSTRING * sizeof(char **))) == NULL)
    exit(-5);*/

for (i = 0; i < STOLY; i++)
    s[i].novy = 0;

while (strcmp(choice, "stop"))
{
    puts("Casnik alebo bar?");
   /* *p = nacitaj_choice();
    choice = *p;*/
    nacitaj_choice(choice);
    free(p);

    if (strcmp(choice, "casnik") == 0)
        zadaj_stol(0, &s); /*HERE I SEND THE ADDRESS*/
    if (strcmp(choice, "bar") == 0)
        zadaj_stol(1, &s);
}

我想在另一个函数中检查novy

    void zadaj_stol(int typ, STOL *p_s[STOLY])
{
    int stol;
    printf("Stol cislo: ");
    stol = (cislo_stola() - 1);
    if (!p_s[stol]->novy) /*HERE IS THE PROBLEM*/
        reset_stol(p_s[stol]);
    zadaj_udaj(typ, p_s[stol]);
    vypis_stol(p_s[stol]);
}

我查了一下,p_s 和 &s 是一样的,但是出于某种原因 p_s[stol]->novy 总是像 -3782126 这样的东西。顺便说一句,stol 介于 0 和 13 之间

因为我还不能回答我的问题,所以这是我想出的部分解决方案。问题是,它只有在 p_s 的索引为 0 时才有效,即 p_s[0]->novy 工作正常,但 p_s[1] 给出调用堆栈,它不知道地址。我不确定为什么。

int main()
{
    int i;
    STOL s[STOLY], **p_s;
    if ((p_s = (STOL **) malloc(sizeof(STOL))) == NULL)
        return -5;
    *p_s = s;
    char choice[MAXSTRING] = "jupiiiii";

    for (i = 0; i < STOLY; i++)
        s[i].novy = 0;

    while (strcmp(choice, "stop"))
    {
        puts("Casnik alebo bar?");
        nacitaj_choice(choice);

        if (strcmp(choice, "casnik") == 0)
            zadaj_stol(0, p_s);
        if (strcmp(choice, "bar") == 0)
            zadaj_stol(1, p_s);
    }

    return 0;
}

void zadaj_stol(int typ, STOL **p_s)
{
    int stol;
    printf("Stol cislo: ");
    stol = (cislo_stola() - 1);
    if (!p_s[stol]->novy)
        reset_stol(p_s[stol]);
    zadaj_udaj(typ, p_s[stol]);
    vypis_stol(p_s[stol]);
}
4

4 回答 4

0

改变这个

void zadaj_stol(int typ, STOL *p_s[STOLY])
{
  int stol;
  printf("Stol cislo: ");
  stol = (cislo_stola() - 1);
  if (!p_s[stol]->novy) /*HERE IS THE PROBLEM*/
    reset_stol(p_s[stol]);
  zadaj_udaj(typ, p_s[stol]);
  vypis_stol(p_s[stol]);
}

变成这样:

void zadaj_stol(int typ, STOL (*p_s)[STOLY])
{
  int stol;
  printf("Stol cislo: ");
  stol = (cislo_stola() - 1);
  if (!(*p_s)[stol].novy) 
    reset_stol((*p_s)[stol]);
  zadaj_udaj(typ, (*p_s)[stol]);
  vypis_stol((*p_s)[stol]);
}
于 2013-11-14T10:56:22.937 回答
0

只需更改&s调用s函数的位置并[STOLY]从函数的参数列表中删除。

于 2013-11-14T11:24:01.723 回答
0

只需更改&ss传递数组。您收到错误error: invalid type argument of '->'是因为p_sis of type STOL*,这意味着p_s[stol]is of type STOL(不是指针)。的左侧操作数->应该是一个指针。你可以做:

if(!p_s[stol].novy)反而。

于 2013-11-14T13:20:03.833 回答
0

所以是的,我在一段时间后解决了它。以防万一将来有人遇到同样的问题,这里是解决方案。因为我有s[STOLY]结构数组,s它本身就是一个指针。因此,当我想将它zadaj_stol()作为指针传递给函数时,它应该只是s. 然后在zadaj_stol()函数s中是一个指针,但它s[stol]是一个结构,因此使用.符号。然后再次将其作为指针传递,我使用了&s[stol]. 这是示例代码(从那时起我已经改变了很多,但原则适用。

int main()
{
    int i, io;
    STOL s[STOLY];

    char choice[MAXSTRING] = "jupiiiii"; /*random string*/

    for (i = 0; i < STOLY; i++) {
        s[i].novy = 1;
        s[i].ucet = 0;
    }

    while (strcmp(choice, "stop"))
    {
        puts("\n**********************************\n");
        puts("Vstup alebo vystup? (Pre navod napis help, pre ukoncenie stop)");
        nacitaj_choice(choice);
        if ((strcmp(choice, "vstup")) == 0) {
            io = 0;
            typ_vstup(s, io);
        }
        else if ((strcmp(choice, "vystup")) == 0) {
            io = 1;
            typ_vstup(s, io);

        }
        else if ((strcmp(choice, "help")) == 0)
            help();
    }
    ziskaj_obrat(s);
    getchar();
    return 0;
}

以及在这样的功能中的使用

void zadaj_stol(int typ, STOL p_s[], int io) /*nacita cislo_stola, ak potrebne zresetuje ho, a bud vola zadaj_udaj alebo vypis_stol*/
{
    int stol;
    printf("Stol cislo: ");
    stol = (cislo_stola() - 1);
    if (p_s[stol].novy)
        reset_stol(&p_s[stol]);
    if (!io)
        zadaj_udaj(typ, &p_s[stol]);
    else
        vypis_stol(typ, &p_s[stol]);
}

重要的是要认识到什么是值,什么是指针。因为我有一个 array s[14]s是指向数组开头的指针,s[whatever]是一个值(在我的例子中是结构),并且&s[whatever]是指向结构的地址/指针。

于 2013-11-17T15:23:55.773 回答