Sida 1 av 2

c programeringsfråga

Postat: 29 augusti 2010, 15:52:05
av dude
hejsan

jag har en c programeringsfråga:

char nummer[20]="1234567";

for(i=0; i<6; i++){
strcpy(xbee.effektnr,nummer); ///har blir det fel
}

////////////

typedef struct
{
char effektnr[20];
}info;
extern info xbee[20];

detta funkar inte.
det jag försöker göra är att spara undan "1" i effektnr[1] och "2" i effektnr[2] osv med en forloop.
hur kan jag göra detta?
nån som kan?

Re: c programeringsfråga

Postat: 29 augusti 2010, 15:54:58
av danielr112
Vad funkar inte? Vad för fel får du?

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:05:36
av dude
jag får detta medelande:

warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:18:46
av E85
Kanske funkar om du byter ut strcpy-raden mot

Kod: Markera allt

xbee[i].effektnr[i] = nummer[i];
Fast det blir väldigt märkligt. Är det verkligen en array "effektnr" du vill ha i varje struct?

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:20:43
av rehnmaak
nummer blir en char (dvs ett tal)

gör en pekare istället &nummer så borde det fungera utan kompileringsfel. Men jag förstår inte riktigt vad din funktion gör men du har nog koll på det.

EDIT: läste inte sista raderna i ditt inlägg.

gör såhär:

memset(xbee,0,sizeof(xbee));
for(i=0;i<6;i++)
{
xbee.effektnr[0]=nummer;
}

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:22:27
av snigelen
Jo, eller

Kod: Markera allt

xbee[i].effektnr[0] = nummer[i];
xbee[i].effektnr[1] = '\0';
(Jag har inte tid att vidareutveckla just nu)

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:38:42
av blueint
Du har inte deklarerat xbee endast till vad det är men inget minnesutrymmer för den.
Headerfil för strcpy() saknas.
Byt .. ,nummer);till .. ,&nummer); (kopierar 1234 123 12 1 osv..)

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:47:15
av dude
oj tack för alla svar.

ska genast experimentera lite och kolla vilken som funkar bäst.

kan förklara vad det hela handlar om:
det jag hade tänkt bygga är en handkontroll som ska kunna få kontakt med ett antal mottagare.
när handkontrollen får kontakt/tappar kontakt med de olika mottagarna så ska menysystemet dynamiskt lägga till eller ta bort hittade/tappade mottagare.
informationen från de olika mottagarna ska ligga i handkontrollens minne i en struct.
den delen som jag jonnade med nu var för att lägga till mottagarna dynamiskt i menysystemet.


så i slutändan kommer det se ut ungefär såhär hade jag tänkt.
jag vet inte om man kan dynamiskt skapa structurer såhär medans handkontrollen används. nån som vet? eller är det omöjligt???


for(i=0; i<mottagare; i++){
xbee.effektnr[0] = effektnummer;
//annan info här
}

/////////////////////////////
typedef struct
{
char effektnr[20];
//annan info här
}info;
extern info xbee[mottagare];

Re: c programeringsfråga

Postat: 29 augusti 2010, 16:53:55
av blueint
Länkad-lista.
Antal element nummer + array.

Re: c programeringsfråga

Postat: 29 augusti 2010, 20:41:13
av snigelen
> Du har inte deklarerat xbee endast till vad det är men inget minnesutrymmer för den.

Han påstår att den finns externt definierad, det får vi väl ändå tro på.

> Headerfil för strcpy() saknas.

Jo i citeringen ovan, men det är nog med i det program han kompilerar. (annars borde det väl gnällas för att första argumentet inte är en int?).

> Byt .. ,nummer);till .. ,&nummer); (kopierar 1234 123 12 1 osv..)

Jo det kan man ju göra (well, jag förstår vad du menar, men det blir "tvärt om")

Man kan ju testa. Detta program:

Kod: Markera allt

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

typedef struct
{
	char effektnr[20];
}info;
//extern
info xbee[20];

int main() {
	int i;
	char nummer[20]="1234567";

	printf("%d\n\n", sizeof(xbee));
	for(i=0; i<6; i++){
		strcpy(xbee[i].effektnr, &nummer[i]);
		printf("%s\n", xbee[i].effektnr);
	}
}
ger flöljande utskrift

Kod: Markera allt

400

1234567
234567
34567
4567
567
67
vilket väl var vad jag förväntade mig. (Men inget av de givna förslagen är troligtvis rätt sätt att lösa problemet)

Re: c programeringsfråga

Postat: 29 augusti 2010, 20:48:56
av nablaman
Varför inte bara

for (i=0 ; i<6 ; i++) {
xbee.effektnr[0] = '1' + i;
xbee.effektnr[1] = '\0';
}

Re: c programeringsfråga

Postat: 29 augusti 2010, 21:01:07
av snigelen
Ja nu börjar det likna något. Eller

Kod: Markera allt

for (i=0 ; i<6 ; i++) {
   xbee[i].effektnr = i+1;
}
om man definierar info som

Kod: Markera allt

typedef struct
{
   uint8_t effektnr;
}info;
så sparar man 19 byte per info-element. Men det beror ju lite på vilken info man vill ha i "info" :wink:

Re: c programeringsfråga

Postat: 29 augusti 2010, 21:04:57
av nablaman
Ja, båda lösningarna är korrekta. Den första fungerar om man vill ha effektnr som en sträng, och din om man vill ha effektnr som ett heltal.

EDIT: skrev info, menade effektnr

Re: c programeringsfråga

Postat: 29 augusti 2010, 21:11:01
av snigelen
Ja såklart. Jag menade bara att du var på rätt spår för att få till en lösning, och att kanske nästa steg var att fundera på om det behövs 20 byte i varje effktnr, eller om det räcker med ett heltal, 0-255.(oj vad jag fick tid över när svärfar åkt hem och barnet sover. Nej nu får jag sluta babbla... :))

Re: c programeringsfråga

Postat: 29 augusti 2010, 21:11:26
av dude
jag testade detta efter era tips och det verkar fungera ganska bra.(nedan)
det enda är att det blir 01,02 osv istället för 1,2 osv men det kan jag väl leva med.

precis som nån nämde innan så är detta endast en del av stort program och h filer, annan kod och så vidare har jag inte tagit med för att inte göra det för stort och förvirrande för er.

tack så mycket för all hjälp allihopa!!

snigelen:haha jo jag vet. hade inte tänkte ta och dra ner på den till 3 stycken.
då kan jag ha 999 stycken effektenheter.
men det kan inte vara en int som du antydde eftersom det måste vara en 3 char eftersom det ska skrivas ut på LCD displayen och det kan inte vara int.

en annan fråga dock som jag nämde innan. kan man skriva så här eller??:

typedef struct
{
char effektnr[20];
}info;
extern info xbee[global int här!!];



/////////////////////////denna kod skrev jag ::
int i;
int w=0;
char effektnummer[]="0102030405060708091011121314151617181920";

for(i=0; i<antaleffektenheter; i++){
strcpy(xbee.kod, "E01A01");
xbee.effektnr[0] = effektnummer[w];
xbee.effektnr[1] = effektnummer[(w+1)];
xbee.effektnr[2] = '\0';
w=w+2;
}
}