arrayer och pekare i C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Nerre
Inlägg: 27235
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: arrayer och pekare i C

Inlägg av Nerre »

Jag gissar att det beror på att i castas till pekare?
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: arrayer och pekare i C

Inlägg av SvenW »

Kod: Markera allt

char text[] = "abcdef";
int i = 4;
char c = i[text];
Tråden börjar bli kul. Det där fungerar!!! Tackar.
Någon som har fler roliga otroliga exempel?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: arrayer och pekare i C

Inlägg av jesse »

märkligt att i[text] blir samma sak som text ... jag ska dock hålla mig till det sistnämnda, om man inte vill göra sitt program totalt oläsligt! :D
Användarvisningsbild
kimmen
Inlägg: 2042
Blev medlem: 25 augusti 2007, 16:53:51
Ort: Stockholm (Kista)

Re: arrayer och pekare i C

Inlägg av kimmen »

Det är ju också kul att man kan skriva rätt så obegripliga deklarationer:

char (*(*x())[5])();

x blir funktionspekare till funktion som returnerar en array av fem funktionspekare till funktioner som returnerar char... :mrgreen: Tur att man slipper använda sånt så ofta... :P

(kolla http://www.cdecl.org/ )
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: arrayer och pekare i C

Inlägg av sodjan »

Ja "kul" är ju en sak.
Om det även "bra" eller en "fördel" är ju en helt annan...
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: arrayer och pekare i C

Inlägg av johano »

Nerre skrev:Jag gissar att det beror på att i castas till pekare?
Nja, jag tror det beror på pekar-array-ekvivalensen i C, där a är ekvivalent med *(a+b).

Om kompilatorn då gör om alla a till formen *(a+b) så ser man ju direkt varför
det fungerar.

/johan
Användarvisningsbild
Ulf
Inlägg: 399
Blev medlem: 15 februari 2006, 14:04:03

Re: arrayer och pekare i C

Inlägg av Ulf »

Jo, det är just det där med att vara lättläst...

Fast pekare till funktioner är mycket användbart!
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: arrayer och pekare i C

Inlägg av Icecap »

Att man kan göra seriösa konstigheter i C är väl ganska välkänd och kan knappast vara en överraskning för vana. Att vissa exempel är till att riva håret över (om man har hår alltså...) är ganska välkänd också - men en bra programmör kan skriva lättläst kod och ska det till konstgrepp som är bortom det mer normala har man ju en massa kommentarer som förklaring.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: arrayer och pekare i C

Inlägg av johano »

SvenW skrev:Tråden börjar bli kul. Det där fungerar!!! Tackar.
Någon som har fler roliga otroliga exempel?
#include kan vara användbart till mycket

Kod: Markera allt

char *countries[] = { 
  #include "countries.txt" 
}; 
Countries.txt:

Kod: Markera allt

"sweden","norway","denmark"
/johan
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: arrayer och pekare i C

Inlägg av jesse »

Nu har jag problem igen med detta.... (se första posten)... eller så är det något annat som spökar.

(AVR GCC):

Jag försöker läsa en sträng från programminnet och ska skriva den strängen till EEPROM.
EEpromadressen ska peka på första strängen i en lista av strängar i EEPROM, dvs en "tvådimensionell array".

Så här ser det ut:

Kod: Markera allt

#include <avr/pgmspace.h>
#include <avr/eeprom.h>

uint8_t PROGMEM StrDefault[] = "default" // strängen i flashminnet
uint8_t EEMEM EE_profilnamn[MAX_ANTAL_PROFILER][PROFILNAMN_LEN]; // en lista i EEPROM
Koden:

Kod: Markera allt

// skriv namnet 'default' i EE_profilnamn[0]
for (uint8_t i = 0; i < sizeof(StrDefault); i++) {                // loopa igenom alla tecken i ordet
	uint8_t tecken = pgm_read_byte(&StrDefault[i]);                // läs en bokstav från Flashminnet
	eeprom_write_byte(&EE_profilnamn[0][i], tecken);               // skriv en bokstav i EEPROM
}
Det verkar inte som om den skriver något alls i närheten av rätt adress...
Så jag funderar på vad det är för fel på &EE_profilnamn[0]
Dessutom, i simulatorn, verkar den läsa bara skräptecken från &StrDefault

jag har bytt ut det mot &EE_profilnamn+i men det blir fortfarande lika fel.

Jag vill ha som resultat att i textsträng nummer 0 i EEPROM ska det stå ordet "default":

EE_profilnamn[0] = "default"; (så här, ungefär)

Kan inte förstå vad jag gör för fel... :cry:
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: arrayer och pekare i C

Inlägg av jesse »

Plötsligt fungerar det, efter att jag startade om AVR Studio 4 :shock:
Jag har inte ändrat något annat!

Kod: Markera allt

// skriv namnet 'default' i EE_profilnamn[0]
	for (uint8_t i = 0; i < sizeof(StrDefault); i++) {
		uint8_t tecken = pgm_read_byte(&StrDefault[i]);
		eeprom_write_byte(&EE_profilnamn[0][i], tecken);
	}
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: arrayer och pekare i C

Inlägg av bearing »

Kör du AVR simulator eller AVR simulator 2?

Jag har märkt att Simulator 2 slutar fungera ibland efter ett längre pass. Simulator verkar inte funka alls om programmet har avbrottsrutiner.

Får hoppas att de får till en bättre simulator i AVR Studio 5. Jag kör fortfarande fyran.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: arrayer och pekare i C

Inlägg av jesse »

I det här fallet var det nog GCC som strulade - felet uppstod nämligen även i AVR-kretsen, inte bara i simulatorn. Skrämmande om GCC inte klarar av arrayer ibland... :shock:

Eller om det är något annat som strulat till sig... Kan ju vara EEMEM och/eller PROGMEM som strular av nån orsak... i så fall hör det väl till AVR-biblioteken.

Jag har faktiskt inte kört simulatorn så ofta sedan jag bytte till AVR Studio 5, men den har varit väldigt slö och konstig. Jag startade simulatorn enbart för att det inte fungerade 'på riktigt' dvs. i AVR-processorn.

Men simulatorn är också kass: Nu t.ex. så kunde den inte komma igång ordentligt utan började med meddelandet "Hittar ingen källkod - vill du köra disassemblern?", Resetfunktionen (knappen i verktygsraden) var inaktiverad så det fungerade inte heller. Och när jag försökte ändra ett värde i EEPROM fick den krupp och slutade visa något alls... "syntax error" stod det bara i minnesfönstret. :doubt:
Skriv svar