[C] Struktura w bibliotece nie działa

Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[C] Struktura w bibliotece nie działa

Post autor: Gouranga »

mam następujące pliki:

vector.c

Kod: Zaznacz cały

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

typedef struct Vector {
  int size;
  int *data;
} Vector;

Vector *newVector(int n){
  Vector *v = malloc(sizeof(Vector));
  v->data = malloc(n*sizeof(int));
  v->size = n;
  return v;
}

void fillVector(Vector *v){
  int i;
  for (i=0, i<v->size; i++){
    scanf("%i", &v->data[i]);
  }
}
vector.h

Kod: Zaznacz cały

typedef struct Vector Vector;
Vector *newVector(int n);
void fillVector(Vector *v);
main.c

Kod: Zaznacz cały

#include "vector.h"

int main(void){
  Vector *v = newVector(3);
  fillVector(v);
return 0;
}
takie coś działa, natomiast jeśli w main chcę bezpośrednio się dostać do wektora tzn.:

Kod: Zaznacz cały

  Vector *v = newVector(3);
  v->data[1] = 12;
kompilator wyrzuca błąd
Dereferencing pointer to incomplete type

problem znika jeśli wrzucę całość z vector.c do vector.h ale ciała funkcji w nagłowkach to coś, czego chcę uniknąć
innymi słowy struktura zachowuje się jak klasa prywatna patrząc bardziej obiektowo na temat
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[C] Struktura w bibliotece nie działa

Post autor: witekkq »

Kod: Zaznacz cały

for (i=0; i<v->size; i++)

Kod: Zaznacz cały

 Vector *v  =(struct Vector*)malloc(sizeof(Vector));
Jeśli chodzi o język C, to niestety nie da się tak zrobić z deklaracją struktury w pliku .c z uwagi na to iż kompilator musi wiedzieć jaki rozmiar w bajtach ma zarezerwować na dany element. Na podstawie: ( ... eclaration)

main:

Kod: Zaznacz cały

#include "2vector.h"
int main(void){
  Vector *v = newVector(3);
  fillVector(v);
  v->data[0]=666;
  showVector(v);
  while (1) {}; 
return 0;
}
2vector.h:

Kod: Zaznacz cały

typedef struct Vector Vector;
typedef struct Vector {
  int size;
	int *data;
} Vector;
Vector *newVector(int n);
void fillVector(Vector *v);
void showVector(Vector *v);
2vector.c:

Kod: Zaznacz cały

#include <stdlib.h>
#include <stdio.h>
#include "2vector.h"



Vector *newVector(int n){
  Vector *v  =(struct Vector*)malloc(sizeof(Vector));
  v->data = malloc(n*sizeof(int));
  v->size = n;
  return v;
}

void fillVector(Vector *v){
  int i;
  for (i=0; i<v->size; i++){
    scanf("%i", &v->data[i]);
  }
}

void showVector(Vector *v){
  int i;
  for (i=0; i<v->size; i++){
   printf("%i ", v->data[i]);
  }
}
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[C] Struktura w bibliotece nie działa

Post autor: Gouranga »

No tak, zapomniałem o podstawowym fakcie, że GCC najpierw dołącza nagłówki, potem osobno kompiluje każdy plik .c a na końcu linkuje pliki .o więc sam main.c z nagłówkiem vector.h nie wie co jest w środku tej struktury. Dzięki.
ODPOWIEDZ