Toon posts:

[C] file naar array

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik probeer een file naar een (2d) array te krijgen, de file bestaat uit op de eerste regel een getal hoeveel coordinaten er zijn, de volgende regels bestaan uit coordinaten in de vorm van (a,b) (met a en b een geheel getal).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
file *input;
int aantal;
int **coord;

if ((input = fopen("coord.txt", "r")) == NULL)
           fprintf(stderr, "Cannot open %s\n", "input");
fscanf(input, "%i\n", &aantal);
   
// zorg dat coord een aantal x 2  matrix wordt

for(i=0;i<aantal;i++) {
   fscanf(input, "(%i,%i)\n", &coord[i][0], &coord[i][1]);
}


fclose(input);


Hoe zorg ik nu dat mijn coord-array de juiste grootte wordt?

Verwijderd

Je hebt nu alleen een pointer naar een pointer naar een int gedefinieerd. Je moet het geheugen nu alloceren met malloc, ff denken, dat zou iets van
coord[i][0] = malloc( aantal ) moeten worden en coord[i][1]. Deze moet nog komen voordat je met fscanf de array probeert te vullen. coord[i][1] moet volgens mij met coord[i][1] = malloc( sizeof( int ) ) worden geinitialiseerd.
Het zal niet helemaal kloppen maar zoiets moet het worden volgens mij. Misschien makkelijker om coord niet variabel te definieren?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Het is handiger om coordinaten in een struct op te slaan ipv in een int[2]:
C:
1
2
3
4
5
struct coord_s {
    int x, y;
};

struct coord_s * coord;

deze alloceer je vervolgens met malloc:
C:
1
coord = (coord_s *)malloc(sizeof(coord_s) * aantal);

(en dan dus:
C:
1
fscanf(input, "(%i,%i)\n", &coord[i]->x, &coord[i]->y);
)

[ Voor 0% gewijzigd door marcusk op 02-10-2002 17:45 . Reden: nog een foutje ]


Verwijderd

Topicstarter
PHP:
1
coord = malloc(sizeof(coord_s) * aantal);


werkt bij mij (zonder (coord_s *) dus), anders krijg ik een parse error.

Ik heb nu alleen nog het probleem dat hij die '->'-jes niet pakt, dan krijg ik:
code:
1
invalid type argument of `->'


/edit:

het werkt toch niet... ik had per ongeluk sizeof(int) staan, nu met coord_s geeft hij:

`coord_s' undeclared (first use in this function)
(Each undeclared identifier is reported only once
for each function it appears in.)
parse error before `)'

met en zonder (coord_s *) ervoor

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Echte multidimensionale arrays zijn niet dynamisch te alloceren. Het alternatief, de dubbele pointer zoals je die nu gebruikt, is een slap aftreksel, aangezien je per kolom (in dit geval) een aparte geheugenallocatie moet doen.

Ik zou je aanraden om ofwel marcusk's suggestie op te volgen, of over te stappen op een enkelvoudige pointer, die je in één keer kan alloceren:
C:
1
2
3
4
5
6
7
8
9
int
    c,
    coord_count = .... ,
    *coords = (int*)malloc(coord_count * sizeof(int) * 2);

for(c = 0; c < coord_count; ++c)
{
    coords[2 * c]  = x; coords[2 * c + 1]  = y;
}

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
probeer dit eens:
C:
1
2
3
coord = malloc(sizeof(struct coord_s) * aantal);
...
fscanf(input, "(%i,%i)\n", &(coord[i]->x), &(coord[i]->y));

Verwijderd

Topicstarter
Dat werkt... eerste regel dan, de tweede regel niet, dan krijg ik:
"invalid type argument of `->'"

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
oeps, dom... het is gewoon '.' ipv '->' :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 31-08 15:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 02 oktober 2002 @ 19:38:
PHP:
1
coord = malloc(sizeof(coord_s) * aantal);


werkt bij mij (zonder (coord_s *) dus), anders krijg ik een parse error.

Ik heb nu alleen nog het probleem dat hij die '->'-jes niet pakt, dan krijg ik:
code:
1
invalid type argument of `->'


/edit:

het werkt toch niet... ik had per ongeluk sizeof(int) staan, nu met coord_s geeft hij:

`coord_s' undeclared (first use in this function)
(Each undeclared identifier is reported only once
for each function it appears in.)
parse error before `)'

met en zonder (coord_s *) ervoor


die error is omdat je coord_s gebruikt, wat een niet gedefinieerd type is (in tegenstelling tot struct coord_s, wat het type is dat jij bedoelt)
misschien handig om een typedef te maken? dat scheelt je weer elke keer die "struct" typen:
C:
1
2
3
4
typedef struct coord_s
{
    int x, y;
} coord_t;


nu kun je gewoon coord_t gebruiken als type (en natuurlijk nog steeds struct coord_s)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
of je gebruikt gewoon c++ :P

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 31-08 15:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]
Soultaker schreef op 02 oktober 2002 @ 20:43:
Echte multidimensionale arrays zijn niet dynamisch te alloceren. Het alternatief, de dubbele pointer zoals je die nu gebruikt, is een slap aftreksel, aangezien je per kolom (in dit geval) een aparte geheugenallocatie moet doen.
integendeel:

C:
1
2
3
4
5
6
7
8
int count;
int (*array)[2];

...
array = (int (*)[2])malloc (count * sizeof (int[2]));

array[0][0] = x;
array[0][1] = y;

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
.oisyn schreef op 02 oktober 2002 @ 21:39:
integendeel:

C:
1
2
3
4
5
6
7
8
int count;
int (*array)[2];

...
array = (int (*)[2])malloc (count * sizeof (int[2]));

array[0][0] = x;
array[0][1] = y;
Hee; interessant! Ik wist niet dat je zo kon declareren en casten. Dat is wel weer praktisch, als alleen de 'eerste' dimensie van je multidimensionale array variabel is. In ingewikkeldere gevallen gaat het natuurlijk niet meer op.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 31-08 15:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op 02 oktober 2002 @ 21:59:
[...]


Hee; interessant! Ik wist niet dat je zo kon declareren en casten. Dat is wel weer praktisch, als alleen de 'eerste' dimensie van je multidimensionale array variabel is. In ingewikkeldere gevallen gaat het natuurlijk niet meer op.


C:
1
int (*3darray)[3][4];


werkt ook zoals je zou verwachten :)
(niet die haakjes vergeten, anders krijg je natuurlijk weer een 2d array van pointers naar int ;))

.edit: oh wacht, dit is natuurlijk nog steeds de 'eerste' dimentie |:(
hoewel ik het technisch gezien niet echt de eerste vindt, maar laten we daar maar niet over beginnen ;)

een ingewikkeldere manier zou ook niet mogelijk zijn, omdat bij indexing de compiler moet weten hoe groot alle dimensies moeten zijn, afgezien van de laatste

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
bedankt iedereen!! het werkt
Pagina: 1