Jag håller på och skriver ett program i c där jag vill ha en global array.
Problemet är att storleken på arrayen ska bero på data från en fil som läses in.
Eftersom jag inte vet storleken på förhand kan jag inte deklarera arrayen globalt.
Tänkte då att jag skulle använda vectorer eftersom då kan jag ändra storleken i efterhand.
Men <vector> classen verkar inte finnas i C.
Jag skulle byta språk till C++ om det inte vore för att en massa andra saker slutar fungera då.
Några tips?
Men du kan skriva din egen implementation av vector eller hitta kod som någon annan skrivit för det.
Annars kan du köra med en global pekare till din array istället - vars utrymme du initierar först när du vet hur mycket du behöver. Om du behöver lägga till mer saker i din array allteftersom (t.ex. om det inte finns någon header i filen som talar om hur mycket som kommer behövas) så skulle du kunna göra en länkad lista med önskad information och, om tvunget, göra om listan till en array senare.
Sen har jag en funktion som ska returnera en char ur arrayen:
char getGrid(int x, int z)
{
int pos = z*width + x;
char res = boardp[pos];
printf("%i %i %i %c\n",x, z, pos, boardp[pos]);
return res;
}
Problemet är att värdena den hämtar är fel.
Arrayen innehåller endast tecknen för blanksteg, # och S, men funktionen returnerar alla möjliga tecken.
Jag tänkte att den kanske försöker returnera minnesadressen istället för värdet i minnet, men när jag ändrar
char res = boardp[pos];
till
char res = *boardp[pos];
får jag följande fel.
error: invalid type argument of ‘unary *’ (have ‘int’)
Anropar du createboard innan du anropar printboard_g? Om du inte gör det så initieras ju inte boardp, och pekar då bara på en bit minne som kan innehålla vad som helst.
Globala variabler brukar man försöka undvika förresten. Globala variabler gör att koden blir mindre flexibel (det är mycket svårare att återanvända funktioner som beror på globala variabler) och det är lättare att få svårhittade buggar när variabeln kan ändras vart som helst i programmet.
Du kopierar dock aldrig innehållet i board till det nya fältet du skapar i createBoard och vad som helst kan hända med board när du lämnar display. Använd memcpy eller liknande när du har allokerat det nya minnet.
Nej, du kopierar bara pekaren; inte innehållet (dessutom förlorar du pekaren till det nyss allokerade utrymmet (och kan därför inte radera det senare (en minneslucka alltså))). Testa något i stil med