Wskaźniki - wskaznik do struktury.

0

Witam, zamierzam zrobić sortowanie bazy (liczba,string) pozycyjne używając dodatkowo sortowania przez zliczanie.
Ogółem mój plan jest taki:
utworzyć strukture:

 typedef struct struktura {
   int intLiczba;
   char strNazwisko[MDN];
 } Rekord;

następnie

 Rekord **MojaStrukrura; //Utworzyć wskaźnik, który wskazuje na wskaźnik ten z kolei będzie wskazywał na odpowiednia 'komorke danych'
   MojaStrukrura = (Rekord**)malloc(sizeof (Rekord*));
 

i w pętli rezerwować pamięć dla komórki danych

int i = 0;
    while (feof(plik)==0) //Uzupelnianie struktury
    {
        MojaStrukrura[i] = (Rekord*)malloc(sizeof (Rekord));
        fscanf(plik, "%d %s", &MojaStrukrura[i].intLiczba, &MojaStrukrura[i].strNazwisko);
        i++;
    }
 

Gdzieś jest błąd, podejrzewam ze przesadziłem z wskaźnikami. Błąd otrzymuje taki:

 
main.c: In function ‘main’:
main.c:210:48: error: request for member ‘intLiczba’ in something not a structure or union
main.c:210:77: error: request for member ‘strNazwisko’ in something not a structure or union
*** glibc detected *** ./a.out: corrupted double-linked list: 0x09a9e168 ***

Jakieś pomysły jak to zrobić żeby było dobrze?

0

Ne poprawnie używasz feof(), który zwraca prawdę dopiero po próbie odczytania poza końcem.

    Rekord tmp;
    for(int i=0;fscanf(plik," %d%s",&tmp.intLiczba,tmp.strNazwisko)==2;++i) //Uzupelnianie struktury
      {
       MojaStrukrura[i]=(Rekord*)malloc(sizeof(Rekord));
       memcpy(MojaStrukrura[i],&tmp,sizeof(Rekord));
      }
0

Niestety rozwiazanie _13th_Dragon nie pomoglo, dalej cos nie tak. Lecz teraz otrzymuje taki błąd:

  
main.c: In function ‘main’:
main.c:207:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘char (*)[254]’ [-Wformat]
*** glibc detected *** ./a.out: corrupted double-linked list: 0x09356168 ***

Eh gubie się w tych wskaźnikach ;/

0

Dzięki jesteś wielki ;). A przy okazji natrafiłem na coś dziwnego, otóż stworzyłem sobie taki test.c w którym umieściłem kod:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct struktura
{
    int intLiczba;
    char strNazwisko[254];
} Rekord;

Rekord **MojaStrukrura;

int main(int argc, char** argv)
{
    FILE *plik;
    plik = fopen("dane.txt", "r");
    if (!plik)
    {
        printf("Nie moge otworzyc pliku %s\n", argv[1]);
        exit(-1);
    }

    MojaStrukrura = (Rekord**)malloc(sizeof (Rekord*));


    int j, i = 0;
    Rekord tmp;

    for (i = 0; fscanf(plik, "%d %s", &tmp.intLiczba, tmp.strNazwisko)==2; ++i) //Uzupelnianie struktury
    {
        MojaStrukrura[i] = (Rekord*)malloc(sizeof (Rekord));
        memcpy(MojaStrukrura[i], &tmp, sizeof (Rekord));
    }

    for (j = 0; j<i; j++)
        printf("j = %d [%d] [%s]\n", j, MojaStrukrura[j]->intLiczba, MojaStrukrura[j]->strNazwisko);

    //fclose(plik); // !

    return (EXIT_SUCCESS);
}

i z zakomentowanym fclose(plik) działa normalnie lecz gdy odkomentuje fclose(plik); to wywala mi błąd:
*** glibc detected *** ./a.out: corrupted double-linked list: 0x0995b168 ***
Wiecie może dlaczego tak się dzieje?

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct struktura
  {
   int intLiczba;
   char strNazwisko[254];
  }Rekord;

int main()
  {
   FILE *plik;
   int i,count;
   Rekord tmp,*MojaStrukrura;

   if(!(plik=fopen("dane.txt","r")))
     {
      printf("Nie moge otworzyc pliku \"dane.txt\"\n");
      exit(1);
     }
   for(count=0;fscanf(plik," %d%s",&tmp.intLiczba,tmp.strNazwisko)==2;++count) {}
   fseek(plik,0,SEEK_SET);
   MojaStrukrura=(Rekord*)malloc(count*sizeof(Rekord));
   for(i=0;i<count;++i) fscanf(plik," %d%s",&MojaStrukrura[i].intLiczba,MojaStrukrura[i].strNazwisko);
   for(i=0;i<count;++i) printf("j = %d [%d] [%s]\n",i,MojaStrukrura[i].intLiczba,MojaStrukrura[i].strNazwisko);
   fclose(plik);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1