global array av structar...med pekare..=(

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

global array av structar...med pekare..=(

Inlägg av dude »

hej

jag håller på och försöker göra en array av structurer. dessa ska kunna användas av flera olika funktioner så därför hade jag tänkt att de skulle vara globala. och så ska det då vara pekare till dessa för att spara minne..


detta var det jag kom fram till:

i meny.h-filen:
typedef struct
{
char va[30];
int id;
int nummer;
}info;

i meny.c filen

info *xbee[20];

i de andra filerna där den ska kunna anropas :
extern info *xbee[20];


är detta rätt?

det verkar kompilera och jag får inga fel. men dock verkar det inte som den "minns" det som sparats undan i dessa structar efter det att jag går till en annan funktion och sedan återvänder...detta inte ens om jag lägger extern info *xbee[20];
i alla filerna som finns.

vad gör jag för fel? är det nån som kan detta?

har hållit på och försökt få till detta hur länge som helst nu..

står inget i min bok och jag hittar inte nån sida där de förklarar på ett bra sätt hur man gör. tacksam på förhand.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Re: global array av structar...med pekare..=(

Inlägg av JJ »

Du har väl inte någonstans definierat (dvs tilldelat minne till) själva struktarna? Du har väl bara typedef:at structen och definierat en array av pekare till sådana structar?
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: global array av structar...med pekare..=(

Inlägg av SvenW »

Du har deklarerat en array av pekare.

Kod: Markera allt

info *xbee[20];
Du måste även deklarera data och sätta pekarna dit:

Kod: Markera allt

{
   int i;
   info xbee_data[20];  /* Du kan lägga detta i en extern modul, ej headerfil */
   info *xbee[20];      /* Pekare */

   for (i=0; i<20; i++)
     {
       xbee[i] = &xbee_data[i];
     }
}
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: global array av structar...med pekare..=(

Inlägg av blueint »

Deklaration av static mm kan också inverka hurvida det blir globalt eller inte.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45419
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: global array av structar...med pekare..=(

Inlägg av TomasL »

Kod: Markera allt

typedef struct
{
char va[30];
int id;
int nummer;
}info;
Är inte rätt, ialla fall inte ansi, därmed inte sgt att det fungerar, dock blir det problem med portabiliteten.

Gör så här i stället

Kod: Markera allt

typedef struct _INFO
{
char va[30];
int id;
int nummer;
}info;
Så blir det rätt.
Sedan kan du skapa dina variabler med

Kod: Markera allt

info varInfo;
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43191
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: global array av structar...med pekare..=(

Inlägg av sodjan »

Man brukar väl alltid få göra en malloc (av någon sort) så att man även
får utrymmet i verkligheten, så att säga. Inte bara definitionerna...

Något i stil med :

Kod: Markera allt

typedef struct
{
...
...
}info;

info *varInfo;

varInfo = (struct info *) malloc(sizeof(struct info));
Eller något i den stilen.
Hur det ska se ut med en array of struct får bli hemläxa...
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45419
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: global array av structar...med pekare..=(

Inlägg av TomasL »

I regel "finns" inte MALLOC i C-kompilatorer för uProc, men å andra sida vet vi ju inte vad han utvecklar mot
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: global array av structar...med pekare..=(

Inlägg av speakman »

Vadan denna ständiga typedef? Varför inte bara göra en struct och sedan ange "struct info *varInfo" i koden? Då framgår det ju dessutom tydligare att det är en strukt och inte vilken variabeltyp som helst, och koden blir imo renare och lättare att underhålla om några år när allt är bortglömt.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Re: global array av structar...med pekare..=(

Inlägg av JJ »

sodjan skrev:Man brukar väl alltid få göra en malloc (av någon sort) så att man även
får utrymmet i verkligheten, så att säga. Inte bara definitionerna...
malloc() gör man när man tilldelar minne medans programmet körs. Vad OP förmodligen är ute efter är att tilldela minne compile time. Att tilldela minne compile time för en variabel (statiskt) kallas att definiera. Inte detsamma som att deklarera.

Det är definiera själva variabeln han inte har gjort.

Lite språkpolisande bara :)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: global array av structar...med pekare..=(

Inlägg av speakman »

Förstår heller inte varför han ska ha pekare enbart? Vore inte bättre att definera upp 20 structar direkt vid start? Det vore kanske lämpligt om dude talade om vilken miljö han skriver programmet till. Men både på uC och PC så är det fail att definera upp 20 lösa pekare.
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

Re: global array av structar...med pekare..=(

Inlägg av dude »

oj vad många som svarade =)


okej jag försöker förklara vad som går fel:

allting funkar precis som det ska och jag kan kopiera strängar och spara data och allt vad det är. men problemet som jag hittat nu är att det inte funkar om jag inte kör en malloc varje gång jag kommer in i funktionen.

om jag inte kör malloc varje gång jag går in i funktionen så fungerar inte min strcpy..
om jag endast kör malloc första gången jag går in i funktionen och inte de följande gångerna så får jag bara nollor..
den är ju globalt så då borde jag väl inte behöva köra malloc mer än en gång???



for(o=0; o<10; o++){
strcpy(alpa, xbee[num]->vapen);//här printas det data som till xbeena
beta=alpa[o];
x=x+7;
alphabet(beta,y,x);
}
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: global array av structar...med pekare..=(

Inlägg av speakman »

Du *får* inte köra malloc mer än en gång. Dels får du en ny minnesarea tilldelat varje gång (vilket kan förklara att den inte "kommer ihåg") och dels har du en gigantisk minnesläcka.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43191
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: global array av structar...med pekare..=(

Inlägg av sodjan »

> om jag inte kör en malloc varje gång jag kommer in i funktionen.

Om du gör det *en* gång utanför (i main) funktionen då ?
dude
Inlägg: 142
Blev medlem: 6 juli 2007, 17:39:33
Ort: Umeå

Re: global array av structar...med pekare..=(

Inlägg av dude »

ja la ner det hela eftersom det visade sig vara ganska komplicerat enligt ett dokument som jag hittade (avr-libc-user- manual)
Nerre
Inlägg: 26746
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: global array av structar...med pekare..=(

Inlägg av Nerre »

Typiskt exempel på hur det kan gå om man inte FÖRSTÅR hur en processor fungerar, vad pekare egentligen är och hur minne allokeras.

(Det är ju egentligen lite lustigt att när man programmerar assembler så är det i princip BARA pekare man använder:-)
Skriv svar