Sida 2 av 2
Re: arrayer och pekare i C
Postat: 15 februari 2012, 14:49:06
av Nerre
Jag gissar att det beror på att i castas till pekare?
Re: arrayer och pekare i C
Postat: 15 februari 2012, 15:00:24
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?
Re: arrayer och pekare i C
Postat: 15 februari 2012, 15:02:49
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! 
Re: arrayer och pekare i C
Postat: 15 februari 2012, 15:30:29
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...

Tur att man slipper använda sånt så ofta...
(kolla
http://www.cdecl.org/ )
Re: arrayer och pekare i C
Postat: 15 februari 2012, 15:38:11
av sodjan
Ja "kul" är ju en sak.
Om det även "bra" eller en "fördel" är ju en helt annan...
Re: arrayer och pekare i C
Postat: 15 februari 2012, 15:57:08
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
Re: arrayer och pekare i C
Postat: 15 februari 2012, 15:57:51
av Ulf
Jo, det är just det där med att vara lättläst...
Fast pekare till funktioner är mycket användbart!
Re: arrayer och pekare i C
Postat: 15 februari 2012, 17:46:24
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.
Re: arrayer och pekare i C
Postat: 15 februari 2012, 17:56:20
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:
/johan
Re: arrayer och pekare i C
Postat: 22 februari 2012, 00:21:33
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... 
Re: arrayer och pekare i C
Postat: 22 februari 2012, 00:45:22
av jesse
Plötsligt fungerar det, efter att jag startade om AVR Studio 4

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);
}
Re: arrayer och pekare i C
Postat: 22 februari 2012, 01:23:30
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.
Re: arrayer och pekare i C
Postat: 22 februari 2012, 01:28:07
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...
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.
